]> git.mxchange.org Git - friendica.git/commitdiff
Centralized fetching of the default avatar
authorMichael <heluecht@pirati.ca>
Mon, 7 Dec 2020 06:43:43 +0000 (06:43 +0000)
committerMichael <heluecht@pirati.ca>
Mon, 7 Dec 2020 06:43:43 +0000 (06:43 +0000)
src/Model/Contact.php
src/Model/Photo.php
src/Model/User.php
src/Module/Photo.php
static/defaults.config.php

index 4c173c1be3db6780b4c85883181a81efb444533d..9f7834f6fbf53885dfe364c833d71b25d76ea6c4 100644 (file)
@@ -523,14 +523,14 @@ class Contact
                }
 
                if ($contact['uid'] != 0) {
-                       $pcid = Contact::getIdForURL($contact['url'], 0, false, ['url' => $contact['url']]);
+                       $pcid = self::getIdForURL($contact['url'], 0, false, ['url' => $contact['url']]);
                        if (empty($pcid)) {
                                return [];
                        }
                        $ucid = $contact['id'];
                } else {
                        $pcid = $contact['id'];
-                       $ucid = Contact::getIdForURL($contact['url'], $uid);
+                       $ucid = self::getIdForURL($contact['url'], $uid);
                }
 
                return ['public' => $pcid, 'user' => $ucid];
@@ -645,6 +645,16 @@ class Contact
                        'contact-type' => $user['account-type'], 'prvkey' => $user['prvkey'],
                        'pubkey' => $user['pubkey'], 'xmpp' => $profile['xmpp']];
 
+               // it seems as if ported accounts can have wrong values, so we make sure that now everything is fine.
+               $fields['url'] = DI::baseUrl() . '/profile/' . $user['nickname'];
+               $fields['nurl'] = Strings::normaliseLink($fields['url']);
+               $fields['addr'] = $user['nickname'] . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3);
+               $fields['request'] = DI::baseUrl() . '/dfrn_request/' . $user['nickname'];
+               $fields['notify'] = DI::baseUrl() . '/dfrn_notify/' . $user['nickname'];
+               $fields['poll'] = DI::baseUrl() . '/dfrn_poll/'. $user['nickname'];
+               $fields['confirm'] = DI::baseUrl() . '/dfrn_confirm/' . $user['nickname'];
+               $fields['poco'] = DI::baseUrl() . '/poco/' . $user['nickname'];
+
                $avatar = Photo::selectFirst(['resource-id', 'type'], ['uid' => $uid, 'profile' => true]);
                if (DBA::isResult($avatar)) {
                        if ($update_avatar) {
@@ -668,9 +678,9 @@ class Contact
                        $fields['micro'] = $prefix . '6' . $suffix;
                } else {
                        // We hadn't found a photo entry, so we use the default avatar
-                       $fields['photo'] = DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO;
-                       $fields['thumb'] = DI::baseUrl() . self::DEFAULT_AVATAR_THUMB;
-                       $fields['micro'] = DI::baseUrl() . self::DEFAULT_AVATAR_MICRO;
+                       $fields['photo'] = self::getDefaultAvatar($fields, Proxy::SIZE_SMALL);
+                       $fields['thumb'] = self::getDefaultAvatar($fields, Proxy::SIZE_THUMB);
+                       $fields['micro'] = self::getDefaultAvatar($fields, Proxy::SIZE_MICRO);
                }
 
                $fields['avatar'] = DI::baseUrl() . '/photo/profile/' .$uid . '.' . $file_suffix;
@@ -678,16 +688,6 @@ class Contact
                $fields['prv'] = $user['page-flags'] == User::PAGE_FLAGS_PRVGROUP;
                $fields['unsearchable'] = !$profile['net-publish'];
 
-               // it seems as if ported accounts can have wrong values, so we make sure that now everything is fine.
-               $fields['url'] = DI::baseUrl() . '/profile/' . $user['nickname'];
-               $fields['nurl'] = Strings::normaliseLink($fields['url']);
-               $fields['addr'] = $user['nickname'] . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3);
-               $fields['request'] = DI::baseUrl() . '/dfrn_request/' . $user['nickname'];
-               $fields['notify'] = DI::baseUrl() . '/dfrn_notify/' . $user['nickname'];
-               $fields['poll'] = DI::baseUrl() . '/dfrn_poll/'. $user['nickname'];
-               $fields['confirm'] = DI::baseUrl() . '/dfrn_confirm/' . $user['nickname'];
-               $fields['poco'] = DI::baseUrl() . '/poco/' . $user['nickname'];
-
                $update = false;
 
                foreach ($fields as $field => $content) {
@@ -1475,12 +1475,11 @@ class Contact
         *
         * @param array $contact  contact array
         * @param string $field   Fieldname of the photo in the contact array
-        * @param string $default Default path when no picture had been found
         * @param string $size    Size of the avatar picture
         * @param string $avatar  Avatar path that is displayed when no photo had been found
         * @return string photo path
         */
-       private static function getAvatarPath(array $contact, string $field, string $default, string $size, string $avatar)
+       private static function getAvatarPath(array $contact, string $field, string $size, string $avatar)
        {
                if (!empty($contact)) {
                        $contact = self::checkAvatarCacheByArray($contact);
@@ -1490,7 +1489,7 @@ class Contact
                }
 
                if (empty($avatar)) {
-                       return $default;
+                       $avatar = self::getDefaultAvatar([], $size);
                }
 
                if (Proxy::isLocalImage($avatar)) {
@@ -1509,7 +1508,7 @@ class Contact
         */
        public static function getPhoto(array $contact, string $avatar = '')
        {
-               return self::getAvatarPath($contact, 'photo', DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO, Proxy::SIZE_SMALL, $avatar);
+               return self::getAvatarPath($contact, 'photo', Proxy::SIZE_SMALL, $avatar);
        }
 
        /**
@@ -1521,7 +1520,7 @@ class Contact
         */
        public static function getThumb(array $contact, string $avatar = '')
        {
-               return self::getAvatarPath($contact, 'thumb', DI::baseUrl() . self::DEFAULT_AVATAR_THUMB, Proxy::SIZE_THUMB, $avatar);
+               return self::getAvatarPath($contact, 'thumb', Proxy::SIZE_THUMB, $avatar);
        }
 
        /**
@@ -1533,7 +1532,7 @@ class Contact
         */
        public static function getMicro(array $contact, string $avatar = '')
        {
-               return self::getAvatarPath($contact, 'micro', DI::baseUrl() . self::DEFAULT_AVATAR_MICRO, Proxy::SIZE_MICRO, $avatar);
+               return self::getAvatarPath($contact, 'micro', Proxy::SIZE_MICRO, $avatar);
        }
 
        /**
@@ -1572,18 +1571,71 @@ class Contact
 
                /// add the default avatars if the fields aren't filled
                if (isset($contact['photo']) && empty($contact['photo'])) {
-                       $contact['photo'] = DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO;
+                       $contact['photo'] = self::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
                }
                if (isset($contact['thumb']) && empty($contact['thumb'])) {
-                       $contact['thumb'] = DI::baseUrl() . self::DEFAULT_AVATAR_THUMB;
+                       $contact['thumb'] = self::getDefaultAvatar($contact, Proxy::SIZE_THUMB);
                }
                if (isset($contact['micro']) && empty($contact['micro'])) {
-                       $contact['micro'] = DI::baseUrl() . self::DEFAULT_AVATAR_MICRO;
+                       $contact['micro'] = self::getDefaultAvatar($contact, Proxy::SIZE_MICRO);
                }
 
                return $contact;
        }
 
+       /**
+        * Fetch the default avatar for the given contact and size
+        *
+        * @param array $contact  contact array
+        * @param string $size    Size of the avatar picture
+        * @return void
+        */
+       public static function getDefaultAvatar(array $contact, string $size)
+       {
+               switch ($size) {
+                       case Proxy::SIZE_MICRO:
+                               $avatar['size'] = 48;
+                               $default = self::DEFAULT_AVATAR_MICRO;
+                               break;
+       
+                       case Proxy::SIZE_THUMB:
+                               $avatar['size'] = 80;
+                               $default = self::DEFAULT_AVATAR_THUMB;
+                               break;
+       
+                       case Proxy::SIZE_SMALL:
+                       default:
+                               $avatar['size'] = 300;
+                               $default = self::DEFAULT_AVATAR_PHOTO;
+                               break;
+               }
+
+               if (!DI::config()->get('system', 'remote_avatar_lookup')) {
+                       return DI::baseUrl() . $default;
+               }
+
+               if (!empty($contact['xmpp'])) {
+                       $avatar['email'] = $contact['xmpp'];
+               } elseif (!empty($contact['addr'])) {
+                       $avatar['email'] = $contact['addr'];
+               } elseif (!empty($contact['url'])) {
+                       $avatar['email'] = $contact['url'];
+               } else {
+                       return DI::baseUrl() . $default;
+               }
+
+               $avatar['url'] = '';
+               $avatar['success'] = false;
+
+               Hook::callAll('avatar_lookup', $avatar);
+
+               if ($avatar['success'] && !empty($avatar['url'])) {
+                       return $avatar['url'];
+               }
+
+               return DI::baseUrl() . $default;
+       }
+
        /**
         * Updates the avatar links in a contact only if needed
         *
@@ -1599,7 +1651,8 @@ class Contact
         */
        public static function updateAvatar(int $cid, string $avatar, bool $force = false, bool $create_cache = false)
        {
-               $contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'nurl', 'url', 'network'], ['id' => $cid, 'self' => false]);
+               $contact = DBA::selectFirst('contact', ['uid', 'avatar', 'photo', 'thumb', 'micro', 'xmpp', 'addr', 'nurl', 'url', 'network'],
+                       ['id' => $cid, 'self' => false]);
                if (!DBA::isResult($contact)) {
                        return;
                }
@@ -1624,13 +1677,18 @@ class Contact
                                return;
                        }
                }
-               
-               // Replace cached avatar pictures from the default avatar with the default avatars in different sizes
-               if (strpos($avatar, self::DEFAULT_AVATAR_PHOTO)) {
+
+               $default_avatar = empty($avatar) || ($avatar == DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO);
+
+               if ($default_avatar) {
+                       $avatar = self::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
+               }
+
+               if ($default_avatar && Proxy::isLocalImage($avatar)) {
                        $fields = ['avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(),
-                               'photo' => DI::baseUrl() . self::DEFAULT_AVATAR_PHOTO,
-                               'thumb' => DI::baseUrl() . self::DEFAULT_AVATAR_THUMB,
-                               'micro' => DI::baseUrl() . self::DEFAULT_AVATAR_MICRO];
+                               'photo' => $avatar,
+                               'thumb' => self::getDefaultAvatar($contact, Proxy::SIZE_THUMB),
+                               'micro' => self::getDefaultAvatar($contact, Proxy::SIZE_MICRO)];
                        Logger::debug('Use default avatar', ['id' => $cid, 'uid' => $uid]);
                }
 
@@ -2448,7 +2506,7 @@ class Contact
                                $condition = ['uid' => $importer['uid'], 'url' => $url, 'pending' => true];
                                $fields = ['pending' => false];
                                if ($user['page-flags'] == User::PAGE_FLAGS_FREELOVE) {
-                                       $fields['rel'] = Contact::FRIEND;
+                                       $fields['rel'] = self::FRIEND;
                                }
 
                                DBA::update('contact', $fields, $condition);
@@ -2465,7 +2523,7 @@ class Contact
                if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::SHARING)) {
                        DBA::update('contact', ['rel' => self::SHARING], ['id' => $contact['id']]);
                } else {
-                       Contact::remove($contact['id']);
+                       self::remove($contact['id']);
                }
        }
 
@@ -2474,7 +2532,7 @@ class Contact
                if (($contact['rel'] == self::FRIEND) || ($contact['rel'] == self::FOLLOWER)) {
                        DBA::update('contact', ['rel' => self::FOLLOWER], ['id' => $contact['id']]);
                } else {
-                       Contact::remove($contact['id']);
+                       self::remove($contact['id']);
                }
        }
 
@@ -2495,8 +2553,8 @@ class Contact
                        AND NOT `contact`.`blocked`
                        AND NOT `contact`.`archive`
                        AND NOT `contact`.`deleted`',
-                       Contact::SHARING,
-                       Contact::FRIEND
+                       self::SHARING,
+                       self::FRIEND
                ];
 
                $contacts = DBA::select('contact', ['id', 'uid', 'name', 'url', 'bd'], $condition);
@@ -2531,7 +2589,7 @@ class Contact
                        return [];
                }
 
