Merge pull request #7699 from MrPetovan/task/4090-move-acl-to-src
Move mod/acl to src/Module/Search/Acl
This commit is contained in:
commit
c32fb1547f
22 changed files with 438 additions and 379 deletions
317
mod/acl.php
317
mod/acl.php
|
@ -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;
|
|
||||||
}
|
|
|
@ -321,47 +321,4 @@ class ACL extends BaseObject
|
||||||
|
|
||||||
return $o;
|
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 ?? [];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace Friendica\Core;
|
||||||
use Friendica\BaseObject;
|
use Friendica\BaseObject;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
|
use Friendica\Model\GContact;
|
||||||
use Friendica\Network\HTTPException;
|
use Friendica\Network\HTTPException;
|
||||||
use Friendica\Network\Probe;
|
use Friendica\Network\Probe;
|
||||||
use Friendica\Object\Search\ContactResult;
|
use Friendica\Object\Search\ContactResult;
|
||||||
|
@ -245,4 +246,46 @@ class Search extends BaseObject
|
||||||
|
|
||||||
return $resultList;
|
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
src/Module/Search/Acl.php
Normal file
372
src/Module/Search/Acl.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -69,7 +69,7 @@ return [
|
||||||
'/allfriends/{id:\d+}' => [Module\AllFriends::class, [R::GET]],
|
'/allfriends/{id:\d+}' => [Module\AllFriends::class, [R::GET]],
|
||||||
'/apps' => [Module\Apps::class, [R::GET]],
|
'/apps' => [Module\Apps::class, [R::GET]],
|
||||||
'/attach/{item:\d+}' => [Module\Attach::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]],
|
'/bookmarklet' => [Module\Bookmarklet::class, [R::GET]],
|
||||||
'/compose[/{type}]' => [Module\Item\Compose::class, [R::GET, R::POST]],
|
'/compose[/{type}]' => [Module\Item\Compose::class, [R::GET, R::POST]],
|
||||||
|
|
||||||
|
@ -188,6 +188,10 @@ return [
|
||||||
'/{sub1}/{sub2}/{url}' => [Module\Proxy::class, [R::GET]],
|
'/{sub1}/{sub2}/{url}' => [Module\Proxy::class, [R::GET]],
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'/search' => [
|
||||||
|
'/acl' => [Module\Search\Acl::class, [R::GET, R::POST]],
|
||||||
|
],
|
||||||
|
|
||||||
'/settings' => [
|
'/settings' => [
|
||||||
'/2fa' => [
|
'/2fa' => [
|
||||||
'[/]' => [Module\Settings\TwoFactor\Index::class, [R::GET, R::POST]],
|
'[/]' => [Module\Settings\TwoFactor\Index::class, [R::GET, R::POST]],
|
||||||
|
|
|
@ -466,7 +466,7 @@ function updateConvItems(data) {
|
||||||
$('body').css('cursor', 'auto');
|
$('body').css('cursor', 'auto');
|
||||||
}
|
}
|
||||||
/* autocomplete @nicknames */
|
/* autocomplete @nicknames */
|
||||||
$(".comment-edit-form textarea").editor_autocomplete(baseurl+"/acl");
|
$(".comment-edit-form textarea").editor_autocomplete(baseurl + '/search/acl');
|
||||||
/* autocomplete bbcode */
|
/* autocomplete bbcode */
|
||||||
$(".comment-edit-form textarea").bbco_autocomplete('bbcode');
|
$(".comment-edit-form textarea").bbco_autocomplete('bbcode');
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
if(typeof acl=="undefined"){
|
if(typeof acl=="undefined"){
|
||||||
acl = new ACL(
|
acl = new ACL(
|
||||||
baseurl+"/acl",
|
baseurl + '/search/acl',
|
||||||
[ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
|
[ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
|
||||||
{{$features.aclautomention}},
|
{{$features.aclautomention}},
|
||||||
{{if $APP->is_mobile}}true{{else}}false{{/if}}
|
{{if $APP->is_mobile}}true{{else}}false{{/if}}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$("#contacts-search").contact_autocomplete(baseurl + '/acl', 'a', true);
|
$("#contacts-search").contact_autocomplete(baseurl + '/search/acl', 'a', true);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(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
|
// 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>
|
</script>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
var textlen = $(this).val().length;
|
var textlen = $(this).val().length;
|
||||||
$('#character-counter').text(textlen);
|
$('#character-counter').text(textlen);
|
||||||
});
|
});
|
||||||
$textarea.editor_autocomplete(baseurl+"/acl");
|
$textarea.editor_autocomplete(baseurl + '/search/acl');
|
||||||
$textarea.bbco_autocomplete('bbcode');
|
$textarea.bbco_autocomplete('bbcode');
|
||||||
|
|
||||||
let $acl_allow_input = $('#acl_allow');
|
let $acl_allow_input = $('#acl_allow');
|
||||||
|
|
|
@ -19,7 +19,7 @@ function initEditor(callback) {
|
||||||
$("#profile-jot-text-loading").show();
|
$("#profile-jot-text-loading").show();
|
||||||
$("#profile-jot-text-loading").hide();
|
$("#profile-jot-text-loading").hide();
|
||||||
$("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
|
$("#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');
|
$("#profile-jot-text").bbco_autocomplete('bbcode');
|
||||||
$("a#jot-perms-icon").colorbox(colorbox_options);
|
$("a#jot-perms-icon").colorbox(colorbox_options);
|
||||||
$(".jothidden").show();
|
$(".jothidden").show();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(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);
|
$("#recip-complete").val(data.id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script language="javascript" type="text/javascript">
|
<script language="javascript" type="text/javascript">
|
||||||
$("#prvmail-text").editor_autocomplete(baseurl + '/acl');
|
$("#prvmail-text").editor_autocomplete(baseurl + '/search/acl');
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="view/js/ajaxupload.js" ></script>
|
<script type="text/javascript" src="view/js/ajaxupload.js" ></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(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);
|
$("#poke-recip-complete").val(data.id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script language="javascript" type="text/javascript">
|
<script language="javascript" type="text/javascript">
|
||||||
$("#prvmail-text").editor_autocomplete(baseurl+"/acl");
|
$("#prvmail-text").editor_autocomplete(baseurl + '/search/acl');
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ $(document).ready(function() {
|
||||||
var eventPerms = document.getElementById('event-edit-form');
|
var eventPerms = document.getElementById('event-edit-form');
|
||||||
|
|
||||||
acl = new ACL(
|
acl = new ACL(
|
||||||
baseurl + "/acl",
|
baseurl + '/search/acl',
|
||||||
[
|
[
|
||||||
JSON.parse(eventPerms.dataset.allow_cid),
|
JSON.parse(eventPerms.dataset.allow_cid),
|
||||||
JSON.parse(eventPerms.dataset.allow_gid),
|
JSON.parse(eventPerms.dataset.allow_gid),
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
if(typeof acl=="undefined"){
|
if(typeof acl=="undefined"){
|
||||||
acl = new ACL(
|
acl = new ACL(
|
||||||
baseurl+"/acl",
|
baseurl + '/search/acl',
|
||||||
[ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
|
[ {{$allowcid nofilter}},{{$allowgid nofilter}},{{$denycid nofilter}},{{$denygid nofilter}} ],
|
||||||
{{$features.aclautomention}},
|
{{$features.aclautomention}},
|
||||||
{{if $APP->is_mobile}}true{{else}}false{{/if}}
|
{{if $APP->is_mobile}}true{{else}}false{{/if}}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
$("#jot-category").show();
|
$("#jot-category").show();
|
||||||
$("#jot-category").addClass("jot-category-ex");
|
$("#jot-category").addClass("jot-category-ex");
|
||||||
$("#jot-profile-jot-wrapper").show();
|
$("#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');
|
$("#profile-jot-text").bbco_autocomplete('bbcode');
|
||||||
$("a#jot-perms-icon").colorbox({
|
$("a#jot-perms-icon").colorbox({
|
||||||
'inline' : true,
|
'inline' : true,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$("#comment-edit-text-input").editor_autocomplete(baseurl+"/acl");
|
$("#comment-edit-text-input").editor_autocomplete(baseurl + '/search/acl');
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$("#comment-edit-text-input").bbco_autocomplete('bbcode');
|
$("#comment-edit-text-input").bbco_autocomplete('bbcode');
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$("#nav-search-input-field").search_autocomplete(baseurl + '/acl');
|
$("#nav-search-input-field").search_autocomplete(baseurl + '/search/acl');
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -10,7 +10,7 @@ function initEditor(callback) {
|
||||||
$("#profile-jot-text-loading").show();
|
$("#profile-jot-text-loading").show();
|
||||||
$("#profile-jot-text-loading").hide();
|
$("#profile-jot-text-loading").hide();
|
||||||
$("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
|
$("#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');
|
$("#profile-jot-text").bbco_autocomplete('bbcode');
|
||||||
$(".jothidden").show();
|
$(".jothidden").show();
|
||||||
$("a#jot-perms-icon").colorbox({
|
$("a#jot-perms-icon").colorbox({
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$("#nav-search-text").search_autocomplete(baseurl + '/acl');
|
$("#nav-search-text").search_autocomplete(baseurl + '/search/acl');
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue