]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Ensure that the public contact exixts before adding a user contact
[friendica.git] / src / Model / Contact.php
index b0ccfd40bfa6a2cf7cec8cfe9f00ec05320924c7..7cb63d490a3e2482d7142e308b5cca248b711b19 100644 (file)
@@ -35,6 +35,7 @@ use Friendica\Core\Worker;
 use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Module\NoScrape;
 use Friendica\Network\HTTPException;
 use Friendica\Network\Probe;
 use Friendica\Protocol\Activity;
@@ -797,11 +798,13 @@ class Contact
        public static function remove($id)
        {
                // We want just to make sure that we don't delete our "self" contact
-               $contact = DBA::selectFirst('contact', ['uri-id', 'photo', 'thumb', 'micro'], ['id' => $id, 'self' => false]);
+               $contact = DBA::selectFirst('contact', ['uri-id', 'photo', 'thumb', 'micro', 'uid'], ['id' => $id, 'self' => false]);
                if (!DBA::isResult($contact)) {
                        return;
                }
 
+               self::clearFollowerFollowingEndpointCache($contact['uid']);
+
                // Archive the contact
                self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]);
 
@@ -899,6 +902,16 @@ class Contact
                self::remove($contact['id']);
        }
 
+       private static function clearFollowerFollowingEndpointCache(int $uid)
+       {
+               if (empty($uid)) {
+                       return;
+               }
+
+               DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'followers:' . $uid);
+               DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'following:' . $uid);
+               DI::cache()->delete(NoScrape::CACHEKEY . $uid);
+       }
 
        /**
         * Marks a contact for archival after a communication issue delay
@@ -1575,6 +1588,10 @@ class Contact
                        return;
                }
 
+               if (Network::isLocalLink($contact['url'])) {
+                       return;
+               }
+
                if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) || DI::config()->get('system', 'cache_contact_avatar')) {
                        if (!empty($contact['avatar']) && (empty($contact['photo']) || empty($contact['thumb']) || empty($contact['micro']))) {
                                Logger::info('Adding avatar cache', ['id' => $cid, 'contact' => $contact]);
@@ -1690,7 +1707,9 @@ class Contact
                        return $contact;
                }
 
-               if (!empty($contact['id']) && !empty($contact['avatar'])) {
+               $local = !empty($contact['url']) && Network::isLocalLink($contact['url']);
+
+               if (!$local && !empty($contact['id']) && !empty($contact['avatar'])) {
                        self::updateAvatar($contact['id'], $contact['avatar'], true);
 
                        $new_contact = self::getById($contact['id'], $contact_fields);
@@ -1698,9 +1717,7 @@ class Contact
                                // We only update the cache fields
                                $contact = array_merge($contact, $new_contact);
                        }
-               }
-
-               if (Network::isLocalLink($contact['url']) && !empty($contact['avatar'])) {
+               } elseif ($local && !empty($contact['avatar'])) {
                        return $contact;
                }
 
@@ -1760,7 +1777,7 @@ class Contact
                                break;
                        default:
                                /**
-                                * Use a random picture. 
+                                * Use a random picture.
                                 * The service provides random pictures from Unsplash.
                                 * @license https://unsplash.com/license
                                 */
@@ -2312,9 +2329,12 @@ class Contact
 
                if ($uid == 0) {
                        if ($ret['network'] == Protocol::ACTIVITYPUB) {
-                               ActivityPub\Processor::fetchFeaturedPosts($ret['url']);
+                               $apcontact = APContact::getByURL($ret['url'], false);
+                               if (!empty($apcontact['featured'])) {
+                                       Worker::add(PRIORITY_LOW, 'FetchFeaturedPosts', $ret['url']);
+                               }
                        }
-       
+
                        $ret['last-item'] = Probe::getLastUpdate($ret);
                        Logger::info('Fetched last item', ['id' => $id, 'probed_url' => $ret['url'], 'last-item' => $ret['last-item'], 'callstack' => System::callstack(20)]);
                }
@@ -2522,6 +2542,9 @@ class Contact
                } else {
                        $probed = true;
                        $ret = Probe::uri($url, $network, $uid);
+
+                       // Ensure that the public contact exists
+                       self::getIdForURL($url);
                }
 
                if (($network != '') && ($ret['network'] != $network)) {
@@ -2700,6 +2723,8 @@ class Contact
                        $contact = DBA::selectFirst('contact', [], ['id' => $cid]);
                }
 
+               self::clearFollowerFollowingEndpointCache($importer['uid']);
+
                if (!empty($contact)) {
                        if (!empty($contact['pending'])) {
                                Logger::info('Pending contact request already exists.', ['url' => $url, 'uid' => $importer['uid']]);
@@ -2823,6 +2848,8 @@ class Contact
                        return;
                }
 
+               self::clearFollowerFollowingEndpointCache($contact['uid']);
+
                $cdata = self::getPublicAndUserContactID($contact['id'], $contact['uid']);
 
                DI::notification()->deleteForUserByVerb($contact['uid'], Activity::FOLLOW, ['actor-id' => $cdata['public']]);
@@ -2837,6 +2864,8 @@ class Contact
         */
        public static function removeSharer(array $contact)
        {
+               self::clearFollowerFollowingEndpointCache($contact['uid']);
+
                if ($contact['rel'] == self::SHARING || in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) {
                        self::remove($contact['id']);
                } else {