From d813d72b1ab6ef4acecf8980bc24fbe0543150cf Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 17 Jan 2019 23:06:27 +0000 Subject: [PATCH] Simplyfies AP relaying, fixes relaying of public contacts --- src/Protocol/ActivityPub/Transmitter.php | 24 ++++++++++++++++++------ src/Worker/Delivery.php | 9 ++++++++- src/Worker/Notifier.php | 21 ++++++++++++--------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 04631aa2fb..05d0c45867 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -297,11 +297,16 @@ class Transmitter * * @param array $item * @param boolean $blindcopy + * @param boolean $last_id * * @return array with permission data */ - private static function createPermissionBlockForItem($item, $blindcopy) + private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0) { + if ($last_id == 0) { + $last_id = $item['id']; + } + // Will be activated in a later step // $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]; @@ -356,7 +361,7 @@ class Transmitter $parents = Item::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']]); while ($parent = Item::fetch($parents)) { // Don't include data from future posts - if ($parent['id'] >= $item['id']) { + if ($parent['id'] >= $last_id) { continue; } @@ -472,12 +477,13 @@ class Transmitter * @param array $item * @param integer $uid User ID * @param boolean $personal fetch personal inboxes + * @param integer $last_id Last item id for adding receivers * * @return array with inboxes */ - public static function fetchTargetInboxes($item, $uid, $personal = false) + public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0) { - $permissions = self::createPermissionBlockForItem($item, true); + $permissions = self::createPermissionBlockForItem($item, true, $last_id); if (empty($permissions)) { return []; } @@ -643,9 +649,15 @@ class Transmitter $data['object'] = $item['thr-parent']; } - $owner = User::getOwnerDataById($item['contact-uid']); + if (!empty($item['contact-uid'])) { + $uid = $item['contact-uid']; + } else { + $uid = $item['uid']; + } - if (!$object_mode) { + $owner = User::getOwnerDataById($uid); + + if (!$object_mode && !empty($owner)) { return LDSignature::sign($data, $owner); } else { return $data; diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index 459660f4ea..c6d24657e5 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -88,7 +88,14 @@ class Delivery extends BaseObject return; } - $uid = $target_item['contact-uid']; + if (!empty($target_item['contact-uid'])) { + $uid = $target_item['contact-uid']; + } elseif (!empty($target_item['uid'])) { + $uid = $target_item['uid']; + } else { + Logger::log('Only public users for item ' . $item_id, Logger::DEBUG); + return; + } // avoid race condition with deleting entries if ($items[0]['deleted']) { diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index d82e294d95..e78920baed 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -124,7 +124,16 @@ class Notifier } $parent_id = intval($target_item['parent']); - $uid = $target_item['contact-uid']; + + if (!empty($target_item['contact-uid'])) { + $uid = $target_item['contact-uid']; + } elseif (!empty($target_item['uid'])) { + $uid = $target_item['uid']; + } else { + Logger::log('Only public users for item ' . $item_id, Logger::DEBUG); + return; + } + $updated = $target_item['edited']; $condition = ['parent' => $parent_id, 'visible' => true, 'moderated' => false]; @@ -508,7 +517,6 @@ class Notifier private static function activityPubDelivery($a, $cmd, $item_id, $uid, $target_item, $parent) { $inboxes = []; - $personal = false; if ($target_item['origin']) { $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid); @@ -516,18 +524,13 @@ class Notifier } elseif (!DBA::exists('conversation', ['item-uri' => $target_item['uri'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB])) { Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' is no AP post. It will not be distributed.', Logger::DEBUG); return; - } else { + } elseif ($parent['origin']) { // Remote items are transmitted via the personal inboxes. // Doing so ensures that the dedicated receiver will get the message. - $personal = true; + $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid, true, $item_id); Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' will be distributed.', Logger::DEBUG); } - if ($parent['origin']) { - $parent_inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid, $personal); - $inboxes = array_merge($inboxes, $parent_inboxes); - } - if (empty($inboxes)) { Logger::log('No inboxes found for item ' . $item_id . ' with URL ' . $target_item['uri'] . '. It will not be distributed.', Logger::DEBUG); return;