-               $contacts = Contact::selectToArray(['id'], [
+               $contacts = self::selectToArray(['id'], [
                        'id'      => $contact_ids,
                        'blocked' => false,
                        'pending' => false,
@@ -2699,7 +2757,7 @@ class Contact
 
                // check if we search only communities or every contact
                if ($mode === 'community') {
-                       $extra_sql = sprintf(' AND `contact-type` = %d', Contact::TYPE_COMMUNITY);
+                       $extra_sql = sprintf(' AND `contact-type` = %d', self::TYPE_COMMUNITY);
                } else {
                        $extra_sql = '';
                }
@@ -2732,7 +2790,7 @@ class Contact
                $count = 0;
 
                foreach ($urls as $url) {
-                       $contact = Contact::getByURL($url, false, ['id', 'updated']);
+                       $contact = self::getByURL($url, false, ['id', 'updated']);
                        if (empty($contact['id'])) {
                                Worker::add(PRIORITY_LOW, 'AddContact', 0, $url);
                                ++$added;
index db63f6c596d8856190cea483eb5c2ac6298b6eec..0f03b54b0dbac9677dfaca7ee2cb48a6211f5e76 100644 (file)
@@ -32,6 +32,7 @@ use Friendica\Object\Image;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Images;
 use Friendica\Security\Security;
+use Friendica\Util\Proxy;
 use Friendica\Util\Strings;
 
 require_once "include/dba.php";
@@ -494,9 +495,10 @@ class Photo
                }
 
                if ($photo_failure) {
-                       $image_url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
-                       $thumb = DI::baseUrl() . Contact::DEFAULT_AVATAR_THUMB;
-                       $micro = DI::baseUrl() . Contact::DEFAULT_AVATAR_MICRO;
+                       $contact = Contact::getById($cid) ?: [];
+                       $image_url = Contact::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
+                       $thumb = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB);
+                       $micro = Contact::getDefaultAvatar($contact, Proxy::SIZE_MICRO);
                }
 
                return [$image_url, $thumb, $micro];
index 03ddb4605b8f96d02e38f3b4e9822562dc15c132..bcd555a0ec11c46a8b1bbc6cc858074c22b67c62 100644 (file)
@@ -41,6 +41,7 @@ use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Images;
 use Friendica\Util\Network;
+use Friendica\Util\Proxy;
 use Friendica\Util\Strings;
 use Friendica\Worker\Delivery;
 use ImagickException;
@@ -192,11 +193,12 @@ class User
                $system['name'] = 'System Account';
                $system['addr'] = $system_actor_name . '@' . DI::baseUrl()->getHostname();
                $system['nick'] = $system_actor_name;
-               $system['avatar'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
-               $system['photo'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
-               $system['thumb'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_THUMB;
-               $system['micro'] = DI::baseUrl() . Contact::DEFAULT_AVATAR_MICRO;
                $system['url'] = DI::baseUrl() . '/friendica';
+
+               $system['avatar'] = $system['photo'] = Contact::getDefaultAvatar($system, Proxy::SIZE_SMALL);
+               $system['thumb'] = Contact::getDefaultAvatar($system, Proxy::SIZE_THUMB);
+               $system['micro'] = Contact::getDefaultAvatar($system, Proxy::SIZE_MICRO);
+
                $system['nurl'] = Strings::normaliseLink($system['url']);
                $system['pubkey'] = $keys['pubkey'];
                $system['prvkey'] = $keys['prvkey'];
index 0a0b6d3208399d1f44c3fc70242e57477174d786..a10eeefd5225bc5f8c8413fbe3cee216949f8544 100644 (file)
@@ -23,9 +23,11 @@ namespace Friendica\Module;
 
 use Friendica\BaseModule;
 use Friendica\Core\Logger;
+use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Photo as MPhoto;
+use Friendica\Util\Proxy;
 
 /**
  * Photo Module
@@ -134,28 +136,38 @@ class Photo extends BaseModule
 
        private static function getAvatar($uid, $type="avatar")
        {
-
                switch($type) {
-               case "profile":
-               case "custom":
-                       $scale = 4;
-                       $default = Contact::DEFAULT_AVATAR_PHOTO;
-                       break;
-               case "micro":
-                       $scale = 6;
-                       $default = Contact::DEFAULT_AVATAR_MICRO;
-                       break;
-               case "avatar":
-               default:
-                       $scale = 5;
-                       $default = Contact::DEFAULT_AVATAR_THUMB;
+                       case "profile":
+                       case "custom":
+                               $scale = 4;
+                               break;
+                       case "micro":
+                               $scale = 6;
+                               break;
+                       case "avatar":
+                       default:
+                               $scale = 5;
                }
 
                $photo = MPhoto::selectFirst([], ["scale" => $scale, "uid" => $uid, "profile" => 1]);
-               if ($photo === false) {
+               if (empty($photo)) {
+                       $contact = DBA::selectFirst('contact', ['uid' => $uid, 'self' => true]) ?: [];
+
+                       switch($type) {
+                               case "profile":
+                               case "custom":
+                                       $default = Contact::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
+                                       break;
+                               case "micro":
+                                       $default = Contact::getDefaultAvatar($contact, Proxy::SIZE_MICRO);
+                                       break;
+                               case "avatar":
+                               default:
+                                       $default = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB);
+                       }
+       
                        $photo = MPhoto::createPhotoForSystemResource($default);
                }
                return $photo;
        }
-
 }
index 455272926e8cd4ab01c3d2f6088d74d98441f16e..5b314f927a5184452bbd1f5b6a45ec3bf9c411b3 100644 (file)
@@ -470,6 +470,10 @@ return [
                // Whether to use Cache to store session data or to use PHP native session storage.
                'session_handler' => 'database',
 
+               // remote_avatar_lookup (Boolean)
+               // Perform an avatar lookup via the activated services for remote contacts
+               'remote_avatar_lookup' => false,
+
                // remove_multiplicated_lines (Boolean)
                // If enabled, multiple linefeeds in items are stripped to a single one.
                'remove_multiplicated_lines' => false,