]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Merge pull request #8392 from MrPetovan/bug/fatal-errors
[friendica.git] / src / Model / Contact.php
index cf08a4cffcd6ec5d422bd55d352ee9782bb08b00..f199012f1f6deac692bd7f9ca8e176f5eef4e071 100644 (file)
@@ -32,6 +32,7 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Notify\Type;
+use Friendica\Network\HTTPException;
 use Friendica\Network\Probe;
 use Friendica\Protocol\Activity;
 use Friendica\Protocol\ActivityPub;
@@ -196,7 +197,7 @@ class Contact
         * @param int $uid User ID
         *
         * @return boolean is the contact id a follower?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function isFollower($cid, $uid)
@@ -221,7 +222,7 @@ class Contact
         * @param int    $uid User ID
         *
         * @return boolean is the contact id a follower?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function isFollowerByURL($url, $uid)
@@ -242,7 +243,7 @@ class Contact
         * @param int $uid User ID
         *
         * @return boolean is the contact url being followed?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function isSharing($cid, $uid)
@@ -267,7 +268,7 @@ class Contact
         * @param int    $uid User ID
         *
         * @return boolean is the contact url being followed?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function isSharingByURL($url, $uid)
@@ -288,7 +289,7 @@ class Contact
         * @param boolean $dont_update Don't update the contact
         *
         * @return string basepath
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function getBasepath($url, $dont_update = false)
@@ -377,7 +378,7 @@ class Contact
         * @param int $uid User ID
         *
         * @return array with public and user's contact id
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function getPublicAndUserContacID($cid, $uid)
@@ -583,7 +584,7 @@ class Contact
         * @param int $uid User ID
         *
         * @return boolean is the contact id blocked for the given user?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function isCollapsedByUser($cid, $uid)
@@ -640,41 +641,12 @@ class Contact
                return $return;
        }
 
-       /**
-        * Returns the count of OStatus contacts in a group
-        *
-        * @param int $gid
-        * @return int
-        * @throws \Exception
-        */
-       public static function getOStatusCountByGroupId($gid)
-       {
-               $return = 0;
-               if (intval($gid)) {
-                       $contacts = DBA::fetchFirst('SELECT COUNT(*) AS `count`
-                               FROM `contact`
-                               INNER JOIN `group_member`
-                                       ON `contact`.`id` = `group_member`.`contact-id`
-                               WHERE `gid` = ?
-                               AND `contact`.`uid` = ?
-                               AND `contact`.`network` = ?
-                               AND `contact`.`notify` != ""',
-                               $gid,
-                               local_user(),
-                               Protocol::OSTATUS
-                       );
-                       $return = $contacts['count'];
-               }
-
-               return $return;
-       }
-
        /**
         * Creates the self-contact for the provided user id
         *
         * @param int $uid
         * @return bool Operation success
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function createSelfFromUserId($uid)
        {
@@ -721,7 +693,7 @@ class Contact
         *
         * @param int     $uid
         * @param boolean $update_avatar Force the avatar update
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function updateSelfFromUserID($uid, $update_avatar = false)
        {
@@ -733,7 +705,7 @@ class Contact
                        return;
                }
 
-               $fields = ['nickname', 'page-flags', 'account-type', 'hidewall'];
+               $fields = ['nickname', 'page-flags', 'account-type'];
                $user = DBA::selectFirst('user', $fields, ['uid' => $uid]);
                if (!DBA::isResult($user)) {
                        return;
@@ -827,7 +799,7 @@ class Contact
         *
         * @param int $id contact id
         * @return null
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function remove($id)
        {
@@ -851,7 +823,7 @@ class Contact
         * @param array   $contact  Contact unfriended
         * @param boolean $dissolve Remove the contact on the remote side
         * @return void
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function terminateFriendship(array $user, array $contact, $dissolve = false)
@@ -904,7 +876,7 @@ class Contact
         *
         * @param array $contact contact to mark for archival
         * @return null
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function markForArchival(array $contact)
        {
@@ -1005,7 +977,7 @@ class Contact
         * @param array  $default If not data was found take this data as default value
         *
         * @return array Contact data
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function getDetailsByURL($url, $uid = -1, array $default = [])
        {
@@ -1066,6 +1038,7 @@ class Contact
                }
 
                if (DBA::isResult($r)) {
+                       $authoritativeResult = true;
                        // If there is more than one entry we filter out the connector networks
                        if (count($r) > 1) {
                                foreach ($r as $id => $result) {
@@ -1099,6 +1072,7 @@ class Contact
                                $profile["bd"] = DBA::NULL_DATE;
                        }
                } else {
+                       $authoritativeResult = false;
                        $profile = $default;
                }
 
@@ -1135,7 +1109,11 @@ class Contact
                        $profile["birthday"] = DBA::NULL_DATE;
                }
 
-               $cache[$url][$uid] = $profile;
+               // Only cache the result if it came from the DB since this method is used in widely different contexts
+               // @see display_fetch_author for an example of $default parameter diverging from the DB result
+               if ($authoritativeResult) {
+                       $cache[$url][$uid] = $profile;
+               }
 
                return $profile;
        }
@@ -1149,7 +1127,7 @@ class Contact
         * @param int    $uid  User id
         *
         * @return array Contact data
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function getDetailsByAddr($addr, $uid = -1)
@@ -1204,7 +1182,7 @@ class Contact
         * @param array $contact contact
         * @param int   $uid     optional, default 0
         * @return array
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function photoMenu(array $contact, $uid = 0)
@@ -1467,7 +1445,7 @@ class Contact
         * @param boolean $in_loop   Internally used variable to prevent an endless loop
         *
         * @return integer Contact ID
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function getIdForURL($url, $uid = 0, $no_update = false, $default = [], $in_loop = false)
@@ -1686,7 +1664,7 @@ class Contact
         * @param int $cid contact id
         *
         * @return boolean Is the contact archived?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function isArchived(int $cid)
        {
@@ -1730,7 +1708,7 @@ class Contact
         * @param int $cid contact id
         *
         * @return boolean Is the contact blocked?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         */
        public static function isBlocked($cid)
        {
@@ -1933,19 +1911,24 @@ class Contact
         * @param int    $cid    Contact id
         * @param bool   $force  force picture update
         *
-        * @return array Returns array of the different avatar sizes
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @return void
+        * @throws HTTPException\InternalServerErrorException
+        * @throws HTTPException\NotFoundException
         * @throws \ImagickException
         */
        public static function updateAvatar($avatar, $uid, $cid, $force = false)
        {
                $contact = DBA::selectFirst('contact', ['avatar', 'photo', 'thumb', 'micro', 'nurl'], ['id' => $cid, 'self' => false]);
                if (!DBA::isResult($contact)) {
-                       return false;
-               } else {
-                       $data = [$contact["photo"], $contact["thumb"], $contact["micro"]];
+                       return;
                }
 
+               $data = [
+                       $contact['photo'] ?? '',
+                       $contact['thumb'] ?? '',
+                       $contact['micro'] ?? '',
+               ];
+
                foreach ($data as $image_uri) {
                        $image_rid = Photo::ridFromURI($image_uri);
                        if ($image_rid && !Photo::exists(['resource-id' => $image_rid, 'uid' => $uid])) {
@@ -1968,12 +1951,8 @@ class Contact
                                                DBA::update('contact', $fields, ['id' => $pcontact['id']]);
                                        }
                                }
-
-                               return $photos;
                        }
                }
