diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 34d45d5ab8..8e1f3853a5 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -663,13 +663,14 @@ class Receiver } if (!empty($actor)) { - $profile = APContact::getByURL($actor); + $profile = APContact::getByURL($actor); $followers = $profile['followers'] ?? ''; - - Logger::log('Actor: ' . $actor . ' - Followers: ' . $followers, Logger::DEBUG); + $is_forum = $actor['type'] == 'Group'; + Logger::info('Got actor and followers', ['actor' => $actor, 'followers' => $followers]); } else { Logger::info('Empty actor', ['activity' => $activity]); $followers = ''; + $is_forum = false; } // We have to prevent false follower assumptions upon thread completions @@ -692,7 +693,7 @@ class Receiver } // Fetch the receivers for the public and the followers collection - if (in_array($receiver, [$followers, self::PUBLIC_COLLECTION]) && !empty($actor)) { + if ((($receiver == $followers) || (($receiver == self::PUBLIC_COLLECTION) && !$is_forum)) && !empty($actor)) { $receivers = self::getReceiverForActor($actor, $tags, $receivers, $follower_target); continue; } diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 4af1bc9148..550b3a4739 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -42,6 +42,7 @@ use Friendica\Protocol\OStatus; use Friendica\Protocol\Relay; use Friendica\Protocol\Salmon; use Friendica\Util\Network; +use Friendica\Util\Strings; /* * The notifier is typically called with: @@ -249,6 +250,20 @@ class Notifier $direct_forum_delivery = true; } + $exclusive_delivery = false; + + $exclusive_targets = Tag::getByURIId($parent['uri-id'], [Tag::EXCLUSIVE_MENTION]); + if (!empty($exclusive_targets)) { + $exclusive_delivery = true; + Logger::info('Possible Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id']]); + foreach ($exclusive_targets as $target) { + if (Strings::compareLink($owner['url'], $target['url'])) { + $exclusive_delivery = false; + Logger::info('False Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]); + } + } + } + if ($relay_to_owner) { // local followup to remote post $followup = true; @@ -283,14 +298,14 @@ class Notifier } Logger::log('Notify ' . $target_item["guid"] .' via PuSH: ' . ($push_notify ? "Yes":"No"), Logger::DEBUG); - } elseif ($targets = Tag::getByURIId($target_item['uri-id'], [Tag::EXCLUSIVE_MENTION])) { + } elseif ($exclusive_delivery) { $followup = true; - foreach ($targets as $target) { + foreach ($exclusive_targets as $target) { $cid = Contact::getIdForURL($target['url'], $uid, false); if ($cid) { $recipients_followup[] = $cid; - Logger::info('Exclusively delivering', ['guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]); + Logger::info('Exclusively delivering', ['uid' => $target_item['uid'], 'guid' => $target_item['guid'], 'uri-id' => $target_item['uri-id'], 'url' => $target['url']]); } } } else {