]> git.mxchange.org Git - friendica.git/commitdiff
AP: ensure that incoming posts are reaching all receivers
authorMichael <heluecht@pirati.ca>
Sun, 5 Jan 2020 17:20:23 +0000 (17:20 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 5 Jan 2020 17:20:23 +0000 (17:20 +0000)
src/Protocol/ActivityPub/Processor.php

index ad1b9d8bdf10490a2f955f04b251dba834e8a3e6..c96a4e704c84505292d78945df5ec0156f406961 100644 (file)
@@ -176,6 +176,9 @@ class Processor
                } else {
                        $item['gravity'] = GRAVITY_COMMENT;
                        $item['object-type'] = Activity\ObjectType::COMMENT;
+
+                       // Ensure that the comment reaches all receivers of the referring post
+                       $activity['receiver'] = self::addReceivers($activity);
                }
 
                if (empty($activity['directmessage']) && ($activity['id'] != $activity['reply-to-id']) && !Item::exists(['uri' => $activity['reply-to-id']])) {
@@ -240,6 +243,35 @@ class Processor
                }
        }
 
+       /**
+        * Add users to the receiver list of the given public activity.
+        * This is used to ensure that the activity will be stored in every thread.
+        *
+        * @param array $activity Activity array
+        * @return array Modified receiver list
+        */
+       private static function addReceivers(array $activity)
+       {
+               if (!in_array(0, $activity['receiver'])) {
+                       // Private activities will not be modified
+                       return $activity['receiver'];
+               }
+
+               // Add all owners of the referring item to the receivers
+               $original = $receivers = $activity['receiver'];
+               $items = Item::select(['uid'], ['uri' => $activity['object_id']]);
+               while ($item = DBA::fetch($items)) {
+                       $receivers['uid:' . $item['uid']] = $item['uid'];
+               }
+               DBA::close($items);
+
+               if (count($original) != count($receivers)) {
+                       Logger::info('Improved data', ['id' => $activity['id'], 'object' => $activity['object_id'], 'original' => $original, 'improved' => $receivers]);
+               }
+
+               return $receivers;
+       }
+
        /**
         * Prepare the item array for an activity
         *
@@ -258,6 +290,8 @@ class Processor
 
                $item['diaspora_signed_text'] = $activity['diaspora:like'] ?? '';
 
+               $activity['receiver'] = self::addReceivers($activity);
+
                self::postItem($activity, $item);
        }