+++ /dev/null
-<?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;
-}
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 ?? [];
- }
}
--- /dev/null
+<?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 ?? [];
+ }
+}
'/{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]],
$('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');
}
$(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}}
<script>
$(document).ready(function() {
- $("#contacts-search").contact_autocomplete(baseurl + '/acl', 'a', true);
+ $("#contacts-search").contact_autocomplete(baseurl + '/search/acl', 'a', true);
});
</script>
{{/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>
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');
$("#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();
<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);
});
});
<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>
<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);
});
});
<script language="javascript" type="text/javascript">
- $("#prvmail-text").editor_autocomplete(baseurl+"/acl");
+ $("#prvmail-text").editor_autocomplete(baseurl + '/search/acl');
</script>
<script>
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),
$(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}}
$("#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,
<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');
<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>
$("#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({
<script>
$(document).ready(function() {
- $("#nav-search-text").search_autocomplete(baseurl + '/acl');
+ $("#nav-search-text").search_autocomplete(baseurl + '/search/acl');
});
</script>