]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Search/Acl.php
Some more avatar function replacements
[friendica.git] / src / Module / Search / Acl.php
index 97a55eaf2ccdfccef56dc8be0e74e00a4c426903..1e08adbe66dbd918e72dd2102b0f711882279672 100644 (file)
@@ -1,19 +1,37 @@
 <?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 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\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Network\HTTPException;
-use Friendica\Util\Proxy as ProxyUtils;
 use Friendica\Util\Strings;
 
 /**
@@ -23,15 +41,23 @@ use Friendica\Util\Strings;
  */
 class Acl extends BaseModule
 {
-       public static function rawContent()
+       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(array $parameters = [])
        {
                if (!local_user()) {
-                       throw new HTTPException\UnauthorizedException(L10n::t('You must be logged in to use this module.'));
+                       throw new HTTPException\UnauthorizedException(DI::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);
@@ -52,13 +78,18 @@ class Acl extends BaseModule
 
                $contacts = [];
                foreach ($r as $g) {
+                       if (empty($g['name'])) {
+                               DI::logger()->warning('Wrong result item from Search::searchGlobalContact', ['$g' => $g, '$search' => $search, '$mode' => $mode, '$page' => $page]);
+                               continue;
+                       }
+                       $contact = Contact::getByURL($g['url']);
                        $contacts[] = [
-                               'photo'   => ProxyUtils::proxifyUrl($g['photo'], false, ProxyUtils::SIZE_MICRO),
-                               'name'    => htmlspecialchars($g['name']),
-                               'nick'    => $g['addr'] ?: $g['url'],
-                               'network' => $g['network'],
+                               'photo'   => Contact::getMicro($contact, $g['photo']),
+                               'name'    => htmlspecialchars($contact['name'] ?? $g['name']),
+                               'nick'    => $contact['nick'] ?? ($g['addr'] ?: $g['url']),
+                               'network' => $contact['network'] ?? $g['network'],
                                'link'    => $g['url'],
-                               'forum'   => !empty($g['community']) ? 1 : 0,
+                               'forum'   => !empty($g['community']),
                        ];
                }
 
@@ -81,7 +112,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 +129,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,45 +139,55 @@ class Acl extends BaseModule
                $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'];
+               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;
@@ -154,7 +195,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,53 +228,64 @@ class Acl extends BaseModule
                }
 
                $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())
-                       );
+               switch ($type) {
+                       case self::TYPE_MENTION_CONTACT_GROUP:
+                               $r = q("SELECT `id`, `name`, `nick`, `avatar`, `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`, `avatar`, `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`, `avatar`, `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`, `avatar`, `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`, `avatar`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, `avatar` 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)) {
@@ -241,13 +293,13 @@ class Acl extends BaseModule
                        foreach ($r as $g) {
                                $entry = [
                                        'type'    => 'c',
-                                       'photo'   => ProxyUtils::proxifyUrl($g['micro'], false, ProxyUtils::SIZE_MICRO),
+                                       'photo'   => Contact::getMicro($g),
                                        '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'])),
+                                       'nick'    => htmlentities(($g['attag'] ?? '') ?: $g['nick']),
+                                       'addr'    => htmlentities(($g['addr'] ?? '') ?: $g['url']),
                                        'forum'   => !empty($g['forum']) || !empty($g['prv']) ? 1 : 0,
                                ];
                                if ($entry['forum']) {
@@ -297,18 +349,18 @@ class Acl extends BaseModule
                                        continue;
                                }
 
-                               $contact = Contact::getDetailsByURL($author);
+                               $contact = Contact::getByURL($author, false, ['micro', 'name', 'id', 'network', 'nick', 'addr', 'url', 'forum', 'avatar']);
 
                                if (count($contact) > 0) {
                                        $unknown_contacts[] = [
                                                'type'    => 'c',
-                                               'photo'   => ProxyUtils::proxifyUrl($contact['micro'], false, ProxyUtils::SIZE_MICRO),
+                                               'photo'   => Contact::getMicro($contact),
                                                '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'])),
+                                               'nick'    => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']),
+                                               'addr'    => htmlentities(($contact['addr'] ?? '') ?: $contact['url']),
                                                'forum'   => $contact['forum']
                                        ];
                                }