diff --git a/src/Console/Relay.php b/src/Console/Relay.php index ab994dc62c..206726f6bc 100644 --- a/src/Console/Relay.php +++ b/src/Console/Relay.php @@ -49,7 +49,7 @@ console relay - Manage ActivityPub relay configuration Synopsis bin/console relay list [-h|--help|-?] [-v] bin/console relay add [-h|--help|-?] [-v] - bin/console relay remove [-h|--help|-?] [-v] + bin/console relay remove [-f|--force] [-h|--help|-?] [-v] Description bin/console relay list @@ -62,6 +62,7 @@ Description Remove a relay actor in the format https://relayserver.tld/actor Options + -f|--force Change the relay status in the system even if the unsubscribe message failed -h|--help|-? Show help information -v Show more debug information. HELP; @@ -119,10 +120,14 @@ HELP; $this->out($actor . " couldn't be added"); } } elseif ($mode == 'remove') { - if (Transmitter::sendRelayUndoFollow($actor)) { + $force = $this->getOption(['f', 'force'], false); + + if (Transmitter::sendRelayUndoFollow($actor, $force)) { $this->out('Successfully removed ' . $actor); - } else { + } elseif (!$force) { $this->out($actor . " couldn't be removed"); + } else { + $this->out($actor . " is forcefully removed"); } } else { throw new CommandArgsException($mode . ' is no valid command'); diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 6fde8123a1..6e74241b6f 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -126,6 +126,7 @@ class Contact * Relationship types * @{ */ + const NOTHING = 0; const FOLLOWER = 1; const SHARING = 2; const FRIEND = 3; diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 67e38fcfef..69d24a7abb 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -173,6 +173,17 @@ class Receiver return; } + $contact = Contact::getByURL($actor); + if (empty($contact)) { + Logger::info('Relay contact not found', ['actor' => $actor]); + return; + } + + if (!in_array($contact['rel'], [Contact::SHARING, Contact::FRIEND])) { + Logger::notice('Relay is no sharer', ['actor' => $actor]); + return; + } + Logger::info('Got relayed message id', ['id' => $object_id]); $item_id = Item::searchByLink($object_id); diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index b232c8c7f3..54df8e059e 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -88,15 +88,16 @@ class Transmitter */ public static function sendRelayFollow(string $url) { - $contact_id = Contact::getIdForURL($url); - if (!$contact_id) { + $contact = Contact::getByURL($url); + if (empty($contact)) { return false; } - $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact_id); + $activity_id = ActivityPub\Transmitter::activityIDFromContact($contact['id']); $success = ActivityPub\Transmitter::sendActivity('Follow', $url, 0, $activity_id); if ($success) { - DBA::update('contact', ['rel' => Contact::FRIEND], ['id' => $contact_id]); + $rel = $contact['rel'] == Contact::SHARING ? Contact::FRIEND : Contact::FOLLOWER; + DBA::update('contact', ['rel' => $rel], ['id' => $contact['id']]); } return $success; @@ -105,19 +106,21 @@ class Transmitter /** * Unsubscribe from a relay * - * @param string $url Subscribe actor url + * @param string $url Subscribe actor url + * @param bool $force Set the relay status as non follower even if unsubscribe hadn't worked * @return bool success */ - public static function sendRelayUndoFollow(string $url) + public static function sendRelayUndoFollow(string $url, bool $force = false) { - $contact_id = Contact::getIdForURL($url); - if (!$contact_id) { + $contact = Contact::getByURL($url); + if (empty($contact)) { return false; } - $success = self::sendContactUndo($url, $contact_id, 0); - if ($success) { - DBA::update('contact', ['rel' => Contact::SHARING], ['id' => $contact_id]); + $success = self::sendContactUndo($url, $contact['id'], 0); + if ($success || $force) { + $rel = $contact['rel'] == Contact::FRIEND ? Contact::SHARING : Contact::NOTHING; + DBA::update('contact', ['rel' => $rel], ['id' => $contact['id']]); } return $success;