]> git.mxchange.org Git - friendica.git/commitdiff
Move /acl module to src/
authorHypolite Petovan <hypolite@mrpetovan.com>
Fri, 4 Oct 2019 02:40:42 +0000 (22:40 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Fri, 4 Oct 2019 02:40:42 +0000 (22:40 -0400)
- Move Core\ACL::contactAutocomplete to Module\Search\Acl
- Rename module path to /search/acl

21 files changed:
mod/acl.php [deleted file]
src/Core/ACL.php
src/Module/Search/Acl.php [new file with mode: 0644]
static/routes.config.php
view/js/main.js
view/templates/acl_selector.tpl
view/templates/contacts-head.tpl
view/templates/display-head.tpl
view/templates/item/compose-footer.tpl
view/templates/jot-header.tpl
view/templates/message-head.tpl
view/templates/msg-header.tpl
view/templates/poke_head.tpl
view/templates/wallmsg-header.tpl
view/theme/frio/js/event_edit.js
view/theme/frio/templates/acl_selector.tpl
view/theme/frio/templates/jot-header.tpl
view/theme/frio/templates/msg-header.tpl
view/theme/frio/templates/nav_head.tpl
view/theme/smoothly/templates/jot-header.tpl
view/theme/vier/templates/nav_head.tpl

diff --git a/mod/acl.php b/mod/acl.php
deleted file mode 100644 (file)
index 2b3f2a2..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-<?php
-
-/* ACL selector json backend */
-
-use Friendica\App;
-use Friendica\Content\Widget;
-use Friendica\Core\ACL;
-use Friendica\Core\Hook;
-use Friendica\Core\Logger;
-use Friendica\Core\Protocol;
-use Friendica\Database\DBA;
-use Friendica\Model\Contact;
-use Friendica\Model\Item;
-use Friendica\Util\Proxy as ProxyUtils;
-use Friendica\Util\Strings;
-
-function acl_content(App $a)
-{
-       if (!local_user()) {
-               return '';
-       }
-
-       $start   = defaults($_REQUEST, 'start'       , 0);
-       $count   = defaults($_REQUEST, 'count'       , 100);
-       $search  = defaults($_REQUEST, 'search'      , '');
-       $type    = defaults($_REQUEST, 'type'        , '');
-       $conv_id = defaults($_REQUEST, 'conversation', null);
-
-       // For use with jquery.textcomplete for private mail completion
-       if (!empty($_REQUEST['query'])) {
-               if (!$type) {
-                       $type = 'm';
-               }
-               $search = $_REQUEST['query'];
-       }
-
-       Logger::info('ACL {action} - {subaction}', ['module' => 'acl', 'action' => 'content', 'subaction' => 'search', 'search' => $search, 'type' => $type, 'conversation' => $conv_id]);
-
-       if ($search != '') {
-               $sql_extra = "AND `name` LIKE '%%" . DBA::escape($search) . "%%'";
-               $sql_extra2 = "AND (`attag` LIKE '%%" . DBA::escape($search) . "%%' OR `name` LIKE '%%" . DBA::escape($search) . "%%' OR `nick` LIKE '%%" . DBA::escape($search) . "%%')";
-       } else {
-               /// @TODO Avoid these needless else blocks by putting variable-initialization atop of if()
-               $sql_extra = $sql_extra2 = '';
-       }
-
-       // count groups and contacts
-       $group_count = 0;
-       if ($type == '' || $type == 'g') {
-               $r = q("SELECT COUNT(*) AS g FROM `group` WHERE NOT `deleted` AND `uid` = %d $sql_extra",
-                       intval(local_user())
-               );
-               $group_count = (int) $r[0]['g'];
-       }
-
-       $sql_extra2 .= ' ' . Widget::unavailableNetworks();
-
-       $contact_count = 0;
-       if ($type == '' || $type == 'c') {
-               // autocomplete for editor mentions
-               $r = q("SELECT COUNT(*) AS c FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
-                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `notify` != '' $sql_extra2",
-                       intval(local_user())
-               );
-               $contact_count = (int) $r[0]['c'];
-       } elseif ($type == 'f') {
-               // autocomplete for editor mentions of forums
-               $r = q("SELECT COUNT(*) AS c FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
-                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND (`forum` OR `prv`)
-                               AND `notify` != '' $sql_extra2",
-                       intval(local_user())
-               );
-               $contact_count = (int) $r[0]['c'];
-       } elseif ($type == 'm') {
-               // autocomplete for Private Messages
-               $r = q("SELECT COUNT(*) AS c FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
-                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `network` IN ('%s', '%s', '%s') $sql_extra2",
-                       intval(local_user()),
-                       DBA::escape(Protocol::ACTIVITYPUB),
-                       DBA::escape(Protocol::DFRN),
-                       DBA::escape(Protocol::DIASPORA)
-               );
-               $contact_count = (int) $r[0]['c'];
-       } elseif ($type == 'a') {
-               // autocomplete for Contacts
-               $r = q("SELECT COUNT(*) AS c FROM `contact`
-                               WHERE `uid` = %d AND NOT `self`
-                               AND NOT `pending` AND NOT `deleted` $sql_extra2",
-                       intval(local_user())
-               );
-               $contact_count = (int) $r[0]['c'];
-       }
-
-       $tot = $group_count + $contact_count;
-
-       $groups = [];
-       $contacts = [];
-
-       if ($type == '' || $type == 'g') {
-               /// @todo We should cache this query.
-               // This can be done when we can delete cache entries via wildcard
-               $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids
-                               FROM `group`
-                               INNER JOIN `group_member` ON `group_member`.`gid`=`group`.`id`
-                               WHERE NOT `group`.`deleted` AND `group`.`uid` = %d
-                                       $sql_extra
-                               GROUP BY `group`.`name`, `group`.`id`
-                               ORDER BY `group`.`name`
-                               LIMIT %d,%d",
-                       intval(local_user()),
-                       intval($start),
-                       intval($count)
-               );
-
-               foreach ($r as $g) {
-                       $groups[] = [
-                               'type'  => 'g',
-                               'photo' => 'images/twopeople.png',
-                               'name'  => htmlspecialchars($g['name']),
-                               'id'    => intval($g['id']),
-                               'uids'  => array_map('intval', explode(',', $g['uids'])),
-                               'link'  => '',
-                               'forum' => '0'
-                       ];
-               }
-               if ((count($groups) > 0) && ($search == '')) {
-                       $groups[] = ['separator' => true];
-               }
-       }
-
-       $r = [];
-       if ($type == '') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND NOT (`network` IN ('%s', '%s'))
-                               $sql_extra2
-                               ORDER BY `name` ASC ",
-                       intval(local_user()),
-                       DBA::escape(Protocol::OSTATUS),
-                       DBA::escape(Protocol::STATUSNET)
-               );
-       } elseif ($type == 'c') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND NOT (`network` IN ('%s'))
-                               $sql_extra2
-                               ORDER BY `name` ASC ",
-                       intval(local_user()),
-                       DBA::escape(Protocol::STATUSNET)
-               );
-       } elseif ($type == 'f') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
-                               AND NOT (`network` IN ('%s'))
-                               AND (`forum` OR `prv`)
-                               $sql_extra2
-                               ORDER BY `name` ASC ",
-                       intval(local_user()),
-                       DBA::escape(Protocol::STATUSNET)
-               );
-       } elseif ($type == 'm') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
-                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
-                               AND `network` IN ('%s', '%s', '%s')
-                               $sql_extra2
-                               ORDER BY `name` ASC ",
-                       intval(local_user()),
-                       DBA::escape(Protocol::ACTIVITYPUB),
-                       DBA::escape(Protocol::DFRN),
-                       DBA::escape(Protocol::DIASPORA)
-               );
-       } elseif ($type == 'a') {
-               $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
-                               WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND NOT `archive`
-                               $sql_extra2
-                               ORDER BY `name` ASC ",
-                       intval(local_user())
-               );
-       } elseif ($type == 'x') {
-               // autocomplete for global contact search (e.g. navbar search)
-               $search = Strings::escapeTags(trim($_REQUEST['search']));
-               $mode = $_REQUEST['smode'];
-               $page = $_REQUEST['page'] ?? 1;
-
-               $r = ACL::contactAutocomplete($search, $mode, $page);
-
-               $contacts = [];
-               foreach ($r as $g) {
-                       $contacts[] = [
-                               'photo'   => ProxyUtils::proxifyUrl($g['photo'], false, ProxyUtils::SIZE_MICRO),
-                               'name'    => htmlspecialchars($g['name']),
-                               'nick'    => defaults($g, 'addr', $g['url']),
-                               'network' => $g['network'],
-                               'link'    => $g['url'],
-                               'forum'   => !empty($g['community']) ? 1 : 0,
-                       ];
-               }
-               $o = [
-                       'start' => $start,
-                       'count' => $count,
-                       'items' => $contacts,
-               ];
-               echo json_encode($o);
-               exit;
-       }
-
-       if (DBA::isResult($r)) {
-               $forums = [];
-               foreach ($r as $g) {
-                       $entry = [
-                               'type'    => 'c',
-                               'photo'   => ProxyUtils::proxifyUrl($g['micro'], false, ProxyUtils::SIZE_MICRO),
-                               'name'    => htmlspecialchars($g['name']),
-                               'id'      => intval($g['id']),
-                               'network' => $g['network'],
-                               'link'    => $g['url'],
-                               'nick'    => htmlentities(defaults($g, 'attag', $g['nick'])),
-                               'addr'    => htmlentities(defaults($g, 'addr', $g['url'])),
-                               'forum'   => !empty($g['forum']) || !empty($g['prv']) ? 1 : 0,
-                       ];
-                       if ($entry['forum']) {
-                               $forums[] = $entry;
-                       } else {
-                               $contacts[] = $entry;
-                       }
-               }
-               if (count($forums) > 0) {
-                       if ($search == '') {
-                               $forums[] = ['separator' => true];
-                       }
-                       $contacts = array_merge($forums, $contacts);
-               }
-       }
-
-       $items = array_merge($groups, $contacts);
-
-       if ($conv_id) {
-               // In multi threaded posts the conv_id is not the parent of the whole thread
-               $parent_item = Item::selectFirst(['parent'], ['id' => $conv_id]);
-               if (DBA::isResult($parent_item)) {
-                       $conv_id = $parent_item['parent'];
-               }
-
-               /*
-                * if $conv_id is set, get unknown contacts in thread
-                * but first get known contacts url to filter them out
-                */
-               $known_contacts = array_map(function ($i) {
-                       return $i['link'];
-               }, $contacts);
-
-               $unknown_contacts = [];
-
-               $condition = ["`parent` = ?", $conv_id];
-               $params = ['order' => ['author-name' => true]];
-               $authors = Item::selectForUser(local_user(), ['author-link'], $condition, $params);
-               $item_authors = [];
-               while ($author = Item::fetch($authors)) {
-                       $item_authors[$author['author-link']] = $author['author-link'];
-               }
-               DBA::close($authors);
-
-               foreach ($item_authors as $author) {
-                       if (in_array($author, $known_contacts)) {
-                               continue;
-                       }
-
-                       $contact = Contact::getDetailsByURL($author);
-
-                       if (count($contact) > 0) {
-                               $unknown_contacts[] = [
-                                       'type'    => 'c',
-                                       'photo'   => ProxyUtils::proxifyUrl($contact['micro'], false, ProxyUtils::SIZE_MICRO),
-                                       'name'    => htmlspecialchars($contact['name']),
-                                       'id'      => intval($contact['cid']),
-                                       'network' => $contact['network'],
-                                       'link'    => $contact['url'],
-                                       'nick'    => htmlentities(defaults($contact, 'nick', $contact['addr'])),
-                                       'addr'    => htmlentities(defaults($contact, 'addr', $contact['url'])),
-                                       'forum'   => $contact['forum']
-                               ];
-                       }
-               }
-
-               $items = array_merge($items, $unknown_contacts);
-               $tot += count($unknown_contacts);
-       }
-
-       $results = [
-               'tot'      => $tot,
-               'start'    => $start,
-               'count'    => $count,
-               'groups'   => $groups,
-               'contacts' => $contacts,
-               'items'    => $items,
-               'type'     => $type,
-               'search'   => $search,
-       ];
-
-       Hook::callAll('acl_lookup_end', $results);
-
-       $o = [
-               'tot'   => $results['tot'],
-               'start' => $results['start'],
-               'count' => $results['count'],
-               'items' => $results['items'],
-       ];
-
-       echo json_encode($o);
-       exit;
-}
index 55c174d96b51563e8b50cdf6fd9c8b231e17da2e..fd9bfc6e22e574f23bdfe6f2623b0204d67d7110 100644 (file)
@@ -321,47 +321,4 @@ class ACL extends BaseObject
 
                return $o;
        }
