Browse Source

Merge pull request #7699 from MrPetovan/task/4090-move-acl-to-src

Move mod/acl to src/Module/Search/Acl
tags/2019.12
Philipp 1 year ago
committed by GitHub
parent
commit
c32fb1547f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 438 additions and 379 deletions
  1. +0
    -317
      mod/acl.php
  2. +0
    -43
      src/Core/ACL.php
  3. +43
    -0
      src/Core/Search.php
  4. +372
    -0
      src/Module/Search/Acl.php
  5. +5
    -1
      static/routes.config.php
  6. +1
    -1
      view/js/main.js
  7. +1
    -1
      view/templates/acl_selector.tpl
  8. +1
    -1
      view/templates/contacts-head.tpl
  9. +2
    -2
      view/templates/display-head.tpl
  10. +1
    -1
      view/templates/item/compose-footer.tpl
  11. +1
    -1
      view/templates/jot-header.tpl
  12. +1
    -1
      view/templates/message-head.tpl
  13. +1
    -1
      view/templates/msg-header.tpl
  14. +1
    -1
      view/templates/poke_head.tpl
  15. +1
    -1
      view/templates/wallmsg-header.tpl
  16. +1
    -1
      view/theme/frio/js/event_edit.js
  17. +1
    -1
      view/theme/frio/templates/acl_selector.tpl
  18. +1
    -1
      view/theme/frio/templates/jot-header.tpl
  19. +1
    -1
      view/theme/frio/templates/msg-header.tpl
  20. +1
    -1
      view/theme/frio/templates/nav_head.tpl
  21. +1
    -1
      view/theme/smoothly/templates/jot-header.tpl
  22. +1
    -1
      view/theme/vier/templates/nav_head.tpl

+ 0
- 317
mod/acl.php View File

@@ -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;
}

+ 0
- 43
src/Core/ACL.php View 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 ?? [];
}
}

+ 43
- 0
src/Core/Search.php View File

@@ -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,46 @@ 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 ?? [];
}
}

+ 372
- 0
src/Module/Search/Acl.php View File

@@ -0,0 +1,372 @@
<?php

namespace Friendica\Module\Search;

use Friendica\BaseModule;
use Friendica\Content\Widget;
use Friendica\Core\Hook;
use Friendica\Core\L10n;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Search;
use Friendica\Database\DBA;
use Friendica\Model\Contact;
use Friendica\Model\Item;
use Friendica\Network\HTTPException;
use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings;

/**
* ACL selector json backend
*
* @package Friendica\Module\Search
*/
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'] ?? self::TYPE_MENTION_CONTACT_GROUP;

if ($type === self::TYPE_GLOBAL_CONTACT) {
$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'] ?? '';
$conv_id = $_REQUEST['conversation'] ?? null;

// For use with jquery.textcomplete for private mail completion
if (!empty($_REQUEST['query'])) {
if (!$type) {
$type = self::TYPE_PRIVATE_MESSAGE;
}
$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 == 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())
);
$group_count = (int) $r[0]['g'];
}

$sql_extra2 .= ' ' . Widget::unavailableNetworks();

$contact_count = 0;
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;

$groups = [];
$contacts = [];

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
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 = [];
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)) {
$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'],
];

return $o;
}
}

+ 5
- 1
static/routes.config.php View File

@@ -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]],

@@ -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]],


+ 1
- 1
view/js/main.js View 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');
}


+ 1
- 1
view/templates/acl_selector.tpl View 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}}


+ 1
- 1
view/templates/contacts-head.tpl View 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>


+ 2
- 2
view/templates/display-head.tpl View 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>

+ 1
- 1
view/templates/item/compose-footer.tpl View 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');


+ 1
- 1
view/templates/jot-header.tpl View 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();


+ 1
- 1
view/templates/message-head.tpl View 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);
});
});


+ 1
- 1
view/templates/msg-header.tpl View 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>


+ 1
- 1
view/templates/poke_head.tpl View 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);
});
});


+ 1
- 1
view/templates/wallmsg-header.tpl View 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>



+ 1
- 1
view/theme/frio/js/event_edit.js View 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),


+ 1
- 1
view/theme/frio/templates/acl_selector.tpl View 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}}


+ 1
- 1
view/theme/frio/templates/jot-header.tpl View 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,


+ 1
- 1
view/theme/frio/templates/msg-header.tpl View 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');


+ 1
- 1
view/theme/frio/templates/nav_head.tpl View 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>

+ 1
- 1
view/theme/smoothly/templates/jot-header.tpl View 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({


+ 1
- 1
view/theme/vier/templates/nav_head.tpl View 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>

Loading…
Cancel
Save