aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kostikov <max@kostikov.co>2020-11-15 11:09:44 +0100
committerMax Kostikov <max@kostikov.co>2020-11-15 11:09:44 +0100
commit38985dc4e2a05e4746e1d0fc7bdb09ec55273e54 (patch)
tree7be5457bcd756985adc7025db9424972f74a4a6c
parent7cf9b85a97829dc6e11fef4dcafeebe746084c1f (diff)
parente74c52094f218686c59ddb5f6c186f02158cf89a (diff)
downloadvolse-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
-rw-r--r--CHANGELOG20
-rw-r--r--Zotlabs/Daemon/Notifier.php23
-rw-r--r--Zotlabs/Lib/Activity.php20
-rw-r--r--Zotlabs/Lib/JSalmon.php2
-rw-r--r--Zotlabs/Lib/LDSignatures.php3
-rw-r--r--Zotlabs/Lib/Share.php2
-rw-r--r--Zotlabs/Lib/Zotfinger.php7
-rw-r--r--Zotlabs/Module/Admin/Site.php8
-rw-r--r--Zotlabs/Module/Channel.php2
-rw-r--r--Zotlabs/Module/Connedit.php15
-rw-r--r--Zotlabs/Module/Photos.php2
-rw-r--r--Zotlabs/Module/Sse.php107
-rw-r--r--Zotlabs/Module/Sse_bs.php5
-rw-r--r--Zotlabs/Module/Zot_probe.php2
-rw-r--r--Zotlabs/Update/_1239.php27
-rw-r--r--Zotlabs/Web/HTTPSig.php66
-rw-r--r--Zotlabs/Zot6/Receiver.php2
-rwxr-xr-xboot.php5
-rw-r--r--include/attach.php6
-rw-r--r--include/import.php45
-rw-r--r--include/network.php37
-rw-r--r--include/text.php2
-rw-r--r--include/zot.php4
-rw-r--r--view/js/main.js86
-rw-r--r--view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).css322
-rw-r--r--view/theme/redbasic/schema/simple_black_on_white_(unmaintained,deprecated).php42
-rw-r--r--view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).css408
-rw-r--r--view/theme/redbasic/schema/simple_green_on_black_(unmaintained,deprecated).php38
-rw-r--r--view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).css382
-rw-r--r--view/theme/redbasic/schema/simple_white_on_black_(unmaintained,deprecated).php38
-rwxr-xr-xview/tpl/admin_site.tpl1
-rwxr-xr-xview/tpl/connections.tpl2
-rwxr-xr-xview/tpl/head.tpl1
33 files changed, 346 insertions, 1386 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 8f4b0fb7d..6a6292da3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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;
diff --git a/boot.php b/boot.php
index 9045fe9f4..9e32bc783 100755
--- a/boot.php
+++ b/boot.php
@@ -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;