-
-       /**
-        * Searching for global contacts for autocompletion
-        *
-        * @brief Searching for global contacts for autocompletion
-        * @param string $search Name or part of a name or nick
-        * @param string $mode   Search mode (e.g. "community")
-        * @param int    $page   Page number (starts at 1)
-        * @return array with the search results
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function contactAutocomplete($search, $mode, int $page = 1)
-       {
-               if (Config::get('system', 'block_public') && !Session::isAuthenticated()) {
-                       return [];
-               }
-
-               // don't search if search term has less than 2 characters
-               if (!$search || mb_strlen($search) < 2) {
-                       return [];
-               }
-
-               if (substr($search, 0, 1) === '@') {
-                       $search = substr($search, 1);
-               }
-
-               // check if searching in the local global contact table is enabled
-               if (Config::get('system', 'poco_local_search')) {
-                       $return = GContact::searchByName($search, $mode);
-               } else {
-                       $p = $page > 1 ? 'p=' . $page : '';
-
-                       $curlResult = Network::curl(get_server() . '/lsearch?' . $p . '&search=' . urlencode($search));
-                       if ($curlResult->isSuccess()) {
-                               $lsearch = json_decode($curlResult->getBody(), true);
-                               if (!empty($lsearch['results'])) {
-                                       $return = $lsearch['results'];
-                               }
-                       }
-               }
-
-               return $return ?? [];
-       }
 }
diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php
new file mode 100644 (file)
index 0000000..07cc9cd
--- /dev/null
@@ -0,0 +1,374 @@
+<?php
+
+namespace Friendica\Module\Search;
+
+use Friendica\BaseModule;
+use Friendica\Content\Widget;
+use Friendica\Core\Config;
+use Friendica\Core\Hook;
+use Friendica\Core\L10n;
+use Friendica\Core\Logger;
+use Friendica\Core\Protocol;
+use Friendica\Core\Session;
+use Friendica\Database\DBA;
+use Friendica\Model\Contact;
+use Friendica\Model\GContact;
+use Friendica\Model\Item;
+use Friendica\Network\HTTPException;
+use Friendica\Util\Network;
+use Friendica\Util\Proxy as ProxyUtils;
+use Friendica\Util\Strings;
+
+/**
+ * ACL selector json backend
+ *
+ * @package Friendica\Module\Search
+ */
+class Acl extends BaseModule
+{
+       public static function rawContent()
+       {
+               if (!local_user()) {
+                       throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this module.'));
+               }
+
+               $start   = $_REQUEST['start']        ?? 0;
+               $count   = $_REQUEST['count']        ?? 100;
+               $search  = $_REQUEST['search']       ?? '';
+               $type    = $_REQUEST['type']         ?? '';
+               $conv_id = $_REQUEST['conversation'] ?? null;
+
+               // For use with jquery.textcomplete for private mail completion
+               if (!empty($_REQUEST['query'])) {
+                       if (!$type) {
+                               $type = 'm';
+                       }
+                       $search = $_REQUEST['query'];
+               }
+
+               Logger::info('ACL {action} - {subaction}', ['module' => 'acl', 'action' => 'content', 'subaction' => 'search', 'search' => $search, 'type' => $type, 'conversation' => $conv_id]);
+
+               $sql_extra = '';
+               $sql_extra2 = '';
+
+               if ($search != '') {
+                       $sql_extra = "AND `name` LIKE '%%" . DBA::escape($search) . "%%'";
+                       $sql_extra2 = "AND (`attag` LIKE '%%" . DBA::escape($search) . "%%' OR `name` LIKE '%%" . DBA::escape($search) . "%%' OR `nick` LIKE '%%" . DBA::escape($search) . "%%')";
+               }
+
+               // count groups and contacts
+               $group_count = 0;
+               if ($type == '' || $type == 'g') {
+                       $r = q("SELECT COUNT(*) AS g FROM `group` WHERE NOT `deleted` AND `uid` = %d $sql_extra",
+                               intval(local_user())
+                       );
+                       $group_count = (int) $r[0]['g'];
+               }
+
+               $sql_extra2 .= ' ' . Widget::unavailableNetworks();
+
+               $contact_count = 0;
+               if ($type == '' || $type == 'c') {
+                       // autocomplete for editor mentions
+                       $r = q("SELECT COUNT(*) AS c FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
+                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
+                               AND `notify` != '' $sql_extra2",
+                               intval(local_user())
+                       );
+                       $contact_count = (int) $r[0]['c'];
+               } elseif ($type == 'f') {
+                       // autocomplete for editor mentions of forums
+                       $r = q("SELECT COUNT(*) AS c FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
+                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
+                               AND (`forum` OR `prv`)
+                               AND `notify` != '' $sql_extra2",
+                               intval(local_user())
+                       );
+                       $contact_count = (int) $r[0]['c'];
+               } elseif ($type == 'm') {
+                       // autocomplete for Private Messages
+                       $r = q("SELECT COUNT(*) AS c FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted`
+                               AND NOT `blocked` AND NOT `pending` AND NOT `archive`
+                               AND `network` IN ('%s', '%s', '%s') $sql_extra2",
+                               intval(local_user()),
+                               DBA::escape(Protocol::ACTIVITYPUB),
+                               DBA::escape(Protocol::DFRN),
+                               DBA::escape(Protocol::DIASPORA)
+                       );
+                       $contact_count = (int) $r[0]['c'];
+               } elseif ($type == 'a') {
+                       // autocomplete for Contacts
+                       $r = q("SELECT COUNT(*) AS c FROM `contact`
+                               WHERE `uid` = %d AND NOT `self`
+                               AND NOT `pending` AND NOT `deleted` $sql_extra2",
+                               intval(local_user())
+                       );
+                       $contact_count = (int) $r[0]['c'];
+               }
+
+               $tot = $group_count + $contact_count;
+
+               $groups = [];
+               $contacts = [];
+
+               if ($type == '' || $type == 'g') {
+                       /// @todo We should cache this query.
+                       // This can be done when we can delete cache entries via wildcard
+                       $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids
+                               FROM `group`
+                               INNER JOIN `group_member` ON `group_member`.`gid`=`group`.`id`
+                               WHERE NOT `group`.`deleted` AND `group`.`uid` = %d
+                                       $sql_extra
+                               GROUP BY `group`.`name`, `group`.`id`
+                               ORDER BY `group`.`name`
+                               LIMIT %d, %d",
+                               intval(local_user()),
+                               intval($start),
+                               intval($count)
+                       );
+
+                       foreach ($r as $g) {
+                               $groups[] = [
+                                       'type'  => 'g',
+                                       'photo' => 'images/twopeople.png',
+                                       'name'  => htmlspecialchars($g['name']),
+                                       'id'    => intval($g['id']),
+                                       'uids'  => array_map('intval', explode(',', $g['uids'])),
+                                       'link'  => '',
+                                       'forum' => '0'
+                               ];
+                       }
+                       if ((count($groups) > 0) && ($search == '')) {
+                               $groups[] = ['separator' => true];
+                       }
+               }
+
+               $r = [];
+               if ($type == '') {
+                       $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
+                               AND NOT (`network` IN ('%s', '%s'))
+                               $sql_extra2
+                               ORDER BY `name`",
+                               intval(local_user()),
+                               DBA::escape(Protocol::OSTATUS),
+                               DBA::escape(Protocol::STATUSNET)
+                       );
+               } elseif ($type == 'c') {
+                       $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
+                               AND NOT (`network` IN ('%s'))
+                               $sql_extra2
+                               ORDER BY `name`",
+                               intval(local_user()),
+                               DBA::escape(Protocol::STATUSNET)
+                       );
+               } elseif ($type == 'f') {
+                       $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
+                               AND NOT (`network` IN ('%s'))
+                               AND (`forum` OR `prv`)
+                               $sql_extra2
+                               ORDER BY `name`",
+                               intval(local_user()),
+                               DBA::escape(Protocol::STATUSNET)
+                       );
+               } elseif ($type == 'm') {
+                       $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
+                               WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
+                               AND `network` IN ('%s', '%s', '%s')
+                               $sql_extra2
+                               ORDER BY `name`",
+                               intval(local_user()),
+                               DBA::escape(Protocol::ACTIVITYPUB),
+                               DBA::escape(Protocol::DFRN),
+                               DBA::escape(Protocol::DIASPORA)
+                       );
+               } elseif ($type == 'a') {
+                       $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact`
+                               WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND NOT `archive`
+                               $sql_extra2
+                               ORDER BY `name`",
+                               intval(local_user())
+                       );
+               } elseif ($type == 'x') {
+                       // autocomplete for global contact search (e.g. navbar search)
+                       $search = Strings::escapeTags(trim($_REQUEST['search']));
+                       $mode = $_REQUEST['smode'];
+                       $page = $_REQUEST['page'] ?? 1;
+
+                       $r = self::contactAutocomplete($search, $mode, $page);
+
+                       $contacts = [];
+                       foreach ($r as $g) {
+                               $contacts[] = [
+                                       'photo'   => ProxyUtils::proxifyUrl($g['photo'], false, ProxyUtils::SIZE_MICRO),
+                                       'name'    => htmlspecialchars($g['name']),
+                                       'nick'    => $g['addr'] ?: $g['url'],
+                                       'network' => $g['network'],
+                                       'link'    => $g['url'],
+                                       'forum'   => !empty($g['community']) ? 1 : 0,
+                               ];
+                       }
+                       $o = [
+                               'start' => $start,
+                               'count' => $count,
+                               'items' => $contacts,
+                       ];
+                       echo json_encode($o);
+                       exit;
+               }
+
+               if (DBA::isResult($r)) {
+                       $forums = [];
+                       foreach ($r as $g) {
+                               $entry = [
+                                       'type'    => 'c',
+                                       'photo'   => ProxyUtils::proxifyUrl($g['micro'], false, ProxyUtils::SIZE_MICRO),
+                                       'name'    => htmlspecialchars($g['name']),
+                                       'id'      => intval($g['id']),
+                                       'network' => $g['network'],
+                                       'link'    => $g['url'],
+                                       'nick'    => htmlentities(defaults($g, 'attag', $g['nick'])),
+                                       'addr'    => htmlentities(defaults($g, 'addr', $g['url'])),
+                                       'forum'   => !empty($g['forum']) || !empty($g['prv']) ? 1 : 0,
+                               ];
+                               if ($entry['forum']) {
+                                       $forums[] = $entry;
+                               } else {
+                                       $contacts[] = $entry;
+                               }
+                       }
+                       if (count($forums) > 0) {
+                               if ($search == '') {
+                                       $forums[] = ['separator' => true];
+                               }
+                               $contacts = array_merge($forums, $contacts);
+                       }
+               }
+
+               $items = array_merge($groups, $contacts);
+
+               if ($conv_id) {
+                       // In multi threaded posts the conv_id is not the parent of the whole thread
+                       $parent_item = Item::selectFirst(['parent'], ['id' => $conv_id]);
+                       if (DBA::isResult($parent_item)) {
+                               $conv_id = $parent_item['parent'];
+                       }
+
+                       /*
+                        * if $conv_id is set, get unknown contacts in thread
+                        * but first get known contacts url to filter them out
+                        */
+                       $known_contacts = array_map(function ($i) {
+                               return $i['link'];
+                       }, $contacts);
+
+                       $unknown_contacts = [];
+
+                       $condition = ["`parent` = ?", $conv_id];
+                       $params = ['order' => ['author-name' => true]];
+                       $authors = Item::selectForUser(local_user(), ['author-link'], $condition, $params);
+                       $item_authors = [];
+                       while ($author = Item::fetch($authors)) {
+                               $item_authors[$author['author-link']] = $author['author-link'];
+                       }
+                       DBA::close($authors);
+
+                       foreach ($item_authors as $author) {
+                               if (in_array($author, $known_contacts)) {
+                                       continue;
+                               }
+
+                               $contact = Contact::getDetailsByURL($author);
+
+                               if (count($contact) > 0) {
+                                       $unknown_contacts[] = [
+                                               'type'    => 'c',
+                                               'photo'   => ProxyUtils::proxifyUrl($contact['micro'], false, ProxyUtils::SIZE_MICRO),
+                                               'name'    => htmlspecialchars($contact['name']),
+                                               'id'      => intval($contact['cid']),
+                                               'network' => $contact['network'],
+                                               'link'    => $contact['url'],
+                                               'nick'    => htmlentities(defaults($contact, 'nick', $contact['addr'])),
+                                               'addr'    => htmlentities(defaults($contact, 'addr', $contact['url'])),
+                                               'forum'   => $contact['forum']
+                                       ];
+                               }
+                       }
+
+                       $items = array_merge($items, $unknown_contacts);
+                       $tot += count($unknown_contacts);
+               }
+
+               $results = [
+                       'tot'      => $tot,
+                       'start'    => $start,
+                       'count'    => $count,
+                       'groups'   => $groups,
+                       'contacts' => $contacts,
+                       'items'    => $items,
+                       'type'     => $type,
+                       'search'   => $search,
+               ];
+
+               Hook::callAll('acl_lookup_end', $results);
+
+               $o = [
+                       'tot'   => $results['tot'],
+                       'start' => $results['start'],
+                       'count' => $results['count'],
+                       'items' => $results['items'],
+               ];
+
+               echo json_encode($o);
+               exit;
+       }
+
+
+       /**
+        * Searching for global contacts for autocompletion
+        *
+        * @brief Searching for global contacts for autocompletion
+        * @param string $search Name or part of a name or nick
+        * @param string $mode   Search mode (e.g. "community")
+        * @param int    $page   Page number (starts at 1)
+        * @return array with the search results
+        * @throws HTTPException\InternalServerErrorException
+        */
+       private static function contactAutocomplete($search, $mode, int $page = 1)
+       {
+               if (Config::get('system', 'block_public') && !Session::isAuthenticated()) {
+                       return [];
+               }
+
+               // don't search if search term has less than 2 characters
+               if (!$search || mb_strlen($search) < 2) {
+                       return [];
+               }
+
+               if (substr($search, 0, 1) === '@') {
+                       $search = substr($search, 1);
+               }
+
+               // check if searching in the local global contact table is enabled
+               if (Config::get('system', 'poco_local_search')) {
+                       $return = GContact::searchByName($search, $mode);
+               } else {
+                       $p = $page > 1 ? 'p=' . $page : '';
+
+                       $curlResult = Network::curl(get_server() . '/lsearch?' . $p . '&search=' . urlencode($search));
+                       if ($curlResult->isSuccess()) {
+                               $lsearch = json_decode($curlResult->getBody(), true);
+                               if (!empty($lsearch['results'])) {
+                                       $return = $lsearch['results'];
+                               }
+                       }
+               }
+
+               return $return ?? [];
+       }
+}
index c1546a634c0b80260453f964972c1f643a4de2ee..1ba4a405210daf066ca902d9fb7e225f887764de 100644 (file)
@@ -188,6 +188,10 @@ return [
                '/{sub1}/{sub2}/{url}' => [Module\Proxy::class, [R::GET]],
        ],
 
+       '/search' => [
+               '/acl'                 => [Module\Search\Acl::class, [R::GET, R::POST]],
+       ],
+
        '/settings' => [
                '/2fa' => [
                        '[/]'           => [Module\Settings\TwoFactor\Index::class,       [R::GET, R::POST]],
index 8b1303e7d3f534e3937f6cc459d441b0385018d7..e2cee43d54464c12b0d07707c208d3ff5a293437 100644 (file)
@@ -466,7 +466,7 @@ function updateConvItems(data) {
                $('body').css('cursor', 'auto');
        }
        /* autocomplete @nicknames */
-       $(".comment-edit-form  textarea").editor_autocomplete(baseurl+"/acl");
+       $(".comment-edit-form  textarea").editor_autocomplete(baseurl + '/search/acl');
        /* autocomplete bbcode */
        $(".comment-edit-form  textarea").bbco_autocomplete('bbcode');
 }
index da86a478bf12d0802c2b54b44357028ea10349a1..58a0f483b8eb8a3bc2c0a32021ac566d686ace71 100644 (file)
@@ -48,7 +48,7 @@
 $(document).ready(function() {
        if(typeof acl=="undefined"){
                acl = new ACL(
-                       baseurl+"/acl",
+                       baseurl + '/search/acl',
                        [ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
                        {{$features.aclautomention}},
                        {{if $APP->is_mobile}}true{{else}}false{{/if}}
index ea562233f442730a5bba8f981454b832d04be4f2..e10491b376b4035ecee39bc0b747777325b67450 100644 (file)
@@ -1,7 +1,7 @@
 
 <script>
 $(document).ready(function() {
-       $("#contacts-search").contact_autocomplete(baseurl + '/acl', 'a', true);
+       $("#contacts-search").contact_autocomplete(baseurl + '/search/acl', 'a', true);
 });
 </script>
 
index b0f0a828e717e49fce08d9ff6f049de7dec66b28..aafa0d69882f43da2da8df20c64115a269b9d5eb 100644 (file)
@@ -6,8 +6,8 @@
 {{/if}}
 <script>
 $(document).ready(function() {
-       $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl");
+       $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl + '/search/acl');
        // make auto-complete work in more places
-       $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl+"/acl");
+       $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl + '/search/acl');
 });
 </script>
index 9e950b98d28ced17728ba56162f1e136011e40bc..7e18d18ff7aa4743321e8f06d7fbb15f43a07a23 100644 (file)
@@ -24,7 +24,7 @@
                        var textlen = $(this).val().length;
                        $('#character-counter').text(textlen);
                });
-               $textarea.editor_autocomplete(baseurl+"/acl");
+               $textarea.editor_autocomplete(baseurl + '/search/acl');
                $textarea.bbco_autocomplete('bbcode');
 
                let $acl_allow_input = $('#acl_allow');
index f169b09212a8c5df75c55e5bbe17e6c86790b952..0d2ad6f6f69ea651fe187719e469c26ad4d1ecd4 100644 (file)
@@ -19,7 +19,7 @@ function initEditor(callback) {
                $("#profile-jot-text-loading").show();
                $("#profile-jot-text-loading").hide();
                $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
-               $("#profile-jot-text").editor_autocomplete(baseurl+"/acl");
+               $("#profile-jot-text").editor_autocomplete(baseurl + '/search/acl');
                $("#profile-jot-text").bbco_autocomplete('bbcode');
                $("a#jot-perms-icon").colorbox(colorbox_options);
                $(".jothidden").show();
index 3fabebc0d267941238c21c083b2e920dbfd41859..fe71bc425b6b9f11e693014bba888567926d7b6d 100644 (file)
@@ -1,7 +1,7 @@
 
 <script>
 $(document).ready(function() {
-       $("#recip").name_autocomplete(baseurl + '/acl', 'm', false, function(data) {
+       $("#recip").name_autocomplete(baseurl + '/search/acl', 'm', false, function(data) {
                $("#recip-complete").val(data.id);
        });
 });
index 4644b954e688251cd494ca8a96f001e574b06d26..bed17f0c79e833c17214be778291777e905f9d6e 100644 (file)
@@ -1,5 +1,5 @@
 <script language="javascript" type="text/javascript">
-       $("#prvmail-text").editor_autocomplete(baseurl + '/acl');
+       $("#prvmail-text").editor_autocomplete(baseurl + '/search/acl');
 </script>
 <script type="text/javascript" src="view/js/ajaxupload.js" ></script>
 <script>
index 7de98d22120192bf88d16252eb1b2ccf8dbe1724..cf9ed53351d7d321389d665d0315e8af9cb38f16 100644 (file)
@@ -1,7 +1,7 @@
 
 <script>
 $(document).ready(function() {
-       $("#poke-recip").name_autocomplete(baseurl + '/acl', 'a', true, function(data) {
+       $("#poke-recip").name_autocomplete(baseurl + '/search/acl', 'a', true, function(data) {
                $("#poke-recip-complete").val(data.id);
        });
 });
index 3208ac4601516524d2c47d4cac3f4bdf3fbcc8b4..c64e0f64547ada48aa9df9a45e9b4202bd9dfb97 100644 (file)
@@ -1,5 +1,5 @@
 <script language="javascript" type="text/javascript">
-       $("#prvmail-text").editor_autocomplete(baseurl+"/acl");
+       $("#prvmail-text").editor_autocomplete(baseurl + '/search/acl');
 </script>
 <script>
 
index 628835a5f0ba1958f977cc9376526fae970ab35a..597563fe1f81b1a828ddfebdc9d45556d4d3dd01 100644 (file)
@@ -58,7 +58,7 @@ $(document).ready(function() {
        var eventPerms = document.getElementById('event-edit-form');
 
        acl = new ACL(
-               baseurl + "/acl",
+               baseurl + '/search/acl',
                [
                        JSON.parse(eventPerms.dataset.allow_cid),
                        JSON.parse(eventPerms.dataset.allow_gid),
index 47415634d12a2bb24725a68a99ce8f0fbc7fa4b8..e335a4f3ccefab08763699cf8caca138712cd67c 100644 (file)
@@ -54,7 +54,7 @@
 $(document).ready(function() {
        if(typeof acl=="undefined"){
                acl = new ACL(
-                       baseurl+"/acl",
+                       baseurl + '/search/acl',
                        [ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
                        {{$features.aclautomention}},
                        {{if $APP->is_mobile}}true{{else}}false{{/if}}
index db2c9afeb912c46239418e3f1964e7c3c3788ee6..9f226cda4997bba86e2e5334738e60bf463f2fb8 100644 (file)
@@ -15,7 +15,7 @@
                        $("#jot-category").show();
                        $("#jot-category").addClass("jot-category-ex");
                        $("#jot-profile-jot-wrapper").show();
-                       $("#profile-jot-text").editor_autocomplete(baseurl+"/acl");
+                       $("#profile-jot-text").editor_autocomplete(baseurl + '/search/acl');
                        $("#profile-jot-text").bbco_autocomplete('bbcode');
                        $("a#jot-perms-icon").colorbox({
                                'inline' : true,
index 209010d7ac98d5f00faa6b4f0ab627048429af9f..a1290c6ca65514ed208f63674487128132f8c683 100644 (file)
@@ -1,6 +1,6 @@
 
 <script type="text/javascript">
-       $("#comment-edit-text-input").editor_autocomplete(baseurl+"/acl");
+       $("#comment-edit-text-input").editor_autocomplete(baseurl + '/search/acl');
 
        $(document).ready(function() {
                $("#comment-edit-text-input").bbco_autocomplete('bbcode');
index 76d841772fe1a11bbf639a56698e906808b9380e..9a562d5b64f4cea82b29320dac3de42d28d11dbe 100644 (file)
@@ -1,6 +1,6 @@
 
 <script type="text/javascript">
 $(document).ready(function() {
-       $("#nav-search-input-field").search_autocomplete(baseurl + '/acl');     
+       $("#nav-search-input-field").search_autocomplete(baseurl + '/search/acl');
 });
 </script>
index b549f1840ddf625bc55f182a0f26af57d968a38e..f30f34a899527a9a2432d45ead26b211d02face3 100644 (file)
@@ -10,7 +10,7 @@ function initEditor(callback) {
                $("#profile-jot-text-loading").show();
                $("#profile-jot-text-loading").hide();
                $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
-               $("#profile-jot-text").editor_autocomplete(baseurl+"/acl");
+               $("#profile-jot-text").editor_autocomplete(baseurl + '/search/acl');
                $("#profile-jot-text").bbco_autocomplete('bbcode');
                $(".jothidden").show();
                $("a#jot-perms-icon").colorbox({
index ff1b96fae8f9f575e9cc67fe1abb05fbe0eb5bf7..b92573f381135a5ed857685f91e9c706901bad97 100644 (file)
@@ -1,6 +1,6 @@
 
 <script>
 $(document).ready(function() {
-       $("#nav-search-text").search_autocomplete(baseurl + '/acl');
+       $("#nav-search-text").search_autocomplete(baseurl + '/search/acl');
 });
 </script>