From 8f20e2054b7cfdfabc1ff7cca54f05925d4a049b Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 3 Oct 2019 22:40:42 -0400 Subject: [PATCH 1/6] Move /acl module to src/ - Move Core\ACL::contactAutocomplete to Module\Search\Acl - Rename module path to /search/acl --- mod/acl.php | 317 ---------------- src/Core/ACL.php | 43 --- src/Module/Search/Acl.php | 374 +++++++++++++++++++ static/routes.config.php | 4 + view/js/main.js | 2 +- view/templates/acl_selector.tpl | 2 +- view/templates/contacts-head.tpl | 2 +- view/templates/display-head.tpl | 4 +- view/templates/item/compose-footer.tpl | 2 +- view/templates/jot-header.tpl | 2 +- view/templates/message-head.tpl | 2 +- view/templates/msg-header.tpl | 2 +- view/templates/poke_head.tpl | 2 +- view/templates/wallmsg-header.tpl | 2 +- view/theme/frio/js/event_edit.js | 2 +- view/theme/frio/templates/acl_selector.tpl | 2 +- view/theme/frio/templates/jot-header.tpl | 2 +- view/theme/frio/templates/msg-header.tpl | 2 +- view/theme/frio/templates/nav_head.tpl | 2 +- view/theme/smoothly/templates/jot-header.tpl | 2 +- view/theme/vier/templates/nav_head.tpl | 2 +- 21 files changed, 396 insertions(+), 378 deletions(-) delete mode 100644 mod/acl.php create mode 100644 src/Module/Search/Acl.php diff --git a/mod/acl.php b/mod/acl.php deleted file mode 100644 index 2b3f2a26c0..0000000000 --- a/mod/acl.php +++ /dev/null @@ -1,317 +0,0 @@ - '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; -} diff --git a/src/Core/ACL.php b/src/Core/ACL.php index 55c174d96b..fd9bfc6e22 100644 --- a/src/Core/ACL.php +++ b/src/Core/ACL.php @@ -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 index 0000000000..07cc9cdac5 --- /dev/null +++ b/src/Module/Search/Acl.php @@ -0,0 +1,374 @@ + '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 ?? []; + } +} diff --git a/static/routes.config.php b/static/routes.config.php index c1546a634c..1ba4a40521 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -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]], diff --git a/view/js/main.js b/view/js/main.js index 8b1303e7d3..e2cee43d54 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -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'); } diff --git a/view/templates/acl_selector.tpl b/view/templates/acl_selector.tpl index da86a478bf..58a0f483b8 100644 --- a/view/templates/acl_selector.tpl +++ b/view/templates/acl_selector.tpl @@ -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}} diff --git a/view/templates/contacts-head.tpl b/view/templates/contacts-head.tpl index ea562233f4..e10491b376 100644 --- a/view/templates/contacts-head.tpl +++ b/view/templates/contacts-head.tpl @@ -1,7 +1,7 @@ diff --git a/view/templates/display-head.tpl b/view/templates/display-head.tpl index b0f0a828e7..aafa0d6988 100644 --- a/view/templates/display-head.tpl +++ b/view/templates/display-head.tpl @@ -6,8 +6,8 @@ {{/if}} diff --git a/view/templates/item/compose-footer.tpl b/view/templates/item/compose-footer.tpl index 9e950b98d2..7e18d18ff7 100644 --- a/view/templates/item/compose-footer.tpl +++ b/view/templates/item/compose-footer.tpl @@ -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'); diff --git a/view/templates/jot-header.tpl b/view/templates/jot-header.tpl index f169b09212..0d2ad6f6f6 100644 --- a/view/templates/jot-header.tpl +++ b/view/templates/jot-header.tpl @@ -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(); diff --git a/view/templates/message-head.tpl b/view/templates/message-head.tpl index 3fabebc0d2..fe71bc425b 100644 --- a/view/templates/message-head.tpl +++ b/view/templates/message-head.tpl @@ -1,7 +1,7 @@ diff --git a/view/theme/smoothly/templates/jot-header.tpl b/view/theme/smoothly/templates/jot-header.tpl index b549f1840d..f30f34a899 100644 --- a/view/theme/smoothly/templates/jot-header.tpl +++ b/view/theme/smoothly/templates/jot-header.tpl @@ -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({ diff --git a/view/theme/vier/templates/nav_head.tpl b/view/theme/vier/templates/nav_head.tpl index ff1b96fae8..b92573f381 100644 --- a/view/theme/vier/templates/nav_head.tpl +++ b/view/theme/vier/templates/nav_head.tpl @@ -1,6 +1,6 @@ From 4e185ebc84dc6a22a8f0e9801b080be23959afb9 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 3 Oct 2019 22:41:11 -0400 Subject: [PATCH 2/6] Add missing /babel route methods --- static/routes.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/routes.config.php b/static/routes.config.php index 1ba4a40521..73ac54991f 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -69,7 +69,7 @@ return [ '/allfriends/{id:\d+}' => [Module\AllFriends::class, [R::GET]], '/apps' => [Module\Apps::class, [R::GET]], '/attach/{item:\d+}' => [Module\Attach::class, [R::GET]], - '/babel' => [Module\Debug\Babel::class, [R::GET]], + '/babel' => [Module\Debug\Babel::class, [R::GET, R::POST]], '/bookmarklet' => [Module\Bookmarklet::class, [R::GET]], '/compose[/{type}]' => [Module\Item\Compose::class, [R::GET, R::POST]], From 445133cb21c377a61c082bfdfa0b1d5e4a2f8b62 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 4 Oct 2019 22:19:54 -0400 Subject: [PATCH 3/6] Move Module\Search\Acl::contactAutocomplete to Core\Search::searchGlobalContact - Replace broken reference to directory /lsearch module with /search module --- src/Core/Search.php | 45 ++++++++++++++ src/Module/Search/Acl.php | 123 ++++++++++++++------------------------ 2 files changed, 91 insertions(+), 77 deletions(-) diff --git a/src/Core/Search.php b/src/Core/Search.php index 90298971a6..495d45d1b5 100644 --- a/src/Core/Search.php +++ b/src/Core/Search.php @@ -5,6 +5,7 @@ namespace Friendica\Core; use Friendica\BaseObject; use Friendica\Database\DBA; use Friendica\Model\Contact; +use Friendica\Model\GContact; use Friendica\Network\HTTPException; use Friendica\Network\Probe; use Friendica\Object\Search\ContactResult; @@ -245,4 +246,48 @@ class Search extends BaseObject return $resultList; } + + + + /** + * 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 + */ + public static function searchGlobalContact($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() . '/search/people?' . $p . '&q=' . urlencode($search), false, ['accept_content' => 'application/json']); + if ($curlResult->isSuccess()) { + $searchResult = json_decode($curlResult->getBody(), true); + if (!empty($searchResult['profiles'])) { + $return = $searchResult['profiles']; + } + } + } + + return $return ?? []; + } } diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 07cc9cdac5..97a55eaf2c 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -4,18 +4,15 @@ 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\Core\Search; 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; @@ -32,10 +29,53 @@ class Acl extends BaseModule throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this module.')); } + $type = $_REQUEST['type'] ?? ''; + + if ($type === 'x') { + $o = self::globalContactSearch(); + } else { + $o = self::regularContactSearch($type); + } + + echo json_encode($o); + exit; + } + + private static function globalContactSearch() + { + // autocomplete for global contact search (e.g. navbar search) + $search = Strings::escapeTags(trim($_REQUEST['search'])); + $mode = $_REQUEST['smode']; + $page = $_REQUEST['page'] ?? 1; + + $r = Search::searchGlobalContact($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' => ($page - 1) * 20, + 'count' => 1000, + 'items' => $contacts, + ]; + + return $o; + } + + private static function regularContactSearch(string $type) + { $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 @@ -194,32 +234,6 @@ class Acl extends BaseModule 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)) { @@ -324,51 +338,6 @@ class Acl extends BaseModule '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 ?? []; + return $o; } } From 9e29321aafd4ba13d5ce588a82f907f0d080dc05 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 4 Oct 2019 22:20:40 -0400 Subject: [PATCH 4/6] Use constants for search type in Module\Search\Acl --- src/Module/Search/Acl.php | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 97a55eaf2c..15d7a23b06 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -23,15 +23,23 @@ use Friendica\Util\Strings; */ class Acl extends BaseModule { + const TYPE_GLOBAL_CONTACT = 'x'; + const TYPE_MENTION_CONTACT = 'c'; + const TYPE_MENTION_GROUP = 'g'; + const TYPE_MENTION_CONTACT_GROUP = ''; + const TYPE_MENTION_FORUM = 'f'; + const TYPE_PRIVATE_MESSAGE = 'm'; + const TYPE_ANY_CONTACT = 'a'; + public static function rawContent() { if (!local_user()) { throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this module.')); } - $type = $_REQUEST['type'] ?? ''; + $type = $_REQUEST['type'] ?? self::TYPE_MENTION_CONTACT_GROUP; - if ($type === 'x') { + if ($type === self::TYPE_GLOBAL_CONTACT) { $o = self::globalContactSearch(); } else { $o = self::regularContactSearch($type); @@ -81,7 +89,7 @@ class Acl extends BaseModule // For use with jquery.textcomplete for private mail completion if (!empty($_REQUEST['query'])) { if (!$type) { - $type = 'm'; + $type = self::TYPE_PRIVATE_MESSAGE; } $search = $_REQUEST['query']; } @@ -98,7 +106,7 @@ class Acl extends BaseModule // count groups and contacts $group_count = 0; - if ($type == '' || $type == 'g') { + if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_GROUP) { $r = q("SELECT COUNT(*) AS g FROM `group` WHERE NOT `deleted` AND `uid` = %d $sql_extra", intval(local_user()) ); @@ -108,7 +116,7 @@ class Acl extends BaseModule $sql_extra2 .= ' ' . Widget::unavailableNetworks(); $contact_count = 0; - if ($type == '' || $type == 'c') { + if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_CONTACT) { // autocomplete for editor mentions $r = q("SELECT COUNT(*) AS c FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `deleted` @@ -117,7 +125,7 @@ class Acl extends BaseModule intval(local_user()) ); $contact_count = (int) $r[0]['c']; - } elseif ($type == 'f') { + } elseif ($type == self::TYPE_MENTION_FORUM) { // autocomplete for editor mentions of forums $r = q("SELECT COUNT(*) AS c FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `deleted` @@ -127,7 +135,7 @@ class Acl extends BaseModule intval(local_user()) ); $contact_count = (int) $r[0]['c']; - } elseif ($type == 'm') { + } elseif ($type == self::TYPE_PRIVATE_MESSAGE) { // autocomplete for Private Messages $r = q("SELECT COUNT(*) AS c FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `deleted` @@ -139,7 +147,7 @@ class Acl extends BaseModule DBA::escape(Protocol::DIASPORA) ); $contact_count = (int) $r[0]['c']; - } elseif ($type == 'a') { + } elseif ($type == self::TYPE_ANY_CONTACT) { // autocomplete for Contacts $r = q("SELECT COUNT(*) AS c FROM `contact` WHERE `uid` = %d AND NOT `self` @@ -154,7 +162,7 @@ class Acl extends BaseModule $groups = []; $contacts = []; - if ($type == '' || $type == 'g') { + if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_GROUP) { /// @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 @@ -187,7 +195,7 @@ class Acl extends BaseModule } $r = []; - if ($type == '') { + if ($type == self::TYPE_MENTION_CONTACT_GROUP) { $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')) @@ -197,7 +205,7 @@ class Acl extends BaseModule DBA::escape(Protocol::OSTATUS), DBA::escape(Protocol::STATUSNET) ); - } elseif ($type == 'c') { + } elseif ($type == self::TYPE_MENTION_CONTACT) { $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')) @@ -206,7 +214,7 @@ class Acl extends BaseModule intval(local_user()), DBA::escape(Protocol::STATUSNET) ); - } elseif ($type == 'f') { + } elseif ($type == self::TYPE_MENTION_FORUM) { $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')) @@ -216,7 +224,7 @@ class Acl extends BaseModule intval(local_user()), DBA::escape(Protocol::STATUSNET) ); - } elseif ($type == 'm') { + } elseif ($type == self::TYPE_PRIVATE_MESSAGE) { $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') @@ -227,7 +235,7 @@ class Acl extends BaseModule DBA::escape(Protocol::DFRN), DBA::escape(Protocol::DIASPORA) ); - } elseif ($type == 'a') { + } elseif ($type == self::TYPE_ANY_CONTACT) { $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 From 908197cc70c15f9337f61152b18f17e054840c17 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 4 Oct 2019 22:27:13 -0400 Subject: [PATCH 5/6] Use switches instead of if/else in Module\Search\Acl --- src/Module/Search/Acl.php | 193 +++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 86 deletions(-) diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 15d7a23b06..9c99d1fc96 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -116,45 +116,55 @@ class Acl extends BaseModule $sql_extra2 .= ' ' . Widget::unavailableNetworks(); $contact_count = 0; - if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_CONTACT) { - // 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 == self::TYPE_MENTION_FORUM) { - // 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 == self::TYPE_PRIVATE_MESSAGE) { - // 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 == self::TYPE_ANY_CONTACT) { - // 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']; + switch ($type) { + case self::TYPE_MENTION_CONTACT_GROUP: + case self::TYPE_MENTION_CONTACT: + // 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']; + break; + + case self::TYPE_MENTION_FORUM: + // 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']; + break; + + case self::TYPE_PRIVATE_MESSAGE: + // 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']; + break; + + case self::TYPE_ANY_CONTACT: + default: + // 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']; + break; } $tot = $group_count + $contact_count; @@ -195,53 +205,64 @@ class Acl extends BaseModule } $r = []; - if ($type == self::TYPE_MENTION_CONTACT_GROUP) { - $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 == self::TYPE_MENTION_CONTACT) { - $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 == self::TYPE_MENTION_FORUM) { - $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 == self::TYPE_PRIVATE_MESSAGE) { - $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 == self::TYPE_ANY_CONTACT) { - $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()) - ); + switch ($type) { + case self::TYPE_MENTION_CONTACT_GROUP: + $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) + ); + break; + + case self::TYPE_MENTION_CONTACT: + $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) + ); + break; + + case self::TYPE_MENTION_FORUM: + $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) + ); + break; + + case self::TYPE_PRIVATE_MESSAGE: + $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) + ); + break; + + case self::TYPE_ANY_CONTACT: + default: + $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()) + ); + break; } if (DBA::isResult($r)) { From b62e20c7bf8daa4180795d8328358d4050171a08 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 5 Oct 2019 08:34:07 -0400 Subject: [PATCH 6/6] Code beautification --- src/Core/Search.php | 2 -- src/Module/Search/Acl.php | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Core/Search.php b/src/Core/Search.php index 495d45d1b5..5792fb1c9e 100644 --- a/src/Core/Search.php +++ b/src/Core/Search.php @@ -247,8 +247,6 @@ class Search extends BaseObject return $resultList; } - - /** * Searching for global contacts for autocompletion * diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 9c99d1fc96..95ebd1cf74 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -23,13 +23,13 @@ use Friendica\Util\Strings; */ class Acl extends BaseModule { - const TYPE_GLOBAL_CONTACT = 'x'; - const TYPE_MENTION_CONTACT = 'c'; - const TYPE_MENTION_GROUP = 'g'; + const TYPE_GLOBAL_CONTACT = 'x'; + const TYPE_MENTION_CONTACT = 'c'; + const TYPE_MENTION_GROUP = 'g'; const TYPE_MENTION_CONTACT_GROUP = ''; - const TYPE_MENTION_FORUM = 'f'; - const TYPE_PRIVATE_MESSAGE = 'm'; - const TYPE_ANY_CONTACT = 'a'; + const TYPE_MENTION_FORUM = 'f'; + const TYPE_PRIVATE_MESSAGE = 'm'; + const TYPE_ANY_CONTACT = 'a'; public static function rawContent() {