From ab43d3ddc41db39003c900d04ab0a19a6fb81293 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 5 Jan 2020 17:20:23 +0000 Subject: [PATCH] AP: ensure that incoming posts are reaching all receivers --- src/Protocol/ActivityPub/Processor.php | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index ad1b9d8bdf..c96a4e704c 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -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); }