-
-               return $data;
        }
 
        /**
@@ -2084,7 +2063,7 @@ class Contact
         * @param string  $network Optional network we are probing for
         * @param boolean $force   Optional forcing of network probing (otherwise we use the cached data)
         * @return boolean
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function updateFromProbe($id, $network = '', $force = false)
@@ -2278,7 +2257,7 @@ class Contact
         * @param bool   $interactive
         * @param string $network
         * @return array
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function createFromProbe($uid, $url, $interactive = false, $network = '')
@@ -2550,7 +2529,7 @@ class Contact
         * @param bool   $sharing  True: Contact is now sharing with Owner; False: Contact is now following Owner (default)
         * @param string $note     Introduction additional message
         * @return bool|null True: follow request is accepted; False: relationship is rejected; Null: relationship is pending
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function addRelationship(array $importer, array $contact, array $datarray, $sharing = false, $note = '')
@@ -2676,8 +2655,17 @@ class Contact
                                        ]);
                                }
                        } elseif (DBA::isResult($user) && in_array($user['page-flags'], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_FREELOVE, User::PAGE_FLAGS_COMMUNITY])) {
+                               if (($user['page-flags'] == User::PAGE_FLAGS_FREELOVE) && ($network != Protocol::DIASPORA)) {
+                                       self::createFromProbe($importer['uid'], $url, false, $network);
+                               }
+
                                $condition = ['uid' => $importer['uid'], 'url' => $url, 'pending' => true];
-                               DBA::update('contact', ['pending' => false], $condition);
+                               $fields = ['pending' => false];
+                               if ($user['page-flags'] == User::PAGE_FLAGS_FREELOVE) {
+                                       $fields['rel'] = Contact::FRIEND;
+                               }
+
+                               DBA::update('contact', $fields, $condition);
 
                                return true;
                        }
@@ -2775,7 +2763,7 @@ class Contact
         * @param string $url         An url that we will be redirected to after the authentication
         *
         * @return string with "redir" link
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function magicLink($contact_url, $url = '')
@@ -2802,7 +2790,7 @@ class Contact
         * @param string  $url An url that we will be redirected to after the authentication
         *
         * @return string with "redir" link
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function magicLinkbyId($cid, $url = '')
@@ -2819,7 +2807,7 @@ class Contact
         * @param string $url     An url that we will be redirected to after the authentication
         *
         * @return string with "redir" link
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
        public static function magicLinkByContact($contact, $url = '')