]> git.mxchange.org Git - friendica.git/commitdiff
Improved completion check for AP
authorMichael <heluecht@pirati.ca>
Sat, 12 Mar 2022 11:17:33 +0000 (11:17 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 12 Mar 2022 11:17:33 +0000 (11:17 +0000)
src/Module/Debug/ActivityPubConversion.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php

index 5de4b93b74222939517e6bf4584871a532833aed..ec7fee3f462ffb2e8a9a9080075efff8b291b889 100644 (file)
@@ -114,6 +114,10 @@ class ActivityPubConversion extends BaseModule
                                        $object_data['thread-completion'] = $activity['thread-completion'];
                                }
 
+                               if (!empty($activity['completion-mode'])) {
+                                       $object_data['completion-mode'] = $activity['completion-mode'];
+                               }
+
                                $results[] = [
                                        'title'   => DI::l10n()->t('Object data'),
                                        'content' => visible_whitespace(var_export($object_data, true))
index 3778a0aa894271864bc265bbe74543d0e3690f34..ae9dd4c7907b24d7845fe020598e7625b57dd945 100644 (file)
@@ -235,7 +235,7 @@ class Processor
 
                if (empty($activity['directmessage']) && ($activity['id'] != $activity['reply-to-id']) && !Post::exists(['uri' => $activity['reply-to-id']])) {
                        Logger::notice('Parent not found. Try to refetch it.', ['parent' => $activity['reply-to-id']]);
-                       self::fetchMissingActivity($activity['reply-to-id'], $activity);
+                       self::fetchMissingActivity($activity['reply-to-id'], $activity, '', Receiver::COMPLETION_AUTO);
                }
 
                $item['diaspora_signed_text'] = $activity['diaspora:comment'] ?? '';
@@ -600,11 +600,9 @@ class Processor
                        return true;
                }
 
-               if (!empty($activity['thread-completion'])) {
-                       // The thread completion mode means that the post is fetched intentionally.
-                       // This can have several causes, in doubt we keep the message.
-                       // This can possibly be improved in the future.
-                       Logger::debug('Message is in completion mode - accepted', ['uri-id' => $item['uri-id'], 'guid' => $item['guid'], 'url' => $item['uri']]);
+               if (in_array($activity['completion-mode'] ?? Receiver::COMPLETION_NONE, [Receiver::COMPLETION_MANUAL, Receiver::COMPLETION_ANNOUCE])) {
+                       // Manual completions and completions caused by reshares are allowed without any further checks.
+                       Logger::debug('Message is in completion mode - accepted', ['mode' => $activity['completion-mode'], 'uri-id' => $item['uri-id'], 'guid' => $item['guid'], 'url' => $item['uri']]);
                        return true;
                }
 
@@ -903,7 +901,7 @@ class Processor
         * @return string fetched message URL
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function fetchMissingActivity(string $url, array $child = [], string $relay_actor = '')
+       public static function fetchMissingActivity(string $url, array $child = [], string $relay_actor = '', int $completion = Receiver::COMPLETION_MANUAL)
        {
                if (!empty($child['receiver'])) {
                        $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
@@ -967,10 +965,13 @@ class Processor
 
                if (!empty($relay_actor)) {
                        $ldactivity['thread-completion'] = $ldactivity['from-relay'] = Contact::getIdForURL($relay_actor);
+                       $ldactivity['completion-mode']   = Receiver::COMPLETION_RELAY;
                } elseif (!empty($child['thread-completion'])) {
                        $ldactivity['thread-completion'] = $child['thread-completion'];
+                       $ldactivity['completion-mode']   = $child['completion-mode'] ?? Receiver::COMPLETION_NONE;
                } else {
                        $ldactivity['thread-completion'] = Contact::getIdForURL($actor);
+                       $ldactivity['completion-mode']   = $completion;
                }
 
                if (!empty($child['type'])) {
index 32994a9d5df51480a3458f8ef88738d5032f16ac..98d40137a9f8a1179eeea2d8260ed890e5ee8bb5 100644 (file)
@@ -68,6 +68,12 @@ class Receiver
        const TARGET_ANSWER = 6;
        const TARGET_GLOBAL = 7;
 
+       const COMPLETION_NONE    = 0;
+       const COMPLETION_ANNOUCE = 1;
+       const COMPLETION_RELAY   = 2;
+       const COMPLETION_MANUAL  = 3;
+       const COMPLETION_AUTO    = 4;
+
        /**
         * Checks incoming message from the inbox
         *
@@ -190,7 +196,7 @@ class Receiver
                        return;
                }
 
-               $id = Processor::fetchMissingActivity($object_id, [], $actor);
+               $id = Processor::fetchMissingActivity($object_id, [], $actor, self::COMPLETION_RELAY);
                if (empty($id)) {
                        Logger::notice('Relayed message had not been fetched', ['id' => $object_id]);
                        return;
@@ -529,6 +535,11 @@ class Receiver
                if (!empty($activity['thread-completion'])) {
                        $object_data['thread-completion'] = $activity['thread-completion'];
                }
+
+               if (!empty($activity['completion-mode'])) {
+                       $object_data['completion-mode'] = $activity['completion-mode'];
+               }
+
                if (!empty($activity['thread-children-type'])) {
                        $object_data['thread-children-type'] = $activity['thread-children-type'];
                }
@@ -555,6 +566,7 @@ class Receiver
                        case 'as:Announce':
                                if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
                                        $object_data['thread-completion'] = Contact::getIdForURL($actor);
+                                       $object_data['completion-mode']   = self::COMPLETION_ANNOUCE;
 
                                        $item = ActivityPub\Processor::createItem($object_data);
                                        if (empty($item)) {