]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Merge remote-tracking branch 'upstream/2023.03-rc' into npf2
[friendica.git] / src / Model / Contact.php
index cfd25a1333a8267246c85d13c7e180c3bb205177..8792273eeff4d9b2ffed05051da47450280f8e62 100644 (file)
@@ -239,7 +239,7 @@ class Contact
         * @param array         $condition  condition array with the key values
         * @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields)
         *
-        * @return boolean was the update successfull?
+        * @return boolean was the update successful?
         * @throws \Exception
         * @todo Let's get rid of boolean type of $old_fields
         */
@@ -570,7 +570,7 @@ class Contact
        {
                if (!parse_url($url, PHP_URL_SCHEME)) {
                        $addr_parts = explode('@', $url);
-                       return (count($addr_parts) == 2) && ($addr_parts[1] == DI::baseUrl()->getHostname());
+                       return (count($addr_parts) == 2) && ($addr_parts[1] == DI::baseUrl()->getHost());
                }
 
                return Strings::compareLink(self::getBasepath($url, true), DI::baseUrl());
@@ -1686,7 +1686,7 @@ class Contact
         * Unblocks a contact
         *
         * @param int $cid Contact id to unblock
-        * @return bool Whether it was successfull
+        * @return bool Whether it was successful
         */
        public static function unblock(int $cid): bool
        {
@@ -1733,7 +1733,7 @@ class Contact
         *
         * @param array  $contact   contact array
         * @param string $size      Size of the avatar picture
-        * @param bool   $no_update Don't perfom an update if no cached avatar was found
+        * @param bool   $no_update Don't perform an update if no cached avatar was found
         * @return string photo path
         */
        private static function getAvatarPath(array $contact, string $size, bool $no_update = false): string
@@ -1767,7 +1767,7 @@ class Contact
         * Return the photo path for a given contact array
         *
         * @param array  $contact   Contact array
-        * @param bool   $no_update Don't perfom an update if no cached avatar was found
+        * @param bool   $no_update Don't perform an update if no cached avatar was found
         * @return string photo path
         */
        public static function getPhoto(array $contact, bool $no_update = false): string
@@ -1779,7 +1779,7 @@ class Contact
         * Return the photo path (thumb size) for a given contact array
         *
         * @param array  $contact   Contact array
-        * @param bool   $no_update Don't perfom an update if no cached avatar was found
+        * @param bool   $no_update Don't perform an update if no cached avatar was found
         * @return string photo path
         */
        public static function getThumb(array $contact, bool $no_update = false): string
@@ -1791,7 +1791,7 @@ class Contact
         * Return the photo path (micro size) for a given contact array
         *
         * @param array  $contact   Contact array
-        * @param bool   $no_update Don't perfom an update if no cached avatar was found
+        * @param bool   $no_update Don't perform an update if no cached avatar was found
         * @return string photo path
         */
        public static function getMicro(array $contact, bool $no_update = false): string
@@ -1803,7 +1803,7 @@ class Contact
         * Check the given contact array for avatar cache fields
         *
         * @param array $contact
-        * @param bool  $no_update Don't perfom an update if no cached avatar was found
+        * @param bool  $no_update Don't perform an update if no cached avatar was found
         * @return array contact array with avatar cache fields
         */
        private static function checkAvatarCacheByArray(array $contact, bool $no_update = false): array
@@ -2204,20 +2204,38 @@ class Contact
                        return;
                }
 
+               if (!Network::isValidHttpUrl($avatar)) {
+                       Logger::warning('Invalid avatar', ['cid' => $cid, 'avatar' => $avatar]);
+                       $avatar = '';
+               }
+
                $uid = $contact['uid'];
 
                // Only update the cached photo links of public contacts when they already are cached
                if (($uid == 0) && !$force && empty($contact['thumb']) && empty($contact['micro']) && !$create_cache) {
                        if (($contact['avatar'] != $avatar) || empty($contact['blurhash'])) {
                                $update_fields = ['avatar' => $avatar];
-                               $fetchResult = HTTPSignature::fetchRaw($avatar, 0, [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE]]);
-
-                               $img_str = $fetchResult->getBody();
-                               if (!empty($img_str)) {
-                                       $image = new Image($img_str, Images::getMimeTypeByData($img_str));
-                                       if ($image->isValid()) {
-                                               $update_fields['blurhash'] = $image->getBlurHash();
+                               if (!Network::isLocalLink($avatar)) {
+                                       try {
+                                               $fetchResult = HTTPSignature::fetchRaw($avatar, 0, [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE]]);
+
+                                               $img_str = $fetchResult->getBody();
+                                               if (!empty($img_str)) {
+                                                       $image = new Image($img_str, Images::getMimeTypeByData($img_str));
+                                                       if ($image->isValid()) {
+                                                               $update_fields['blurhash'] = $image->getBlurHash();
+                                                       } else {
+                                                               return;
+                                                       }
+                                               }
+                                       } catch (\Exception $exception) {
+                                               Logger::notice('Error fetching avatar', ['avatar' => $avatar, 'exception' => $exception]);
+                                               return;
                                        }
+                               } elseif (!empty($contact['blurhash'])) {
+                                       $update_fields['blurhash'] = null;
+                               } else {
+                                       return;
                                }
 
                                self::update($update_fields, ['id' => $cid]);
@@ -2968,7 +2986,7 @@ class Contact
                }
 
                // check if we already have a contact
-               $condition = ['uid' => $uid, 'nurl' => Strings::normaliseLink($ret['url'])];
+               $condition = ['uid' => $uid, 'nurl' => Strings::normaliseLink($ret['url']), 'deleted' => false];
                $contact = DBA::selectFirst('contact', ['id', 'rel', 'url', 'pending', 'hub-verify'], $condition);
 
                $protocol = self::getProtocol($ret['url'], $ret['network']);