]> git.mxchange.org Git - friendica.git/commitdiff
Prevent to fetch loops
authorMichael <heluecht@pirati.ca>
Thu, 11 Jul 2024 12:19:05 +0000 (12:19 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 11 Jul 2024 12:19:05 +0000 (12:19 +0000)
src/Model/Item.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
src/Worker/FetchMissingActivity.php

index 14e2225d6afe4b1c2265cc443c3738a438817914..a0816b7fa77d6607701a43e307b8fcfe75ad2641 100644 (file)
@@ -4126,6 +4126,10 @@ class Item
                        return $item_id;
                }
 
+               if (ActivityPub\Processor::alreadyKnown($uri, '')) {
+                       return 0;
+               }
+
                $hookData = [
                        'uri'     => $uri,
                        'uid'     => $uid,
index 923e46b473aaba15645b15e3b66c1b8c18a03215..110fc47e0289f64483899b7cd3dd80aebc2be186 100644 (file)
@@ -1702,7 +1702,9 @@ class Processor
                                }
                                Logger::debug('Fetch announced activity', ['type' => $type, 'id' => $object_id, 'actor' => $relay_actor, 'signer' => $signer]);
 
-                               return self::fetchMissingActivity($object_id, $child, $relay_actor, $completion, $uid);
+                               if (!self::alreadyKnown($object_id, $child['id'] ?? '')) {
+                                       return self::fetchMissingActivity($object_id, $child, $relay_actor, $completion, $uid);
+                               }
                        }
                        $activity   = $object;
                        $ldactivity = $ldobject;
@@ -1768,14 +1770,7 @@ class Processor
                        if (is_array($reply)) {
                                $ldobject = JsonLD::compact($reply);
                                $id = JsonLD::fetchElement($ldobject, '@id');
-                               if ($id == $child['id']) {
-                                       Logger::debug('Incluced activity is currently processed', ['replies' => $url, 'id' => $id]);
-                                       continue;
-                               } elseif (Item::searchByLink($id)) {
-                                       Logger::debug('Incluced activity already exists', ['replies' => $url, 'id' => $id]);
-                                       continue;
-                               } elseif (Queue::exists($id, 'as:Create')) {
-                                       Logger::debug('Incluced activity is already queued', ['replies' => $url, 'id' => $id]);
+                               if (Processor::alreadyKnown($id, $child['id'] ?? '')) {
                                        continue;
                                }
                                if (parse_url($id, PHP_URL_HOST) == parse_url($url, PHP_URL_HOST)) {
@@ -1787,14 +1782,7 @@ class Processor
                        } elseif (is_string($reply)) {
                                $id = $reply;
                        }
-                       if ($id == $child['id']) {
-                               Logger::debug('Activity is currently processed', ['replies' => $url, 'id' => $id]);
-                       } elseif (Item::searchByLink($id)) {
-                               Logger::debug('Activity already exists', ['replies' => $url, 'id' => $id]);
-                       } elseif (Queue::exists($id, 'as:Create')) {
-                               Logger::debug('Activity is already queued', ['replies' => $url, 'id' => $id]);
-                       } else {
-                               Logger::debug('Missing Activity will be fetched and processed', ['replies' => $url, 'id' => $id]);
+                       if (!self::alreadyKnown($id, $child['id'] ?? '')) {
                                self::fetchMissingActivity($id, $child, '', Receiver::COMPLETION_REPLIES);
                                ++$fetched;
                        }
@@ -1802,6 +1790,22 @@ class Processor
                Logger::notice('Fetch replies - done', ['fetched' => $fetched, 'total' => count($replies), 'replies' => $url]);
        }
 
+       public static function alreadyKnown(string $id, string $child): bool
+       {
+               if ($id == $child) {
+                       Logger::debug('Activity is currently processed', ['id' => $id, 'child' => $child]);
+                       return true;
+               } elseif (Item::searchByLink($id)) {
+                       Logger::debug('Activity already exists', ['id' => $id, 'child' => $child]);
+                       return true;
+               } elseif (Queue::exists($id, 'as:Create')) {
+                       Logger::debug('Activity is already queued', ['id' => $id, 'child' => $child]);
+                       return true;
+               }
+               Logger::debug('Activity is unknown', ['id' => $id, 'child' => $child]);
+               return false;
+       }
+
        private static function refetchObjectOnHostDifference(array $object, string $url): array
        {
                $ldobject = JsonLD::compact($object);
index de105af8cb589743d8e88036fe1f1752e43c585c..bab386979ae309188e53647689c0ed5b51eb9c2c 100644 (file)
@@ -828,7 +828,7 @@ class Receiver
 
                        case 'as:Announce':
                                if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
-                                       if (!Item::searchByLink($object_data['object_id'], $uid)) {
+                                       if (!Processor::alreadyKnown($object_data['object_id'], '')) {
                                                if (ActivityPub\Processor::fetchMissingActivity($object_data['object_id'], [], $object_data['actor'], self::COMPLETION_ANNOUNCE, $uid)) {
                                                        Logger::debug('Created announced id', ['uid' => $uid, 'id' => $object_data['object_id']]);
                                                        Queue::remove($object_data);
index d45b5c966e213b0af7a13e068216a95eca42f583..ce5de8ec39024fa7b4f95db8a2166fe58f7021fe 100644 (file)
@@ -41,6 +41,10 @@ class FetchMissingActivity
        public static function execute(string $url, array $child = [], string $relay_actor = '', int $completion = Receiver::COMPLETION_MANUAL)
        {
                Logger::info('Start fetching missing activity', ['url' => $url]);
+               if (ActivityPub\Processor::alreadyKnown($url, $child['id'] ?? '')) {
+                       Logger::info('Activity is already known.', ['url' => $url]);
+                       return;
+               }
                $result = ActivityPub\Processor::fetchMissingActivity($url, $child, $relay_actor, $completion);
                if ($result) {
                        Logger::info('Successfully fetched missing activity', ['url' => $url]);