aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzottel <github@zottel.net>2016-07-14 20:49:26 +0200
committerzottel <github@zottel.net>2016-07-14 20:49:26 +0200
commita2461d98168fc132a7bf447a9806f0537361fd69 (patch)
treeceaab889a4fbb584ec37969087560a115ff649ca
parentecc06aad240a5e9babb29a512be434a107d4a291 (diff)
parentf60a0c5ce050febb0b200938eb51d88cf563b88f (diff)
downloadvolse-hubzilla-a2461d98168fc132a7bf447a9806f0537361fd69.tar.gz
volse-hubzilla-a2461d98168fc132a7bf447a9806f0537361fd69.tar.bz2
volse-hubzilla-a2461d98168fc132a7bf447a9806f0537361fd69.zip
Merge remote-tracking branch 'upstream/dev' into dev
-rw-r--r--Zotlabs/Lib/PermissionDescription.php (renamed from include/PermissionDescription.php)2
-rw-r--r--Zotlabs/Module/Acl.php84
-rw-r--r--Zotlabs/Module/Channel.php3
-rw-r--r--Zotlabs/Module/Editwebpage.php3
-rw-r--r--Zotlabs/Module/Events.php3
-rw-r--r--Zotlabs/Module/Filestorage.php3
-rw-r--r--Zotlabs/Module/Item.php9
-rw-r--r--Zotlabs/Module/Network.php4
-rw-r--r--Zotlabs/Module/Photos.php6
-rw-r--r--Zotlabs/Module/Rpost.php3
-rw-r--r--Zotlabs/Module/Settings.php4
-rw-r--r--Zotlabs/Module/Webpages.php3
-rw-r--r--Zotlabs/Web/SessionHandler.php3
-rw-r--r--doc/hook/change_channel.bb11
-rw-r--r--doc/hooklist.bb3
-rw-r--r--include/acl_selectors.php4
-rwxr-xr-xinclude/items.php23
-rw-r--r--include/security.php6
-rw-r--r--include/widgets.php2
-rw-r--r--include/zot.php7
-rw-r--r--install/schema_mysql.sql2
-rw-r--r--install/schema_postgres.sql2
-rw-r--r--view/css/bootstrap-red.css3
-rw-r--r--view/js/autocomplete.js2
-rw-r--r--view/js/mod_mail.js2
-rw-r--r--view/js/mod_photos.js2
-rw-r--r--view/theme/redbasic/js/redbasic.js6
-rw-r--r--view/tpl/chat.tpl4
-rwxr-xr-xview/tpl/events-js.tpl4
-rwxr-xr-xview/tpl/events_cal-js.tpl4
-rwxr-xr-xview/tpl/photo_album.tpl4
-rwxr-xr-xview/tpl/photos_recent.tpl4
32 files changed, 127 insertions, 98 deletions
diff --git a/include/PermissionDescription.php b/Zotlabs/Lib/PermissionDescription.php
index 1f7799406..55aac2dea 100644
--- a/include/PermissionDescription.php
+++ b/Zotlabs/Lib/PermissionDescription.php
@@ -1,6 +1,6 @@
<?php
-if(class_exists('PermissionDescription')) return;
+namespace Zotlabs\Lib;
require_once("include/permissions.php");
require_once("include/language.php");
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index 2bc4ba62d..f33e257f4 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -1,7 +1,18 @@
<?php
namespace Zotlabs\Module;
-/* ACL selector json backend */
+/*
+ * ACL selector json backend
+ * This module provides JSON lists of connections and local/remote channels
+ * (xchans) to populate various tools such as the ACL (AccessControlList) popup
+ * and various auto-complete functions (such as email recipients, search, and
+ * mention targets.
+ * There are two primary output structural formats. One for the ACL widget and
+ * the other for auto-completion.
+ * Many of the behaviour variations are triggered on the use of single character keys
+ * however this functionality has grown in an ad-hoc manner and has gotten quite messy over time.
+ */
+
require_once("include/acl_selectors.php");
require_once("include/group.php");
@@ -10,40 +21,63 @@ class Acl extends \Zotlabs\Web\Controller {
function init(){
- // logger('mod_acl: ' . print_r($_REQUEST,true));
-
- $start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
- $search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
- $type = (x($_REQUEST,'type')?$_REQUEST['type']:"");
- $noforums = (x($_REQUEST,'n') ? $_REQUEST['n'] : false);
+ // logger('mod_acl: ' . print_r($_REQUEST,true));
- // List of channels whose connections to also suggest, e.g. currently viewed channel or channels mentioned in a post
+ $start = (x($_REQUEST,'start') ? $_REQUEST['start'] : 0);
+ $count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 500);
+ $search = (x($_REQUEST,'search') ? $_REQUEST['search'] : '');
+ $type = (x($_REQUEST,'type') ? $_REQUEST['type'] : '');
+ $noforums = (x($_REQUEST,'n') ? $_REQUEST['n'] : false);
+
+
+ // $type =
+ // '' => standard ACL request
+ // 'g' => Groups only ACL request
+ // 'c' => Connections only ACL request or editor (textarea) mention request
+ // $_REQUEST['search'] contains ACL search text.
+
+
+ // $type =
+ // 'm' => autocomplete private mail recipient (checks post_mail permission)
+ // 'a' => autocomplete connections (mod_connections, mod_poke, mod_sources, mod_photos)
+ // 'x' => nav search bar autocomplete (match any xchan)
+ // $_REQUEST['query'] contains autocomplete search text.
+
+ // List of channels whose connections to also suggest,
+ // e.g. currently viewed channel or channels mentioned in a post
+
$extra_channels = (x($_REQUEST,'extra_channels') ? $_REQUEST['extra_channels'] : array());
- // For use with jquery.autocomplete for private mail completion
+ // The different autocomplete libraries use different names for the search text
+ // parameter. Internaly we'll use $search to represent the search text no matter
+ // what request variable it was attached to.
- if(x($_REQUEST,'query') && strlen($_REQUEST['query'])) {
- if(! $type)
- $type = 'm';
+ if(array_key_exists('query',$_REQUEST)) {
$search = $_REQUEST['query'];
}
- if(!(local_channel()))
- if(!($type == 'x' || $type == 'c'))
- killme();
+ if( (! local_channel()) && (! ($type == 'x' || $type == 'c')))
+ killme();
- if ($search != "") {
+ if($search) {
$sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
- // This horrible mess is needed because position also returns 0 if nothing is found. W/ould be MUCH easier if it instead returned a very large value
- // Otherwise we could just order by LEAST(POSITION($search IN xchan_name),POSITION($search IN xchan_addr)).
- $order_extra2 = "CASE WHEN xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) ." then POSITION('".dbesc($search)."' IN xchan_name) else position('".dbesc($search)."' IN xchan_addr) end, ";
+ // This horrible mess is needed because position also returns 0 if nothing is found.
+ // Would be MUCH easier if it instead returned a very large value
+ // Otherwise we could just
+ // order by LEAST(POSITION($search IN xchan_name),POSITION($search IN xchan_addr)).
+
+ $order_extra2 = "CASE WHEN xchan_name LIKE "
+ . protect_sprintf( "'%" . dbesc($search) . "%'" )
+ . " then POSITION('" . dbesc($search)
+ . "' IN xchan_name) else position('" . dbesc($search) . "' IN xchan_addr) end, ";
+
$col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' );
$sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
- } else {
+ }
+ else {
$sql_extra = $sql_extra2 = $sql_extra3 = "";
}
@@ -51,7 +85,7 @@ class Acl extends \Zotlabs\Web\Controller {
$groups = array();
$contacts = array();
- if ($type=='' || $type=='g'){
+ if($type == '' || $type == 'g') {
$r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`gname`
FROM `groups`,`group_member`
@@ -82,7 +116,7 @@ class Acl extends \Zotlabs\Web\Controller {
}
}
- if ($type=='' || $type=='c') {
+ if($type == '' || $type == 'c') {
$extra_channels_sql = '';
// Only include channels who allow the observer to view their permissions
foreach($extra_channels as $channel) {
@@ -171,7 +205,7 @@ class Acl extends \Zotlabs\Web\Controller {
intval(PERMS_W_MAIL)
);
}
- elseif(($type == 'a') || ($type == 'p')) {
+ elseif($type == 'a') {
$r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d
@@ -296,7 +330,7 @@ class Acl extends \Zotlabs\Web\Controller {
$url = $directory['url'] . '/dirsearch';
}
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
+ $count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 100);
if($url) {
$query = $url . '?f=' ;
$query .= '&name=' . urlencode($search) . "&limit=$count" . (($address) ? '&address=' . urlencode($search) : '');
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index d09388901..c74802ec5 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -9,7 +9,6 @@ require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/permissions.php');
-require_once('include/PermissionDescription.php');
class Channel extends \Zotlabs\Web\Controller {
@@ -133,7 +132,7 @@ class Channel extends \Zotlabs\Web\Controller {
'default_location' => (($is_owner) ? \App::$profile['channel_location'] : ''),
'nickname' => \App::$profile['channel_address'],
'lockstate' => (((strlen(\App::$profile['channel_allow_cid'])) || (strlen(\App::$profile['channel_allow_gid'])) || (strlen(\App::$profile['channel_deny_cid'])) || (strlen(\App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel_acl,true, \PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl,true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
'visitor' => (($is_owner || $observer) ? true : false),
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
index 5cd409e1e..be4803a07 100644
--- a/Zotlabs/Module/Editwebpage.php
+++ b/Zotlabs/Module/Editwebpage.php
@@ -4,7 +4,6 @@ namespace Zotlabs\Module;
require_once('include/channel.php');
require_once('include/acl_selectors.php');
require_once('include/conversation.php');
-require_once('include/PermissionDescription.php');
class Editwebpage extends \Zotlabs\Web\Controller {
@@ -151,7 +150,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
'body' => undo_post_tagging($itm[0]['body']),
'post_id' => $post_id,
'visitor' => ($is_owner) ? true : false,
- 'acl' => populate_acl($itm[0],false,\PermissionDescription::fromGlobalPermission('view_pages')),
+ 'acl' => populate_acl($itm[0],false,\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')),
'showacl' => ($is_owner) ? true : false,
'mimetype' => $mimetype,
'mimeselect' => true,
diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php
index 3187cddb4..def5c437b 100644
--- a/Zotlabs/Module/Events.php
+++ b/Zotlabs/Module/Events.php
@@ -6,7 +6,6 @@ require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
require_once('include/items.php');
-require_once('include/PermissionDescription.php');
class Events extends \Zotlabs\Web\Controller {
@@ -471,7 +470,7 @@ class Events extends \Zotlabs\Web\Controller {
'$permissions' => t('Permission settings'),
// populating the acl dialog was a permission description from view_stream because Cal.php, which
// displays events, says "since we don't currently have an event permission - use the stream permission"
- '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults), false, \PermissionDescription::fromGlobalPermission('view_stream'))),
+ '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults), false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'))),
'$submit' => t('Submit'),
'$advanced' => t('Advanced Options')
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
index 2861f31be..c3ef22e32 100644
--- a/Zotlabs/Module/Filestorage.php
+++ b/Zotlabs/Module/Filestorage.php
@@ -6,7 +6,6 @@ namespace Zotlabs\Module;
*/
require_once('include/attach.php');
-require_once('include/PermissionDescription.php');
/**
@@ -134,7 +133,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
$cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
- $aclselect_e = populate_acl($f, false, \PermissionDescription::fromGlobalPermission('view_storage'));
+ $aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage'));
$is_a_dir = (intval($f['is_dir']) ? true : false);
$lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 58d39da83..235c5528e 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -905,7 +905,7 @@ class Item extends \Zotlabs\Web\Controller {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true))));
+ build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
}
}
if(! $nopush)
@@ -1000,7 +1000,7 @@ class Item extends \Zotlabs\Web\Controller {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true))));
+ build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
}
}
@@ -1014,11 +1014,6 @@ class Item extends \Zotlabs\Web\Controller {
logger('post_complete');
-
-
-
-
-
// figure out how to return, depending on from whence we came
if($api_source)
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 87ed326e2..3b88cd8d6 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -6,8 +6,6 @@ require_once('include/group.php');
require_once('include/contact_widgets.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
-require_once('include/PermissionDescription.php');
-
class Network extends \Zotlabs\Web\Controller {
@@ -171,7 +169,7 @@ class Network extends \Zotlabs\Web\Controller {
'default_location' => $channel['channel_location'],
'nickname' => $channel['channel_address'],
'lockstate' => (($private_editing || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
- 'acl' => populate_acl((($private_editing) ? $def_acl : $channel_acl), true, \PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'),
+ 'acl' => populate_acl((($private_editing) ? $def_acl : $channel_acl), true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'),
'bang' => (($private_editing) ? '!' : ''),
'visitor' => true,
'profile_uid' => local_channel(),
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 1633e08ef..1eeab1461 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -9,8 +9,6 @@ require_once('include/bbcode.php');
require_once('include/security.php');
require_once('include/attach.php');
require_once('include/text.php');
-require_once('include/PermissionDescription.php');
-
class Photos extends \Zotlabs\Web\Controller {
@@ -633,7 +631,7 @@ class Photos extends \Zotlabs\Web\Controller {
$lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
}
- $aclselect = (($_is_owner) ? populate_acl($channel_acl,false, \PermissionDescription::fromGlobalPermission('view_storage')) : '');
+ $aclselect = (($_is_owner) ? populate_acl($channel_acl,false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')) : '');
// this is wrong but is to work around an issue with js_upload wherein it chokes if these variables
// don't exist. They really should be set to a parseable representation of the channel's default permissions
@@ -1023,7 +1021,7 @@ class Photos extends \Zotlabs\Web\Controller {
if($can_post) {
$album_e = $ph[0]['album'];
$caption_e = $ph[0]['description'];
- $aclselect_e = (($_is_owner) ? populate_acl($ph[0], true, \PermissionDescription::fromGlobalPermission('view_storage')) : '');
+ $aclselect_e = (($_is_owner) ? populate_acl($ph[0], true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')) : '');
$albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
$_SESSION['album_return'] = bin2hex($ph[0]['album']);
diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php
index 1396f2a55..9e3043d10 100644
--- a/Zotlabs/Module/Rpost.php
+++ b/Zotlabs/Module/Rpost.php
@@ -7,7 +7,6 @@ require_once('include/items.php');
require_once('include/taxonomy.php');
require_once('include/conversation.php');
require_once('include/zot.php');
-require_once('include/PermissionDescription.php');
/**
* remote post
@@ -116,7 +115,7 @@ class Rpost extends \Zotlabs\Web\Controller {
'default_location' => $channel['channel_location'],
'nickname' => $channel['channel_address'],
'lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
- 'acl' => populate_acl($channel_acl, true, \PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'),
+ 'acl' => populate_acl($channel_acl, true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'),
'bang' => '',
'visitor' => true,
'profile_uid' => local_channel(),
diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php
index 875004fae..af246a4dc 100644
--- a/Zotlabs/Module/Settings.php
+++ b/Zotlabs/Module/Settings.php
@@ -2,8 +2,6 @@
namespace Zotlabs\Module; /** @file */
require_once('include/zot.php');
-require_once('include/PermissionDescription.php');
-
class Settings extends \Zotlabs\Web\Controller {
@@ -1066,7 +1064,7 @@ class Settings extends \Zotlabs\Web\Controller {
'$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
'$permissions' => t('Default Post and Publish Permissions'),
'$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($perm_defaults, false, \PermissionDescription::fromDescription(t('Use my default audience setting for the type of object published'))),
+ '$aclselect' => populate_acl($perm_defaults, false, \Zotlabs\Lib\PermissionDescription::fromDescription(t('Use my default audience setting for the type of object published'))),
'$suggestme' => $suggestme,
'$group_select' => $group_select,
'$role' => array('permissions_role' , t('Channel permissions category:'), $permissions_role, '', get_roles()),
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
index bb8d9c6ed..cc0a01cce 100644
--- a/Zotlabs/Module/Webpages.php
+++ b/Zotlabs/Module/Webpages.php
@@ -4,7 +4,6 @@ namespace Zotlabs\Module;
require_once('include/channel.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
-require_once('include/PermissionDescription.php');
class Webpages extends \Zotlabs\Web\Controller {
@@ -105,7 +104,7 @@ class Webpages extends \Zotlabs\Web\Controller {
'is_owner' => true,
'nickname' => \App::$profile['channel_address'],
'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel_acl,false, \PermissionDescription::fromGlobalPermission('view_pages')) : ''),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl,false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''),
'showacl' => (($is_owner) ? true : false),
'visitor' => true,
'hide_location' => true,
diff --git a/Zotlabs/Web/SessionHandler.php b/Zotlabs/Web/SessionHandler.php
index 6e7333b4b..93b27a7e8 100644
--- a/Zotlabs/Web/SessionHandler.php
+++ b/Zotlabs/Web/SessionHandler.php
@@ -24,7 +24,8 @@ class SessionHandler implements \SessionHandlerInterface {
return $r[0]['sess_data'];
}
else {
- q("INSERT INTO `session` (sid, expire) values ('%s', '%s')",
+ q("INSERT INTO `session` (sess_data, sid, expire) values ('%s', '%s', '%s')",
+ dbesc(''),
dbesc($id),
dbesc(time() + 300)
);
diff --git a/doc/hook/change_channel.bb b/doc/hook/change_channel.bb
new file mode 100644
index 000000000..4514b9265
--- /dev/null
+++ b/doc/hook/change_channel.bb
@@ -0,0 +1,11 @@
+[h2]change_channel[/h2]
+
+Called when entering a logged in state in a channel context (as opposed to an account context).
+The hook array provides two arguments, 'channel_id' and 'chanx'. 'chanx' is a union of the channel
+and xchan records for the now active channel.
+
+Use this to capture what would traditionally be known as 'login events'. In this platform, login is
+a separate authentication activity and doesn't necessarily require "connecting to an identity", which
+is what the change_channel activity represents.
+
+
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index bb1bffcf0..66ff1cf71 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -73,6 +73,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/bb_translate_video]bb_translate_video[/zrl]
Called when extracting embedded services from bbcode video elements (rarely used)
+[zrl=[baseurl]/help/hook/change_channel]change_channel[/zrl]
+ Called when logging in to a channel (either during login or afterward through the channel manager)
+
[zrl=[baseurl]/help/hook/channel_remove]channel_remove[/zrl]
Called when removing a channel
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index 89d054e3b..148c67a6c 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -7,8 +7,6 @@
* @package acl_selectors
*/
-require_once("include/PermissionDescription.php");
-
function group_select($selname,$selclass,$preselected = false,$size = 4) {
$o = '';
@@ -231,7 +229,7 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
if(! $emptyACL_description) {
$showall_caption = t('Visible to your default audience');
- } else if (is_a($emptyACL_description, 'PermissionDescription')) {
+ } else if (is_a($emptyACL_description, '\\Zotlabs\\Lib\\PermissionDescription')) {
$showall_caption = $emptyACL_description->get_permission_description();
$showall_origin = (($role === 'custom') ? $emptyACL_description->get_permission_origin_description() : '');
$showall_icon = $emptyACL_description->get_permission_icon();
diff --git a/include/items.php b/include/items.php
index 72f0896ad..373090d41 100755
--- a/include/items.php
+++ b/include/items.php
@@ -4154,32 +4154,19 @@ function update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remo
}
if($page_type) {
-
// store page info as an alternate message_id so we can access it via
// https://sitename/page/$channelname/$pagetitle
// if no pagetitle was given or it couldn't be transliterated into a url, use the first
// sixteen bytes of the mid - which makes the link portable and not quite as daunting
// as the entire mid. If it were the post_id the link would be less portable.
- $r = q("select * from item_id where iid = %d and uid = %d and service = '%s' limit 1",
+ \Zotlabs\Lib\IConfig::Set(
intval($post_id),
- intval($channel['channel_id']),
- dbesc($page_type)
+ 'system',
+ $page_type,
+ ($pagetitle) ? $pagetitle : substr($mid,0,16),
+ false
);
- if($r) {
- q("update item_id set sid = '%s' where id = %d",
- dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
- intval($r[0]['id'])
- );
- }
- else {
- q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )",
- intval($post_id),
- intval($channel['channel_id']),
- dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
- dbesc($page_type)
- );
- }
}
}
diff --git a/include/security.php b/include/security.php
index 38045c8a9..212690d91 100644
--- a/include/security.php
+++ b/include/security.php
@@ -125,13 +125,17 @@ function change_channel($change_channel) {
);
if($x) {
$_SESSION['my_url'] = $x[0]['xchan_url'];
- $_SESSION['my_address'] = $r[0]['channel_address'] . '@' . substr(z_root(), strpos(z_root(), '://') + 3);
+ $_SESSION['my_address'] = $r[0]['channel_address'] . '@' . App::get_hostname();
App::set_observer($x[0]);
App::set_perms(get_all_perms(local_channel(), $hash));
}
if(! is_dir('store/' . $r[0]['channel_address']))
@os_mkdir('store/' . $r[0]['channel_address'], STORAGE_DEFAULT_PERMISSIONS,true);
+
+ $arr = [ 'channel_id' => $change_channel, 'chanx' => $ret ];
+ call_hooks('change_channel', $arr);
+
}
return $ret;
diff --git a/include/widgets.php b/include/widgets.php
index a4a6fb55a..2d4d5b799 100644
--- a/include/widgets.php
+++ b/include/widgets.php
@@ -296,7 +296,7 @@ function widget_filer($arr) {
$selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
$terms = array();
- $r = q("select distinct(term) from term where uid = %d and ttype = %d order by term asc",
+ $r = q("select distinct term from term where uid = %d and ttype = %d order by term asc",
intval(local_channel()),
intval(TERM_FILE)
);
diff --git a/include/zot.php b/include/zot.php
index 6dd789181..45347ef22 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -3014,7 +3014,12 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
if($x['hubloc_host'] == App::get_hostname())
continue;
- $synchubs[] = $x;
+ $y = q("select site_dead from site where site_url = '%s' limit 1",
+ dbesc($x['hubloc_url'])
+ );
+
+ if((! $y) || ($y[0]['site_dead'] == 0))
+ $synchubs[] = $x;
}
if(! $synchubs)
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index d2a5ac85e..b43ead050 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -1,7 +1,7 @@
CREATE TABLE IF NOT EXISTS `abconfig` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `chan` int(10) unsigned NOT NULL DEFAULT '',
+ `chan` int(10) unsigned NOT NULL DEFAULT '0',
`xchan` char(255) NOT NULL DEFAULT '',
`cat` char(255) NOT NULL DEFAULT '',
`k` char(255) NOT NULL DEFAULT '',
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index 378308233..5080d7608 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -1,6 +1,6 @@
CREATE TABLE "abconfig" (
"id" serial NOT NULL,
- "chan" bigint NOT NULL,
+ "chan" bigint NOT NULL DEFAULT '0',
"xchan" text NOT NULL,
"cat" text NOT NULL,
"k" text NOT NULL,
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
index 26321ab3c..20df16446 100644
--- a/view/css/bootstrap-red.css
+++ b/view/css/bootstrap-red.css
@@ -59,7 +59,8 @@ aside .nav-pills > li > a,
padding: 6px 10px;
}
-.wall-item-tools .dropdown-menu {
+.wall-item-tools .dropdown-menu,
+.section-title-wrapper .dropdown-menu {
min-width: auto;
}
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 59a9ed355..63f1e9a13 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -1,5 +1,5 @@
/**
- * Red people autocomplete
+ * general autocomplete support
*
* require jQuery, jquery.textcomplete
*/
diff --git a/view/js/mod_mail.js b/view/js/mod_mail.js
index 3e55c8aeb..46574a63d 100644
--- a/view/js/mod_mail.js
+++ b/view/js/mod_mail.js
@@ -1,5 +1,5 @@
$(document).ready(function() {
- $("#recip").name_autocomplete(baseurl + '/acl', '', false, function(data) {
+ $("#recip").name_autocomplete(baseurl + '/acl', 'm', false, function(data) {
$("#recip-complete").val(data.xid);
});
$(".autotime").timeago()
diff --git a/view/js/mod_photos.js b/view/js/mod_photos.js
index 006be5f23..e3df3ca68 100644
--- a/view/js/mod_photos.js
+++ b/view/js/mod_photos.js
@@ -3,7 +3,7 @@
*/
$(document).ready(function() {
- $("#photo-edit-newtag").contact_autocomplete(baseurl + '/acl', 'p', false, function(data) {
+ $("#photo-edit-newtag").contact_autocomplete(baseurl + '/acl', 'a', false, function(data) {
$("#photo-edit-newtag").val('@' + data.name);
});
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 5209ad945..300f076f0 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -56,14 +56,16 @@ $(document).ready(function() {
function makeFullScreen(full) {
if(typeof full=='undefined' || full == true) {
$('main').css({'transition': 'none'}).addClass('fullscreen');
- $('#fullscreen-btn, header, nav, aside, #tabs-collapse-1').css({'visibility': 'hidden'});
+ $('header, nav, aside, #tabs-collapse-1').css({'visibility': 'hidden'});
+ $('#fullscreen-btn').hide();
$('#inline-btn').show();
}
else {
$('main').removeClass('fullscreen');
- $('#fullscreen-btn, header, nav, aside, #tabs-collapse-1').css({'visibility': ''});
+ $('header, nav, aside, #tabs-collapse-1').css({'visibility': ''});
$('#inline-btn').hide();
+ $('#fullscreen-btn').show();
$('main').css({'transition': ''});
}
}
diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl
index 341ff7649..31be4136f 100644
--- a/view/tpl/chat.tpl
+++ b/view/tpl/chat.tpl
@@ -1,8 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
{{if $is_owner}}
<form id="chat-destroy" method="post" action="chat">
<input type="hidden" name="room_name" value="{{$room_name}}" />
@@ -10,6 +8,8 @@
<button class="btn btn-danger btn-xs" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</button>
</form>
{{/if}}
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$room_name}}</h2>
<div class="clear"></div>
diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl
index 3397411a8..6299242ce 100755
--- a/view/tpl/events-js.tpl
+++ b/view/tpl/events-js.tpl
@@ -2,8 +2,6 @@
<div class="section-title-wrapper">
<div class="pull-right">
<div class="dropdown">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"><i class="fa fa-caret-down"></i>&nbsp;{{$view_label}}</button>
<ul class="dropdown-menu">
<li><a href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li>
@@ -16,6 +14,8 @@
<button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
<button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
</div>
<h2 id="title"></h2>
diff --git a/view/tpl/events_cal-js.tpl b/view/tpl/events_cal-js.tpl
index 121c06cb5..b7836cfab 100755
--- a/view/tpl/events_cal-js.tpl
+++ b/view/tpl/events_cal-js.tpl
@@ -2,13 +2,13 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
<div class="btn-group">
<button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
<button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
<button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2 id="title"></h2>
<div class="clear"></div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index e6cb61637..b391a00a1 100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -1,8 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
{{if $order}}
<a class="btn btn-default btn-xs" href="{{$order.1}}" title="{{$order.0}}"><i class="fa fa-sort"></i></a>
{{/if}}
@@ -14,6 +12,8 @@
<button class="btn btn-xs btn-success btn-xs" title="{{$usage}}" onclick="openClose('photo-upload-form'); closeMenu('photo-album-edit-wrapper');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
</div>
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$album}}</h2>
<div class="clear"></div>
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index c40dda145..139f27a23 100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -1,11 +1,11 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
{{if $can_post}}
<button class="btn btn-xs btn-success" title="{{$usage}}" onclick="openClose('photo-upload-form');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$title}}</h2>
<div class="clear"></div>