]> git.mxchange.org Git - friendica.git/commitdiff
Improved contact-id detection
authorMichael <heluecht@pirati.ca>
Thu, 18 Aug 2022 07:48:39 +0000 (07:48 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 18 Aug 2022 07:48:39 +0000 (07:48 +0000)
src/Model/Contact.php
src/Model/Item.php

index 12be608127a802b74ed197afda976609ac4eb74a..60662619281445ae7296836ac84f157245b37721 100644 (file)
@@ -327,14 +327,15 @@ class Contact
        /**
         * Tests if the given contact is a follower
         *
-        * @param int $cid Either public contact id or user's contact id
-        * @param int $uid User ID
+        * @param int  $cid    Either public contact id or user's contact id
+        * @param int  $uid    User ID
+        * @param bool $strict If "true" then contact mustn't be set to pending or readonly
         *
         * @return boolean is the contact id a follower?
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isFollower(int $cid, int $uid): bool
+       public static function isFollower(int $cid, int $uid, bool $strict = false): bool
        {
                if (Contact\User::isBlocked($cid, $uid)) {
                        return false;
@@ -346,20 +347,24 @@ class Contact
                }
 
                $condition = ['id' => $cdata['user'], 'rel' => [self::FOLLOWER, self::FRIEND]];
+               if ($strict) {
+                       $condition = array_merge($condition, ['pending' => false, 'readonly' => false, 'blocked' => false]);
+               }
                return DBA::exists('contact', $condition);
        }
 
        /**
         * Tests if the given contact url is a follower
         *
-        * @param string $url Contact URL
-        * @param int    $uid User ID
+        * @param string $url    Contact URL
+        * @param int    $uid    User ID
+        * @param bool   $strict If "true" then contact mustn't be set to pending or readonly
         *
         * @return boolean is the contact id a follower?
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isFollowerByURL(string $url, int $uid): bool
+       public static function isFollowerByURL(string $url, int $uid, bool $strict = false): bool
        {
                $cid = self::getIdForURL($url, $uid);
 
@@ -367,20 +372,21 @@ class Contact
                        return false;
                }
 
-               return self::isFollower($cid, $uid);
+               return self::isFollower($cid, $uid, $strict);
        }
 
        /**
         * Tests if the given user shares with the given contact
         *
-        * @param int $cid Either public contact id or user's contact id
-        * @param int $uid User ID
+        * @param int  $cid    Either public contact id or user's contact id
+        * @param int  $uid    User ID
+        * @param bool $strict If "true" then contact mustn't be set to pending or readonly
         *
         * @return boolean is the contact sharing with given user?
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isSharing(int $cid, int $uid): bool
+       public static function isSharing(int $cid, int $uid, bool $strict = false): bool
        {
                if (Contact\User::isBlocked($cid, $uid)) {
                        return false;
@@ -392,20 +398,24 @@ class Contact
                }
 
                $condition = ['id' => $cdata['user'], 'rel' => [self::SHARING, self::FRIEND]];
+               if ($strict) {
+                       $condition = array_merge($condition, ['pending' => false, 'readonly' => false, 'blocked' => false]);
+               }
                return DBA::exists('contact', $condition);
        }
 
        /**
         * Tests if the given user follow the given contact url
         *
-        * @param string $url Contact URL
-        * @param int    $uid User ID
+        * @param string $url    Contact URL
+        * @param int    $uid    User ID
+        * @param bool   $strict If "true" then contact mustn't be set to pending or readonly
         *
         * @return boolean is the contact url being followed?
         * @throws HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function isSharingByURL(string $url, int $uid): bool
+       public static function isSharingByURL(string $url, int $uid, bool $strict = false): bool
        {
                $cid = self::getIdForURL($url, $uid);
 
@@ -413,7 +423,7 @@ class Contact
                        return false;
                }
 
-               return self::isSharing($cid, $uid);
+               return self::isSharing($cid, $uid, $strict);
        }
 
        /**
index 702c9dee698a8d8d367d2a010249e2237cd77598..754516193aea35174e1a91557132f73caa77bc5a 100644 (file)
@@ -1660,26 +1660,35 @@ class Item
                $item['origin'] = 0;
                $item['wall'] = 0;
 
-               if ($item['gravity'] == GRAVITY_PARENT) {
-                       $contact = Contact::getByURLForUser($item['owner-link'], $uid, false, ['id']);
-               } else {
-                       $contact = Contact::getByURLForUser($item['author-link'], $uid, false, ['id']);
+               if (!empty($item['causer-id']) && Contact::isSharing($item['causer-id'], $uid, true)) {
+                       $cdata = Contact::getPublicAndUserContactID($item['causer-id'], $uid);
+                       $contact_id = $cdata['user'] ?? 0;
                }
 
-               if (!empty($contact['id'])) {
-                       $item['contact-id'] = $contact['id'];
-               } else {
-                       // Shouldn't happen at all
-                       Logger::warning('contact-id could not be fetched', ['uid' => $uid, 'item' => $item]);
-                       $self = DBA::selectFirst('contact', ['id'], ['self' => true, 'uid' => $uid]);
-                       if (!DBA::isResult($self)) {
-                               // Shouldn't happen even less
-                               Logger::warning('self contact could not be fetched', ['uid' => $uid, 'item' => $item]);
-                               return 0;
+               if (empty($contact_id)) {
+                       if ($item['gravity'] == GRAVITY_PARENT) {
+                               if (Contact::isSharingByURL($item['owner-link'], $uid, true)) {
+                                       $contact_id = Contact::getIdForURL($item['owner-link'], $uid);
+                               } else {
+                                       $contact_id = Contact::getIdForURL($item['owner-link']);
+                               }
+                       } else {
+                               if (Contact::isSharingByURL($item['author-link'], $uid, true)) {
+                                       $contact_id = Contact::getIdForURL($item['author-link'], $uid);
+                               } else {
+                                       $contact_id = Contact::getIdForURL($item['author-link']);
+                               }
                        }
-                       $item['contact-id'] = $self['id'];
                }
 
+               if (empty($contact_id)) {
+                       Logger::warning('contact-id could not be fetched, using self contact instead.', ['uid' => $uid, 'item' => $item]);
+                       $self = Contact::selectFirst(['id'], ['self' => true, 'uid' => $uid]);
+                       $contact_id = $self['id'];
+               }
+
+               $item['contact-id'] = $contact_id;
+
                $notify = false;
                if ($item['gravity'] == GRAVITY_PARENT) {
                        $contact = DBA::selectFirst('contact', [], ['id' => $item['contact-id'], 'self' => false]);