diff options
author | Max Kostikov <max@kostikov.co> | 2020-11-15 11:09:44 +0100 |
---|---|---|
committer | Max Kostikov <max@kostikov.co> | 2020-11-15 11:09:44 +0100 |
commit | 38985dc4e2a05e4746e1d0fc7bdb09ec55273e54 (patch) | |
tree | 7be5457bcd756985adc7025db9424972f74a4a6c | |
parent | 7cf9b85a97829dc6e11fef4dcafeebe746084c1f (diff) | |
parent | e74c52094f218686c59ddb5f6c186f02158cf89a (diff) | |
download | volse-hubzilla-38985dc4e2a05e4746e1d0fc7bdb09ec55273e54.tar.gz volse-hubzilla-38985dc4e2a05e4746e1d0fc7bdb09ec55273e54.tar.bz2 volse-hubzilla-38985dc4e2a05e4746e1d0fc7bdb09ec55273e54.zip |
Merge branch 'dev' into 'dev'
Dev sync
See merge request kostikov/core!1
33 files changed, 346 insertions, 1386 deletions
@@ -1,4 +1,16 @@ -Hubzilla 5.0 (????-??-??) +Hubzilla 5.0.1 (2020-11-12) + - Fix share title size + - Fix issue where hublocs could get mixed up between different protocols + + Addons + - Pubcrawl: implement authenticated profile fetches which are now partly required in mastodon + - Sse: call xchan_query() just once per item + - Pubcrawl: reject messages where sender is not the author if ld-signature is not ok + + +Hubzilla 5.0 (2020-11-05) + - Remove unmaintained and deprecated schemas + - Deprecate HTML5_Parser library - Implement results caching for public tag and profile categories fetching - Deprecate $a variable for *_plugin_admin() and *_plugin_admin_post() - Support remote host cache directives on profile photo fetching @@ -38,6 +50,9 @@ Hubzilla 5.0 (????-??-??) Bugfixes + - Fix issue where interrupted uploads could not be resumed + - Fix photo sync issue between clones + - Fix issue where profile photos were fetched for unknown channels - Apply channel name changes to all associated xchans - Show unchecked box in connedit if value is false - Reset their_perms before setting new permissions to reflect permission retractions on local hub @@ -50,6 +65,9 @@ Hubzilla 5.0 (????-??-??) - Fix once cached embedded content is used and stored forever Addons + - Pubcrawl: fix issue where http signatures were not verified + - Pubcrawl: fix issue where private keys were lost from storage + - Pubcrawl: add host to signed headers (required by mastodon 3.2.1) - Diaspora: remove relay@relay.iliketoat.net as default relay (it does not exist anymore) - Diaspora: provide UI for admin to configure relay - Diaspora: move the-federation.info registration to statistics addon diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php index 8ea75af61..f24eab773 100644 --- a/Zotlabs/Daemon/Notifier.php +++ b/Zotlabs/Daemon/Notifier.php @@ -4,6 +4,7 @@ namespace Zotlabs\Daemon; use Zotlabs\Lib\Libzot; use Zotlabs\Lib\Activity; +use Zotlabs\Lib\Queue; require_once('include/queue_fn.php'); require_once('include/html2plain.php'); @@ -734,15 +735,17 @@ class Notifier { } if($packet) { - queue_insert(array( - 'hash' => $hash, - 'account_id' => $channel['channel_account_id'], - 'channel_id' => $channel['channel_id'], - 'posturl' => $hub['hubloc_callback'], - 'driver' => $hub['hubloc_network'], - 'notify' => $packet, - 'msg' => (($pmsg) ? json_encode($pmsg) : '') - )); + Queue::insert( + [ + 'hash' => $hash, + 'account_id' => $channel['channel_account_id'], + 'channel_id' => $channel['channel_id'], + 'posturl' => $hub['hubloc_callback'], + 'driver' => $hub['hubloc_network'], + 'notify' => $packet, + 'msg' => (($pmsg) ? json_encode($pmsg) : '') + ] + ); } else { $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : ''); @@ -803,7 +806,7 @@ class Notifier { } } - queue_insert( + Queue::insert( [ 'hash' => $hash, 'account_id' => $target_item['aid'], diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php index 08e5ffaca..5f222754b 100644 --- a/Zotlabs/Lib/Activity.php +++ b/Zotlabs/Lib/Activity.php @@ -104,6 +104,7 @@ class Activity { } else { logger('fetch failed: ' . $url); + logger($x['body']); } return null; } @@ -1018,6 +1019,7 @@ class Activity { if(! $extended) { return $p['xchan_url']; } + $ret = []; $c = ((array_key_exists('channel_id',$p)) ? $p : channelx_by_hash($p['xchan_hash'])); @@ -1063,10 +1065,16 @@ class Activity { ] ]; + $ret['publicKey'] = [ + 'id' => $p['xchan_url'], + 'owner' => $p['xchan_url'], + 'publicKeyPem' => $p['xchan_pubkey'] + ]; + $arr = [ 'xchan' => $p, 'encoded' => $ret ]; call_hooks('encode_person', $arr); - $ret = $arr['encoded']; + $ret = $arr['encoded']; return $ret; } @@ -1485,6 +1493,14 @@ class Activity { if(! is_array($person_obj)) return; + $inbox = $person_obj['inbox']; + + // invalid identity + + if (! $inbox || strpos($inbox,z_root()) !== false) { + return; + } + $name = $person_obj['name']; if(! $name) $name = $person_obj['preferredUsername']; @@ -1532,8 +1548,6 @@ class Activity { $profile = $url; } - $inbox = $person_obj['inbox']; - $collections = []; if($inbox) { diff --git a/Zotlabs/Lib/JSalmon.php b/Zotlabs/Lib/JSalmon.php index 67512046f..48a4e649b 100644 --- a/Zotlabs/Lib/JSalmon.php +++ b/Zotlabs/Lib/JSalmon.php @@ -51,7 +51,7 @@ class JSalmon { . base64url_encode($x['encoding'],true) . '.' . base64url_encode($x['alg'],true); - $key = HTTPSig::get_key(EMPTY_STR,base64url_decode($x['sigs']['key_id'])); + $key = HTTPSig::get_key(EMPTY_STR,'zot6',base64url_decode($x['sigs']['key_id'])); logger('key: ' . print_r($key,true)); if($key['portable_id'] && $key['public_key']) { if(rsa_verify($signed_data,base64url_decode($x['sigs']['value']),$key['public_key'])) { diff --git a/Zotlabs/Lib/LDSignatures.php b/Zotlabs/Lib/LDSignatures.php index 16c8cfc18..2eba66ccf 100644 --- a/Zotlabs/Lib/LDSignatures.php +++ b/Zotlabs/Lib/LDSignatures.php @@ -93,7 +93,8 @@ class LDSignatures { $d = jsonld_normalize($data,[ 'algorithm' => 'URDNA2015', 'format' => 'application/nquads' ]); } catch (\Exception $e) { - logger('normalise error:' . print_r($e,true)); + // Don't log the exception - this can exhaust memory + // logger('normalise error:' . print_r($e,true)); logger('normalise error: ' . print_r($data,true)); } diff --git a/Zotlabs/Lib/Share.php b/Zotlabs/Lib/Share.php index 419e6ed5f..d34c0eaba 100644 --- a/Zotlabs/Lib/Share.php +++ b/Zotlabs/Lib/Share.php @@ -133,7 +133,7 @@ class Share { "' message_id='" . $this->item['mid'] . "']"; if($this->item['title']) - $bb .= '[b]'.$this->item['title'].'[/b]'."\r\n"; + $bb .= '[h3][b]'.$this->item['title'].'[/b][/h3]'."\r\n"; $bb .= (($is_photo) ? $photo_bb . "\r\n" . $this->item['body'] : $this->item['body']); $bb .= "[/share]"; } diff --git a/Zotlabs/Lib/Zotfinger.php b/Zotlabs/Lib/Zotfinger.php index 722e34dfc..e853d6ebc 100644 --- a/Zotlabs/Lib/Zotfinger.php +++ b/Zotlabs/Lib/Zotfinger.php @@ -6,7 +6,7 @@ use Zotlabs\Web\HTTPSig; class Zotfinger { - static function exec($resource,$channel = null) { + static function exec($resource,$channel = null, $verify = true) { if(! $resource) { return false; @@ -41,8 +41,9 @@ class Zotfinger { logger('fetch: ' . print_r($x,true)); if($x['success']) { - - $result['signature'] = HTTPSig::verify($x); + if ($verify) { + $result['signature'] = HTTPSig::verify($x, EMPTY_STR, 'zot6'); + } $result['data'] = json_decode($x['body'],true); diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php index 4bb34b7b7..011bf3ce4 100644 --- a/Zotlabs/Module/Admin/Site.php +++ b/Zotlabs/Module/Admin/Site.php @@ -62,6 +62,9 @@ class Site { $from_email = ((array_key_exists('from_email',$_POST) && trim($_POST['from_email'])) ? trim($_POST['from_email']) : 'Administrator@' . \App::get_hostname()); $from_email_name = ((array_key_exists('from_email_name',$_POST) && trim($_POST['from_email_name'])) ? trim($_POST['from_email_name']) : \Zotlabs\Lib\System::get_site_name()); + + $sse_enabled = ((x($_POST,'sse_enabled')) ? true : false); + $verifyssl = ((x($_POST,'verifyssl')) ? True : False); $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : ''); $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : ''); @@ -151,6 +154,9 @@ class Site { set_config('system','no_community_page', $no_community_page); set_config('system','no_utf', $no_utf); + + set_config('system','sse_enabled', $sse_enabled); + set_config('system','verifyssl', $verifyssl); set_config('system','proxyuser', $proxyuser); set_config('system','proxy', $proxy); @@ -331,6 +337,8 @@ class Site { '$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null), + '$sse_enabled' => array('sse_enabled', t('Enable SSE Notifications'), get_config('system', 'sse_enabled', 0), t('If disabled, traditional polling will be used. Warning: this setting might not be suited for shared hosting')), + '$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""), '$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""), '$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")), diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index 307be048a..dc8e9e1c5 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -60,7 +60,7 @@ class Channel extends Controller { if(Libzot::is_zot_request()) { - $sigdata = HTTPSig::verify(file_get_contents('php://input')); + $sigdata = HTTPSig::verify(file_get_contents('php://input'), EMPTY_STR, 'zot6'); if($sigdata && $sigdata['signer'] && $sigdata['header_valid']) { $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'], 'target_url' => $sigdata['signer'] ])); diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php index 0fc807d42..becf8460d 100644 --- a/Zotlabs/Module/Connedit.php +++ b/Zotlabs/Module/Connedit.php @@ -294,8 +294,8 @@ class Connedit extends Controller { intval($channel['channel_id']) ); if(($pr) && (! intval($orig_record[0]['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'],'system','post_newfriend')))) { - $xarr = array(); - $xarr['verb'] = ACTIVITY_FRIEND; + $xarr = []; + $xarr['item_wall'] = 1; $xarr['item_origin'] = 1; $xarr['item_thread_top'] = 1; @@ -305,17 +305,6 @@ class Connedit extends Controller { $xarr['deny_cid'] = $channel['channel_deny_cid']; $xarr['deny_gid'] = $channel['channel_deny_gid']; $xarr['item_private'] = (($xarr['allow_cid']||$xarr['allow_gid']||$xarr['deny_cid']||$xarr['deny_gid']) ? 1 : 0); - $obj = array( - 'type' => ACTIVITY_OBJ_PERSON, - 'title' => App::$poi['xchan_name'], - 'id' => App::$poi['xchan_hash'], - 'link' => array( - array('rel' => 'alternate', 'type' => 'text/html', 'href' => App::$poi['xchan_url']), - array('rel' => 'photo', 'type' => App::$poi['xchan_photo_mimetype'], 'href' => App::$poi['xchan_photo_l']) - ), - ); - $xarr['obj'] = json_encode($obj); - $xarr['obj_type'] = ACTIVITY_OBJ_PERSON; $xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . App::$poi['xchan_url'] . ']' . App::$poi['xchan_name'] . '[/zrl]'; diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php index 649e753ad..fa9216c97 100644 --- a/Zotlabs/Module/Photos.php +++ b/Zotlabs/Module/Photos.php @@ -210,7 +210,7 @@ class Photos extends \Zotlabs\Web\Controller { if(($m) && ($m[0]['folder'] != $_POST['move_to_album'])) { attach_move($page_owner_uid,argv(2),$_POST['move_to_album']); - $sync = attach_export_data(\App::$data['channel'],argv(2),true); + $sync = attach_export_data(\App::$data['channel'], argv(2), false); if($sync) Libsync::build_sync_packet($page_owner_uid,array('file' => array($sync))); diff --git a/Zotlabs/Module/Sse.php b/Zotlabs/Module/Sse.php index b68fe6705..46b4a8d87 100644 --- a/Zotlabs/Module/Sse.php +++ b/Zotlabs/Module/Sse.php @@ -14,6 +14,7 @@ class Sse extends Controller { public static $ob_hash; public static $sse_id; public static $vnotify; + public static $sse_enabled; function init() { @@ -49,18 +50,86 @@ class Sse extends Controller { $sys = get_sys_channel(); $sleep_seconds = 3; - header("Content-Type: text/event-stream"); - header("Cache-Control: no-cache"); - header("Connection: keep-alive"); - header("X-Accel-Buffering: no"); + self::$sse_enabled = get_config('system', 'sse_enabled', 0); - while(true) { + if(self::$sse_enabled) { - /** - * Update chat presence indication (if applicable) - */ + // Server Sent Events + + header("Content-Type: text/event-stream"); + header("Cache-Control: no-cache"); + header("Connection: keep-alive"); + header("X-Accel-Buffering: no"); + + while(true) { + + if(! self::$sse_id) { + + // Update chat presence indication + + $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1", + dbesc(self::$ob_hash), + dbesc($_SERVER['REMOTE_ADDR']) + ); + $basic_presence = false; + if($r) { + $basic_presence = true; + q("update chatpresence set cp_last = '%s' where cp_id = %d", + dbesc(datetime_convert()), + intval($r[0]['cp_id']) + ); + } + if(! $basic_presence) { + q("insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client) + values( '%s', '%s', '%s', '%s' ) ", + dbesc(self::$ob_hash), + dbesc(datetime_convert()), + dbesc('online'), + dbesc($_SERVER['REMOTE_ADDR']) + ); + } + } + + XConfig::Load(self::$ob_hash); + + $result = XConfig::Get(self::$ob_hash, 'sse', 'notifications', []); + $lock = XConfig::Get(self::$ob_hash, 'sse', 'lock'); + + if($result && !$lock) { + echo "event: notifications\n"; + echo 'data: ' . json_encode($result); + echo "\n\n"; + + XConfig::Set(self::$ob_hash, 'sse', 'notifications', []); + unset($result); + } + + // always send heartbeat to detect disconnected clients + echo "event: heartbeat\n"; + echo 'data: {}'; + echo "\n\n"; + + ob_end_flush(); + flush(); + + if(connection_status() != CONNECTION_NORMAL || connection_aborted()) { + //TODO: this does not seem to be triggered + XConfig::Set(self::$ob_hash, 'sse', 'timestamp', NULL_DATE); + break; + } + + sleep($sleep_seconds); + + } + + } + else { + // Fallback to traditional polling if(! self::$sse_id) { + + // Update chat presence indication + $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1", dbesc(self::$ob_hash), dbesc($_SERVER['REMOTE_ADDR']) @@ -90,29 +159,11 @@ class Sse extends Controller { $lock = XConfig::Get(self::$ob_hash, 'sse', 'lock'); if($result && !$lock) { - echo "event: notifications\n"; - echo 'data: ' . json_encode($result); - echo "\n\n"; - XConfig::Set(self::$ob_hash, 'sse', 'notifications', []); - unset($result); - } - - // always send heartbeat to detect disconnected clients - echo "event: heartbeat\n"; - echo 'data: {}'; - echo "\n\n"; - - ob_end_flush(); - flush(); - - if(connection_status() != CONNECTION_NORMAL || connection_aborted()) { - //TODO: this does not seem to be triggered - XConfig::Set(self::$ob_hash, 'sse', 'timestamp', NULL_DATE); - break; + json_return_and_die($result); } - sleep($sleep_seconds); + killme(); } diff --git a/Zotlabs/Module/Sse_bs.php b/Zotlabs/Module/Sse_bs.php index e3439e7dd..287c24829 100644 --- a/Zotlabs/Module/Sse_bs.php +++ b/Zotlabs/Module/Sse_bs.php @@ -129,8 +129,9 @@ class Sse_bs extends Controller { call_hooks('update_unseen',$x); if($x['update'] === 'unset' || intval($x['update'])) { - q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND mid in (". $str . ") AND item_unseen = 1", - intval(self::$uid) + q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND mid in (%s) AND item_unseen = 1", + intval(self::$uid), + $str // this is dbesc() in the above foreach loop ); } diff --git a/Zotlabs/Module/Zot_probe.php b/Zotlabs/Module/Zot_probe.php index 648ed2175..7585affdf 100644 --- a/Zotlabs/Module/Zot_probe.php +++ b/Zotlabs/Module/Zot_probe.php @@ -34,7 +34,7 @@ class Zot_probe extends \Zotlabs\Web\Controller { $o .= '<pre>' . htmlspecialchars($x['header']) . '</pre>' . EOL; - $o .= 'verify returns: ' . str_replace("\n",EOL,print_r(HTTPSig::verify($x),true)) . EOL; + $o .= 'verify returns: ' . str_replace("\n",EOL,print_r(HTTPSig::verify($x, EMPTY_STR, 'zot6'),true)) . EOL; $o .= '<pre>' . htmlspecialchars(json_encode(json_decode($x['body']),JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)) . '</pre>' . EOL; diff --git a/Zotlabs/Update/_1239.php b/Zotlabs/Update/_1239.php new file mode 100644 index 000000000..ed8de30bb --- /dev/null +++ b/Zotlabs/Update/_1239.php @@ -0,0 +1,27 @@ +<?php + +namespace Zotlabs\Update; + +class _1239 { + + function run() { + + dbq("START TRANSACTION"); + + // remove broken activitypub hubloc entries + $r = dbq("DELETE FROM hubloc WHERE hubloc_network = 'activitypub' and hubloc_callback = ''"); + + // remove broken hubloc entries from friendica + $r1 = dbq("DELETE FROM hubloc WHERE hubloc_hash = ''"); + + if($r && $r1) { + dbq("COMMIT"); + return UPDATE_SUCCESS; + } + + dbq("ROLLBACK"); + return UPDATE_FAILED; + + } + +} diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php index 827e0d779..42426afb1 100644 --- a/Zotlabs/Web/HTTPSig.php +++ b/Zotlabs/Web/HTTPSig.php @@ -76,7 +76,7 @@ class HTTPSig { // See draft-cavage-http-signatures-10 - static function verify($data,$key = '') { + static function verify($data,$key = '', $keytype = '') { $body = $data; $headers = null; @@ -151,7 +151,7 @@ class HTTPSig { $result['signer'] = $sig_block['keyId']; - $key = self::get_key($key,$result['signer']); + $key = self::get_key($key,$keytype,$result['signer']); if(! ($key && $key['public_key'])) { return $result; @@ -162,13 +162,26 @@ class HTTPSig { logger('verified: ' . $x, LOGGER_DEBUG); if(! $x) { - logger('verify failed for ' . $result['signer'] . ' alg=' . $algorithm . (($key['public_key']) ? '' : ' no key')); - $sig_block['signature'] = base64_encode($sig_block['signature']); - logger('affected sigblock: ' . print_r($sig_block,true)); - logger('signed_data: ' . print_r($signed_data,true)); - logger('headers: ' . print_r($headers,true)); - logger('server: ' . print_r($_SERVER,true)); - return $result; + + // try again, ignoring the local actor (xchan) cache and refetching the key + // from its source + + $fkey = self::get_key($key,$keytype,$result['signer'],true); + + if ($fkey && $fkey['public_key']) { + $y = rsa_verify($signed_data,$sig_block['signature'],$fkey['public_key'],$algorithm); + logger('verified: (cache reload) ' . $x, LOGGER_DEBUG); + } + + if (! $y) { + logger('verify failed for ' . $result['signer'] . ' alg=' . $algorithm . (($fkey['public_key']) ? '' : ' no key')); + $sig_block['signature'] = base64_encode($sig_block['signature']); + logger('affected sigblock: ' . print_r($sig_block,true)); + logger('headers: ' . print_r($headers,true)); + logger('server: ' . print_r($_SERVER,true)); + return $result; + } + } $result['portable_id'] = $key['portable_id']; @@ -187,12 +200,17 @@ class HTTPSig { } logger('Content_Valid: ' . (($result['content_valid']) ? 'true' : 'false')); + if (! $result['content_valid']) { + logger('invalid content signature: data ' . print_r($data,true)); + logger('invalid content signature: headers ' . print_r($headers,true)); + logger('invalid content signature: body ' . print_r($body,true)); + } } return $result; } - static function get_key($key,$id) { + static function get_key($key,$keytype,$id) { if($key) { if(function_exists($key)) { @@ -201,6 +219,13 @@ class HTTPSig { return [ 'public_key' => $key ]; } + if($keytype === 'zot6') { + $key = self::get_zotfinger_key($id,$force); + if($key) { + return $key; + } + } + if(strpos($id,'#') === false) { $key = self::get_webfinger_key($id); } @@ -243,7 +268,7 @@ class HTTPSig { $url = ((strpos($id,'#')) ? substr($id,0,strpos($id,'#')) : $id); - $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s'", + $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' and hubloc_network in ('zot6', 'activitypub')", dbesc(str_replace('acct:','',$url)), dbesc($url) ); @@ -303,18 +328,15 @@ class HTTPSig { return (($key['public_key']) ? $key : false); } - function get_zotfinger_key($id) { - $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s'", + $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_addr = '%s' or hubloc_id_url = '%s' and hubloc_network = 'zot6'", dbesc(str_replace('acct:','',$id)), dbesc($id) ); - $x = Libzot::zot_record_preferred($x); - - if($x && $x['xchan_pubkey']) { - return [ 'portable_id' => $x['xchan_hash'], 'public_key' => $x['xchan_pubkey'] , 'hubloc' => $x ]; + if($x && $x[0]['xchan_pubkey']) { + return [ 'portable_id' => $x[0]['xchan_hash'], 'public_key' => $x[0]['xchan_pubkey'] , 'hubloc' => $x[0] ]; } $wf = Webfinger::exec($id); @@ -330,13 +352,18 @@ class HTTPSig { continue; } if($l['rel'] === 'http://purl.org/zot/protocol/6.0' && array_key_exists('href',$l) && $l['href'] !== EMPTY_STR) { - $z = \Zotlabs\Lib\Zotfinger::exec($l['href']); + + // The third argument to Zotfinger::exec() tells it not to verify signatures + // Since we're inside a function that is fetching keys with which to verify signatures, + // this is necessary to prevent infinite loops. + + $z = \Zotlabs\Lib\Zotfinger::exec($l['href'],null,false); if($z) { $i = Libzot::import_xchan($z['data']); if($i['success']) { $key['portable_id'] = $i['hash']; - $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1", + $x = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' and hubloc_network = 'zot6'", dbesc($l['href']) ); if($x) { @@ -485,7 +512,6 @@ class HTTPSig { if(preg_match('/iv="(.*?)"/ism',$header,$matches)) $header = self::decrypt_sigheader($header); - if(preg_match('/keyId="(.*?)"/ism',$header,$matches)) $ret['keyId'] = $matches[1]; if(preg_match('/algorithm="(.*?)"/ism',$header,$matches)) diff --git a/Zotlabs/Zot6/Receiver.php b/Zotlabs/Zot6/Receiver.php index 9e70ab318..a9a7ab0df 100644 --- a/Zotlabs/Zot6/Receiver.php +++ b/Zotlabs/Zot6/Receiver.php @@ -155,7 +155,7 @@ class Receiver { $result = false; - $this->sigdata = HTTPSig::verify($this->rawdata); + $this->sigdata = HTTPSig::verify($this->rawdata, EMPTY_STR, 'zot6'); if ($this->sigdata && $this->sigdata['header_signed'] && $this->sigdata['header_valid']) { $result = true; @@ -50,10 +50,10 @@ require_once('include/attach.php'); require_once('include/bbcode.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '5.1.2' ); +define ( 'STD_VERSION', '5.1.5' ); define ( 'ZOT_REVISION', '6.0' ); -define ( 'DB_UPDATE_VERSION', 1238 ); +define ( 'DB_UPDATE_VERSION', 1239 ); define ( 'PROJECT_BASE', __DIR__ ); @@ -1207,6 +1207,7 @@ class App { '$metas' => self::$meta->get(), '$plugins' => $x['header'], '$update_interval' => $interval, + '$sse_enabled' => get_config('system', 'sse_enabled', 0), '$head_css' => head_get_css(), '$head_js' => head_get_js(), '$linkrel' => head_get_links(), diff --git a/include/attach.php b/include/attach.php index 80f71b9ea..c9649a4ce 100644 --- a/include/attach.php +++ b/include/attach.php @@ -2807,6 +2807,12 @@ function save_chunk($channel,$start,$end,$len) { $new_path = $new_base . '/' . $_FILES['files']['name']; + if(file_exists($new_path) && intval($start) === 0) { + $result['partial'] = true; + $result['length'] = intval(filesize($new_path)); + return $result; + } + if(! file_exists($new_path)) { rename($tmp_path,$new_path); } diff --git a/include/import.php b/include/import.php index 910cb8be7..82c23e116 100644 --- a/include/import.php +++ b/include/import.php @@ -210,17 +210,24 @@ function import_hublocs($channel, $hublocs, $seize, $moving = false) { if($channel && $hublocs) { foreach($hublocs as $hubloc) { - $hash = make_xchan_hash($hubloc['hubloc_guid'],$hubloc['hubloc_guid_sig']); - if($hubloc['hubloc_network'] === 'zot' && $hash !== $hubloc['hubloc_hash']) { - logger('forged hubloc: ' . print_r($hubloc,true)); - continue; - } + // verify the hash. We can only do this if we already stored the xchan corresponding to this hubloc + // as we need the public key from there - if(! array_key_exists('hubloc_primary',$hubloc)) { - $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0); - $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0); - $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0); - $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0); + if ($hubloc['hubloc_network'] === 'zot6') { + $x = q("select xchan_pubkey from xchan where xchan_guid = '%s' and xchan_hash = '%s'", + dbesc($hubloc['hubloc_guid']), + dbesc($hubloc['hubloc_hash']) + ); + + if (! $x) { + logger('hubloc could not be verified. ' . print_r($hubloc,true)); + continue; + } + $hash = Libzot::make_xchan_hash($hubloc['hubloc_guid'],$x[0]['xchan_pubkey']); + if ($hash !== $hubloc['hubloc_hash']) { + logger('forged hubloc: ' . print_r($hubloc,true)); + continue; + } } if($moving && $hubloc['hubloc_hash'] === $channel['channel_hash'] && $hubloc['hubloc_url'] !== z_root()) { @@ -228,17 +235,17 @@ function import_hublocs($channel, $hublocs, $seize, $moving = false) { } $arr = [ - 'guid' => $hubloc['hubloc_guid'], - 'guid_sig' => $hubloc['hubloc_guid_sig'], - 'url' => $hubloc['hubloc_url'], - 'url_sig' => $hubloc['hubloc_url_sig'], - 'sitekey' => ((array_key_exists('hubloc_sitekey',$hubloc)) ? $hubloc['hubloc_sitekey'] : '') + 'id' => $hubloc['hubloc_guid'], + 'id_sig' => $hubloc['hubloc_guid_sig'], + 'location' => $hubloc['hubloc_url'], + 'location_sig' => $hubloc['hubloc_url_sig'] ]; - if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize)) + if (($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize)) { $hubloc['hubloc_primary'] = 0; + } - if(($x = zot_gethub($arr,false)) === false) { + if (($x = Libzot::gethub($arr,false)) === false) { unset($hubloc['hubloc_id']); hubloc_store_lowlevel($hubloc); } @@ -1333,7 +1340,7 @@ function sync_files($channel, $files) { 'time' => $time, 'resource' => $att['hash'], 'revision' => 0, - 'signature' => base64url_encode(rsa_sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey'])) + 'signature' => Libzot::sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey']) ); $store_path = $newfname; @@ -1419,7 +1426,7 @@ function sync_files($channel, $files) { 'time' => $time, 'resource' => $p['resource_id'], 'revision' => 0, - 'signature' => base64url_encode(rsa_sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey'])), + 'signature' => Libzot::sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey']), 'resolution' => intval($p['imgscale']) ); diff --git a/include/network.php b/include/network.php index 4457f59bc..bcd66cf85 100644 --- a/include/network.php +++ b/include/network.php @@ -2,6 +2,7 @@ use Zotlabs\Lib\Zotfinger; use Zotlabs\Lib\Libzot; +use Zotlabs\Lib\Queue; /** * @file include/network.php @@ -1333,14 +1334,15 @@ function fetch_xrd_links($url) { */ function scrape_feed($url) { - require_once('library/HTML5/Parser.php'); $ret = array(); $level = 0; $x = z_fetch_url($url,false,$level,array('novalidate' => true)); - if(! $x['success']) + if(! $x['success']) { + logger('ERROR fetching URL'); return $ret; + } $headers = $x['header']; $code = $x['return_code']; @@ -1374,17 +1376,16 @@ function scrape_feed($url) { } } + $dom = new DOMDocument(); try { - $dom = HTML5_Parser::parse($s); + $dom->loadHTML( $s); } catch (DOMException $e) { - logger('Parse error: ' . $e); - } - - if(! $dom) { - logger('Failed to parse.'); + logger('Feed parse error: ' . $e); + // logger('Feed parse ERROR: ' . libxml_get_last_error()->message); return $ret; } + $head = $dom->getElementsByTagName('base'); if($head) { foreach($head as $head0) { @@ -1437,10 +1438,10 @@ function do_delivery($deliveries, $force = false) { $x = q("select count(outq_hash) as total from outq where outq_delivered = 0"); - if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',300)) && (! $force)) { + if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',3000)) && (! $force)) { logger('immediate delivery deferred.', LOGGER_DEBUG, LOG_INFO); foreach($deliveries as $d) { - update_queue_item($d); + Queue::update($d); } return; } @@ -1846,15 +1847,15 @@ function probe_api_path($host) { function scrape_vcard($url) { - require_once('library/HTML5/Parser.php'); - $ret = array(); logger('url=' . $url); $x = z_fetch_url($url); - if(! $x['success']) + if(! $x['success']) { + logger('ERROR fetching URL'); return $ret; + } $s = $x['body']; @@ -1871,14 +1872,14 @@ function scrape_vcard($url) { } } + $dom = new DOMDocument(); try { - $dom = HTML5_Parser::parse($s); + $dom->loadHTML( $s); } catch (DOMException $e) { - logger('Parse error: ' . $e); - } - - if(! $dom) + logger('hCard parse error: ' . $e); + // logger('hCard fetch ERROR: ' . libxml_get_last_error()->message); return $ret; + } // Pull out hCard profile elements diff --git a/include/text.php b/include/text.php index a300ccf58..58cde7838 100644 --- a/include/text.php +++ b/include/text.php @@ -672,7 +672,7 @@ function bt_syslog($msg, $priority = LOG_INFO) { for($x = 1; $x < count($stack); $x ++) { $s = 'stack: ' . basename($stack[$x]['file']) . ':' . $stack[$x]['line'] . ':' . $stack[$x]['function'] . '()'; openlog("bt-log", LOG_PID | LOG_PERROR, LOG_LOCAL0); - syslog($priority, $msg); + syslog($priority, $s); closelog(); } } diff --git a/include/zot.php b/include/zot.php index 8a2177de7..d61873ba2 100644 --- a/include/zot.php +++ b/include/zot.php @@ -3452,7 +3452,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { $x = q("select count(outq_hash) as total from outq where outq_delivered = 0"); - if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',300))) { + if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',3000))) { logger('immediate delivery deferred.', LOGGER_DEBUG, LOG_INFO); update_queue_item($hash); continue; @@ -4286,7 +4286,7 @@ function zot_reply_message_request($data) { $x = q("select count(outq_hash) as total from outq where outq_delivered = 0"); - if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',300))) { + if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',3000))) { logger('immediate delivery deferred.', LOGGER_DEBUG, LOG_INFO); update_queue_item($hash); continue; diff --git a/view/js/main.js b/view/js/main.js index fb7bcb52f..560868046 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -31,6 +31,7 @@ var sse_offset = 0; var sse_type; var sse_partial_result = false; var sse_rmids = []; +var sse_fallback_interval; var page_cache = {}; @@ -94,37 +95,56 @@ $(document).ready(function() { jQuery.timeago.settings.allowFuture = true; - if(typeof(window.SharedWorker) === 'undefined') { - // notifications with multiple tabs open will not work very well in this scenario - var evtSource = new EventSource('/sse'); - evtSource.addEventListener('notifications', function(e) { - var obj = JSON.parse(e.data); - sse_handleNotifications(obj, false, false); - }, false); + if(sse_enabled) { + if(typeof(window.SharedWorker) === 'undefined') { + // notifications with multiple tabs open will not work very well in this scenario + var evtSource = new EventSource('/sse'); - document.addEventListener('visibilitychange', function() { - if (!document.hidden) { - sse_offset = 0; - sse_bs_init(); - } - }, false); + evtSource.addEventListener('notifications', function(e) { + var obj = JSON.parse(e.data); + sse_handleNotifications(obj, false, false); + }, false); - } - else { - var myWorker = new SharedWorker('/view/js/sse_worker.js', localUser); + document.addEventListener('visibilitychange', function() { + if (!document.hidden) { + sse_offset = 0; + sse_bs_init(); + } + }, false); - myWorker.port.onmessage = function(e) { - obj = e.data; - console.log(obj); - sse_handleNotifications(obj, false, false); } + else { + var myWorker = new SharedWorker('/view/js/sse_worker.js', localUser); - myWorker.onerror = function(e) { - myWorker.port.close(); + myWorker.port.onmessage = function(e) { + obj = e.data; + console.log(obj); + sse_handleNotifications(obj, false, false); + } + + myWorker.onerror = function(e) { + myWorker.port.close(); + } + + myWorker.port.start(); } + } + else { + if (!document.hidden) + sse_fallback_interval = setInterval(sse_fallback, updateInterval); + + document.addEventListener('visibilitychange', function() { + if (document.hidden) { + clearInterval(sse_fallback_interval); + } + else { + sse_offset = 0; + sse_bs_init(); + sse_fallback_interval = setInterval(sse_fallback, updateInterval); + } - myWorker.port.start(); + }, false); } $('.notification-link').on('click', { replace: true, followup: false }, sse_bs_notifications); @@ -224,6 +244,8 @@ $(document).ready(function() { cache_next_page(); }); + + }); function getConversationSettings() { @@ -1763,8 +1785,6 @@ function sse_bs_init() { } function sse_bs_counts() { - - if(sse_bs_active) return; @@ -1868,7 +1888,9 @@ function sse_handleNotifications(obj, replace, followup) { } else { $('.' + type + '-update').html('0'); - $('.' + type + '-button').fadeOut(); + $('.' + type + '-button').fadeOut(function() { + sse_setNotificationsStatus(); + }); } if(obj[type].notifications.length) sse_handleNotificationsItems(type, obj[type].notifications, replace, followup); @@ -2020,3 +2042,15 @@ function sse_setNotificationsStatus() { } } + +function sse_fallback() { + $.get('/sse', function(obj) { + if(! obj) + return; + + console.log('sse fallback'); + console.log(obj); + + sse_handleNotifications(obj, false, false); + }); +} diff --git a/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).css b/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).css deleted file mode 100644 index ab819d774..000000000 --- a/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).css +++ /dev/null @@ -1,322 +0,0 @@ -.generic-content-wrapper { - border: 1px solid #fff; - background-color: transparent; -} - -.vcard, #contact-block, .widget { - background-color: transparent; - border: none; - border-bottom: 1px solid #fff; -} - -.abook-pending-contact, .abook-permschange { - background: #fff; -} - -#cboxContent a { - color: #fff; -} - -#cboxContent { - color: #fff; -} - -#adminpage table tr:hover { - background-color: #fff; -} - -#colorbox { - border: 0px solid #fff; - background-color: #fff; -} - -.chat-item-text { - background-color: #fff; -} - -.fc-state-highlight { - background: none repeat scroll 0% 0% #fff !important; -} - -.well { - background-color: #fff; - border: 1px solid #000; - background-image: linear-gradient(to bottom, #fff 0px, #fff 100%); -} - -.alert-info { - color: #000; - background-color:#fff; - border-color: #000; - background-image: linear-gradient(to bottom, #fff 0px, #fff 100%); -} - -#acl-select { - border: 1px solid #000; - color: #000; -} - -.acl-list-item { - border: 1px solid #000; - background-color: #FFF; - -} - -.abook-self { - border: 1px solid #EEE; - color: #ccc; - background-color: #EEE; -} - -.acl-button-show, -.acl-button-hide { - color: #000; -} - -#acl-list { - border: 1px solid #fff; -} - -.modal-content { - background-color: #fff; -} - -a.btn, aside a { - font-weight: 400 !important; -} - -.btn-default { - background-color: #fff; - border-color: #000; - color: #111; - text-shadow: none; - box-shadow: none; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active .btn-default.active { - background-color: #fff; - border-color: #000; - color: #000; - text-decoration: underline; -} - -.btn-default.btn-sm:hover, .btn-default.btn-sm:focus, .btn-default.btn-sm:active .btn-default.btn-sm.active { - text-decoration: none; -} - -.pager_first, -.pager_last, -.pager_prev, -.pager_next, -.pager-prev, -.pager-next, -.pager_n { - border: 1px solid #000; - background: #fff; -} - -input { - border: 1px solid #000; -} - -input[type="submit"] { - background-color: #fff; - color: #000; -} - -.notify-seen a { - background: #fff; - color: #fff !important; -} - -.notify-seen a:hover { - background: #fff; - color: #000 !important; -} - -nav .dropdown-menu>li>a{ - color: #000; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{ - color: #000; - background-color: #F5F5F5; - background-image: none; -} - -nav .dropdown-menu .divider{ - background-color: #F5F5F5; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{ - color: #000; - background-color: #F5F5F5; - background-image: none; -} - -nav .dropdown-menu { - background-color: #fff; -} - -a.rateme, div.rateme { - border: 1px solid #fff; -} - -#nav-search-text { - background-color: #F5F5F5; -} - -.autocomplete .selected { - background: #F5F5F5; -} - -.nav-tabs{ - border-bottom:1px solid #000; -} - -.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{ - border:1px solid #000; -} - -.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus { - color: #000; - background-color: #fff; -} - -.nav-tabs.nav-justified > li > a { - color: #000; -} - -.nav-tabs > li > a:hover, .nav-tabs > li > a:focus { - text-decoration: underline; - background-color: #fff; - color: #000; -} - -aside .nav > li > a:hover, aside .nav > li > a:focus { - text-decoration: underline; - background-color: #F5F5F5; -} - -.list-group-item { - background-color: #F5F5F5; -} - -a, a:visited, a:link, .fakelink, .fakelink:visited, .fakelink:link { - font-weight: bold; -} - -.group-selected, .fileas-selected, .categories-selected, .search-selected, a.active { - color: #000 !important; - text-decoration: underline !important; -} - -.generic-content-wrapper-styled { - background-color: rgba(255,255,255,0.8); -} - -.autocomplete { - background: #fff; -} - -blockquote { - background-color: #fff; - border-left: 3px solid #000; - color: #111; -} - -code { - border: 1px solid #000; - background: #fff; - color: #000; -} - -pre { - background: #fff; - color: #111; - border:1px solid #000; -} - -.notif-item a { - color: #000; -} - -.notif-item a:hover { - color: #000; -} - -.dropdown-menu { - background-color: #fff; -} - -.dropdown-menu >li > a { - color: #000; -} - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #000; - background-color: #F5F5F5; - background-image: none; -} - -.open .dropdown-toggle.btn-default { - color: #000; - background-color: #fff; - border-color: #fff; -} - -.preview { - background: url('../img/gray_and_white_diagonal_stripes_background_seamless.gif'); -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #000; - } -} - -#profile-jot-wrapper { - background-color: inherit; - border: none; -} - -.nav-tabs.nav-justified { - background-color: inherit; - border: none; -} - -.help-content { - border-bottom: #000 thin solid; -} - -.help-content-open { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -.contextual-help-content-open { - background: #FFF; -} - -.profile-match-wrapper { - width: 150px; - height: 120px; - border: none; -} - -.profile-match-name { - width: 144px; - white-space: nowrap; - text-overflow: ellipsis; -} - -.widget-nav-pills-icons:hover + a { - background-color: #F5F5F5; -} - -.widget-nav-pills-checkbox:hover + a { - background-color: #F5F5F5; -} - diff --git a/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).php b/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).php deleted file mode 100644 index 554e832f0..000000000 --- a/view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - - if (! $nav_bg) - $nav_bg = "#fff"; - if (! $nav_gradient_top) - $nav_gradient_top = "#fff"; - if (! $nav_gradient_bottom) - $nav_gradient_bottom = "#fff"; - if (! $nav_active_gradient_top) - $nav_active_gradient_top = "#fff"; - if (! $nav_active_gradient_bottom) - $nav_active_gradient_bottom = "#fff"; - if (! $nav_bd) - $nav_bd = "#fff"; - if (! $nav_icon_colour) - $nav_icon_colour = "#111"; - if (! $nav_active_icon_colour) - $nav_active_icon_colour = "#000"; - if (! $banner_colour) - $banner_colour = "#fff"; - if (! $link_colour) - $link_colour = "#000"; - if (! $bgcolour) - $bgcolour = "#fff"; - if (! $toolicon_colour) - $toolicon_colour = "#111"; - if (! $toolicon_activecolour) - $toolicon_activecolour = "#000"; - if (! $item_colour) - $item_colour = "rgba(255,255,255,0.8)"; - if (! $comment_item_colour) - $comment_item_colour = "rgba(255,255,255,0.4)"; - if (! $comment_border_colour) - $comment_border_colour = "rgba(255,255,255,0.8)"; - if (! $font_colour) - $font_colour = "#000"; - if (! $converse_width) - $converse_width = "1024"; - - - - diff --git a/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).css b/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).css deleted file mode 100644 index c8ea87050..000000000 --- a/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).css +++ /dev/null @@ -1,408 +0,0 @@ -.generic-content-wrapper { - border: 1px solid #000; - background-color: transparent; -} - -textarea, input, select -{ - color: $font_colour !important; - background: $bgcolour !important; - border: 1px solid #143D12 !important; - } - -#profile-jot-submit-wrapper { - border-top: none; - padding: 10px 0; -} - -#jot-title-wrap { - border-bottom: none; - margin-bottom: 5px; -} - -optgroup { - color: #32962D !important; -} - -option { - color: $link_colour !important; -} - -.vcard, #contact-block, .widget { - background-color: transparent; - border: none; - border-bottom: 1px solid #fff; -} - -.abook-pending-contact, .abook-permschange { - background: #000; -} - -#cboxContent a { - color: #000; -} - -#cboxContent { - color: #000; -} - -#adminpage table tr:hover { - background-color: #000; -} - -#colorbox { - border: 0px solid #000; - background-color: #000; -} - -.chat-item-text { - background-color: #000; -} - -.fc-state-highlight { - background: none repeat scroll 0% 0% #000 !important; -} - -.well { - background-color: #000; - border: 1px solid #143D12; - background-image: linear-gradient(to bottom, #000 0px, #000 100%); -} - -.alert-info { - color: #50f148; - background-color:#000; - border-color: #143D12; - background-image: linear-gradient(to bottom, #000 0px, #000 100%); -} - -.section-content-info-wrapper { - color: #50f148; - background-color:#000; - border: 1px solid #143D12 !important; -} - -.modal-header { - border-bottom: 1px solid #143D12; -} - -.modal-footer { - border-top: 1px solid #143D12; -} - -#acl-select { - background-color: #000; - border: 1px solid #143D12; - color: #50f148; -} - -.abook-self { - color: #333; - background-color: #000 !important; - border: 1px solid #111; -} - -.acl-button-show, -.acl-button-hide { - color: #fff; -} - -#acl-list { - border: 1px solid #143D12; -} - -#acl-search-wrapper { - border-bottom: 1px solid #143D12; -} - -.acl-list-item { - border: 1px solid #111; - background-color:#111; - -} - -.modal-content { - background-color: #000; -} - -a.btn, aside a { - font-weight: 400 !important; -} - -.btn-default { - background-color: #000; - border-color: #143D12; - color: #32962D; - text-shadow: none; - box-shadow: none; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active .btn-default.active { - background-color: #000; - border-color: #143D12; - color: #50f148; - text-decoration: underline; -} - -.btn-default.btn-sm:hover, .btn-default.btn-sm:focus, .btn-default.btn-sm:active .btn-default.btn-sm.active { - text-decoration: none; -} - -.pager_first, -.pager_last, -.pager_prev, -.pager_next, -.pager-prev, -.pager-next, -.pager_n { - border: 1px solid #143D12; - background: #000; -} - -input { - border: 1px solid #143D12; -} - -input[type="submit"] { - background-color: #000; - color: #50f148; -} - -.notify-seen a { - background: #000; - color: #000 !important; -} - -.notify-seen a:hover { - background: #000; - color: #50f148 !important; -} - -nav .dropdown-menu>li>a { - color: #50f148; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus { - color: #50f148; - background-color: #143D12; - background-image: none; -} - - -nav .dropdown-menu .divider { - background-color: #143D12; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus { - color: #50f148; - background-color: #143D12; - background-image: none; -} - -nav .dropdown-menu { - background-color: #000; -} - -.rconnect { - color: #50f148; -} - -a.rateme, div.rateme { - color: #50f148; - border: 1px solid #000; -} - -a.rconnect, a.rateme, div.rateme { - color: #50f148; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #50f148; -} - -#nav-search-text { - background-color: #000; -} - -.autocomplete .selected { - background: #000; -} - -.nav-tabs{ - border-bottom:1px solid #143D12; -} - -.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{ - border:1px solid #143D12; -} - -.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus { - color: #46D43F; - background-color: #000; -} - -.nav-tabs.nav-justified > li > a { - color: #50f148; -} - -.nav-tabs > li > a:hover, .nav-tabs > li > a:focus { - text-decoration: underline; - background-color: #000; - color: #50f148; - border-color: #143D12; -} - -aside .nav > li > a:hover, aside .nav > li > a:focus { - text-decoration: underline; - background-color: #143D12; -} - -.list-group-item { - background-color: #143D12; -} - -a, a:visited, a:link, .fakelink, .fakelink:visited, .fakelink:link { - font-weight: bold; -} - -.group-selected, .fileas-selected, .categories-selected, .search-selected, a.active { - color: #50f148 !important; - text-decoration: underline !important; -} - -.generic-content-wrapper-styled { - background-color: rgba(0,0,0,0.8); -} - -.autocomplete { - background: #000; -} - -blockquote { - background-color: #000; - border-left: 3px solid #143D12; - color: #32962D; -} - -code { - border: 1px solid #143D12; - background: #000; - color: #32962D; -} - -pre { - background: #000; - color: #32962D; - border:1px solid #143D12; -} - -.notif-item a { - color: #50f148; -} - -.notif-item a:hover { - color: #50f148; -} - -.dropdown-menu { - background-color: #000; -} - -.dropdown-menu >li > a { - color: #32962D; -} - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #50f148; - background-color: #143D12; - background-image: none; -} - -.open .dropdown-toggle.btn-default, .open .dropdown-toggle.btn-default:focus { - color: #50f148; - background-color: #000; - border-color: #143D12; -} - -.preview { - background: url('../img/gray_and_black_diagonal_stripes_background_seamless.gif'); -} - - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #143D12; - } -} - -#profile-jot-wrapper { - background-color: inherit; - border: none; -} - -.nav-tabs.nav-justified { - background-color: inherit; - border: none; -} - -.table-striped > tbody > tr:nth-of-type(2n+1) { - background-color: #000; -} - -.table-hover > tbody > tr:hover { - background-color: #143D12; -} - -.table > tbody > tr > td { - border-color: #143D12; -} - -.help-content { - border-bottom: #143D12 thin solid; -} - -.help-content-open { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.contextual-help-content-open { - background: $nav_bg; - border-bottom: #1C5419 1px solid; - box-shadow: 0px 3px 3px rgba(28,84,25,0.2); -} - -.contextual-help-tool { - opacity: 0.5; -} - -.contextual-help-tool:hover { - opacity: 1; -} - -.contextual-help-tool i { - color: $link_colour; -} - -.profile-match-wrapper { - width: 150px; - height: 120px; - border: none; -} - -.profile-match-name { - width: 144px; - white-space: nowrap; - text-overflow: ellipsis; -} - -.widget-nav-pills-icons:hover + a { - background-color: #143D12; -} - -.widget-nav-pills-checkbox:hover + a { - background-color: #143D12; -} diff --git a/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).php b/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).php deleted file mode 100644 index 8192180db..000000000 --- a/view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - - if (! $nav_bg) - $nav_bg = "#000"; - if (! $nav_gradient_top) - $nav_gradient_top = "#000"; - if (! $nav_gradient_bottom) - $nav_gradient_bottom = "#000"; - if (! $nav_active_gradient_top) - $nav_active_gradient_top = "#000"; - if (! $nav_active_gradient_bottom) - $nav_active_gradient_bottom = "#000"; - if (! $nav_bd) - $nav_bd = "#000"; - if (! $nav_icon_colour) - $nav_icon_colour = "#32962D"; - if (! $nav_active_icon_colour) - $nav_active_icon_colour = "#50f148"; - if (! $banner_colour) - $banner_colour = "#000"; - if (! $link_colour) - $link_colour = "#50f148"; - if (! $bgcolour) - $bgcolour = "#000"; - if (! $toolicon_colour) - $toolicon_colour = "#32962D"; - if (! $toolicon_activecolour) - $toolicon_activecolour = "#50f148"; - if (! $item_colour) - $item_colour = "rgba(0,0,0,0.8)"; - if (! $comment_item_colour) - $comment_item_colour = "rgba(0,0,0,0.4)"; - if (! $comment_border_colour) - $comment_border_colour = "rgba(0,0,0,0.8)"; - if (! $font_colour) - $font_colour = "#46D43F"; - if (! $converse_width) - $converse_width = "1024"; diff --git a/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).css b/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).css deleted file mode 100644 index ea04d4d9e..000000000 --- a/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).css +++ /dev/null @@ -1,382 +0,0 @@ -.generic-content-wrapper { - border: 1px solid #000; - background-color: transparent; -} - -textarea, input, select -{ - color: $font_colour !important; - background: $bgcolour !important; - border: 1px solid #FFF !important; - } - -#profile-jot-submit-wrapper { - border-top: none; - padding: 10px 0; -} - -#jot-title-wrap { - border-bottom: none; - margin-bottom: 5px; -} - -optgroup { - color: #FFF !important; -} - -option { - color: $link_colour !important; -} - -.vcard, #contact-block, .widget { - background-color: transparent; - border: none; - border-bottom: 1px solid #fff; -} - -#cboxContent a { - color: #000; -} - -#cboxContent { - color: #000; -} - -#adminpage table tr:hover { - background-color: #000; -} - -#colorbox { - border: 0px solid #000; - background-color: #000; -} - -.chat-item-text { - background-color: #000; -} - -.fc-state-highlight { - background: none repeat scroll 0% 0% #000 !important; -} - -.well { - background-color: #000; - border: 1px solid #fff; - background-image: linear-gradient(to bottom, #000 0px, #000 100%); -} - -.alert-info { - color: #fff; - background-color:#000; - border-color: #fff; - background-image: linear-gradient(to bottom, #000 0px, #000 100%); -} - -.section-content-info-wrapper { - color: #fff; - background-color:#000; - border: 1px solid #fff !important; -} - -.modal-header { - border-bottom: 1px solid #000; -} - -.modal-footer { - border-top: 1px solid #000; -} - -#acl-select { - background-color: #000; - border: 1px solid #fff; - color: #fff; -} - -.abook-self { - color: #333; - background-color: #111 !important; - border: 1px solid #111; -} - -.acl-button-show, -.acl-button-hide { - color: #fff; -} - -#acl-list { - border: 1px solid #000; -} - -#acl-search-wrapper { - border-bottom: 1px solid #000; -} - -.acl-list-item { - border: 1px solid #fff; - background-color:#000; -} - -.modal-content { - background-color: #000; -} - -a.btn, aside a { - font-weight: 400 !important; -} - -.btn-default { - background-color: #000; - border-color: #fff; - color: #eee; - text-shadow: none; - box-shadow: none; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active .btn-default.active { - background-color: #000; - border-color: #fff; - color: #fff; - text-decoration: underline; -} - -.btn-default.btn-sm:hover, .btn-default.btn-sm:focus, .btn-default.btn-sm:active .btn-default.btn-sm.active { - text-decoration: none; -} - -.pager_first, -.pager_last, -.pager_prev, -.pager_next, -.pager-prev, -.pager-next, -.pager_n { - border: 1px solid #fff; - background: #000; -} - -input { - border: 1px solid #fff; -} - -input[type="submit"] { - background-color: #000; - color: #fff; -} - -.notify-seen a { - background: #000; - color: #000 !important; -} - -.notify-seen a:hover { - background: #000; - color: #fff !important; -} - -nav .dropdown-menu>li>a{ - color: #fff; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{ - color: #fff; - background-color: #030303; - background-image: none; -} - -nav .dropdown-menu .divider{ - background-color: #030303; -} - -nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{ - color: #fff; - background-color: #030303; - background-image: none; -} - -nav .dropdown-menu { - background-color: #000; -} - -a.rateme, div.rateme { - border: 1px solid #000; -} - -#nav-search-text { - background-color: #000; -} - -.autocomplete .selected { - background: #000; -} - -.nav-tabs{ - border-bottom:1px solid #fff; -} - -.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{ - border:1px solid #fff; -} - -.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus { - color: #fff; - background-color: #000; -} - -.nav-tabs.nav-justified > li > a { - color: #fff; -} - -.nav-tabs > li > a:hover, .nav-tabs > li > a:focus { - text-decoration: underline; - background-color: #000; - color: #fff; -} - -aside .nav > li > a:hover, aside .nav > li > a:focus { - text-decoration: underline; - background-color: #030303; -} - -.list-group-item { - background-color: #030303; -} - -a, a:visited, a:link, .fakelink, .fakelink:visited, .fakelink:link { - font-weight: bold; -} - -.group-selected, .fileas-selected, .categories-selected, .search-selected, a.active { - color: #fff !important; - text-decoration: underline !important; -} - -.generic-content-wrapper-styled { - background-color: rgba(0,0,0,0.8); -} - -.autocomplete { - background: #000; -} - -blockquote { - background-color: #000; - border-left: 3px solid #fff; - color: #eee; -} - -code { - border: 1px solid #eee; - background: #000; - color: #eee; -} - -pre { - background: #000; - color: #eee; - border:1px solid #fff; -} - -.notif-item a { - color: #fff; -} - -.notif-item a:hover { - color: #fff; -} - -.dropdown-menu { - background-color: #000; -} - -.dropdown-menu >li > a { - color: #fff; -} - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #fff; - background-color: #030303; - background-image: none; -} - -.open .dropdown-toggle.btn-default, .open .dropdown-toggle.btn-default:focus { - color: #fff; - background-color: #000; - border-color: #fff; -} - -.preview { - background: url('../img/gray_and_black_diagonal_stripes_background_seamless.gif'); -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #fff; - } -} - -#profile-jot-wrapper { - background-color: inherit; - border: none; -} - -.nav-tabs.nav-justified { - background-color: inherit; - border: none; -} - -.table-striped > tbody > tr:nth-of-type(2n+1), .table-hover > tbody > tr:hover { - background-color: #030303; -} - -.table > tbody > tr > td { - border-color: #FFF; -} - -.help-content { - border-bottom: #FFF thin solid; -} - -.help-content-open { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.contextual-help-content-open { - background: $nav_bg; - border-bottom: #FFF 1px solid; - box-shadow: 0px 3px 3px rgba(255,255,255,0.2); -} - -.contextual-help-tool { - opacity: 0.5; -} - -.contextual-help-tool:hover { - opacity: 1; -} - -.contextual-help-tool i { - color: $link_colour; -} - -.profile-match-wrapper { - width: 150px; - height: 120px; - border: none; -} - -.profile-match-name { - width: 144px; - white-space: nowrap; - text-overflow: ellipsis; -} - -.widget-nav-pills-icons:hover + a { - background-color: #030303; -} - -.widget-nav-pills-checkbox:hover + a { - background-color: #030303; -} - diff --git a/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).php b/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).php deleted file mode 100644 index b64f60bbe..000000000 --- a/view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - - if (! $nav_bg) - $nav_bg = "#000"; - if (! $nav_gradient_top) - $nav_gradient_top = "#000"; - if (! $nav_gradient_bottom) - $nav_gradient_bottom = "#000"; - if (! $nav_active_gradient_top) - $nav_active_gradient_top = "#000"; - if (! $nav_active_gradient_bottom) - $nav_active_gradient_bottom = "#000"; - if (! $nav_bd) - $nav_bd = "#000"; - if (! $nav_icon_colour) - $nav_icon_colour = "#eee"; - if (! $nav_active_icon_colour) - $nav_active_icon_colour = "#fff"; - if (! $banner_colour) - $banner_colour = "#000"; - if (! $link_colour) - $link_colour = "#fff"; - if (! $bgcolour) - $bgcolour = "#000"; - if (! $toolicon_colour) - $toolicon_colour = "#eee"; - if (! $toolicon_activecolour) - $toolicon_activecolour = "#fff"; - if (! $item_colour) - $item_colour = "rgba(0,0,0,0.8)"; - if (! $comment_item_colour) - $comment_item_colour = "rgba(0,0,0,0.4)"; - if (! $comment_border_colour) - $comment_border_colour = "rgba(0,0,0,0.8)"; - if (! $font_colour) - $font_colour = "#fff"; - if (! $converse_width) - $converse_width = "1024"; diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl index 5e10e6eea..8d32ba9a4 100755 --- a/view/tpl/admin_site.tpl +++ b/view/tpl/admin_site.tpl @@ -95,6 +95,7 @@ </div> <h3>{{$advanced}}</h3> + {{include file="field_checkbox.tpl" field=$sse_enabled}} {{include file="field_input.tpl" field=$imagick_path}} {{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxyuser}} diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl index 021c33146..fedcff1e3 100755 --- a/view/tpl/connections.tpl +++ b/view/tpl/connections.tpl @@ -20,7 +20,7 @@ <div class="input-group form-group"> <input type="text" name="search" id="contacts-search" class="form-control" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" /> <div class="input-group-append"> - <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit"><i class="fa fa-fw fa-search"></i></button> + <button id="contacts-search-submit" class="btn btn-sm btn-outline-secondary" type="submit"><i class="fa fa-fw fa-search"></i></button> </div> </div> </form> diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl index bd4cf3747..0d212e029 100755 --- a/view/tpl/head.tpl +++ b/view/tpl/head.tpl @@ -9,6 +9,7 @@ {{$plugins}} <script> var updateInterval = {{$update_interval}}; + var sse_enabled = {{$sse_enabled}}; var localUser = {{if $local_channel}}{{$local_channel}}{{else}}false{{/if}}; var zid = {{if $zid}}'{{$zid}}'{{else}}null{{/if}}; var justifiedGalleryActive = false; |