Merge pull request #9324 from annando/endless-contact
authorTobias Diekershoff <tobias.diekershoff@gmx.net>
Wed, 30 Sep 2020 05:19:16 +0000 (07:19 +0200)
committerGitHub <noreply@github.com>
Wed, 30 Sep 2020 05:19:16 +0000 (07:19 +0200)
Endless scrolling on contact page

src/Console/Relay.php
src/Model/Contact.php
src/Module/Admin/Federation.php
src/Protocol/ActivityPub/Receiver.php
src/Protocol/ActivityPub/Transmitter.php

index ab994dc..206726f 100644 (file)
@@ -49,7 +49,7 @@ console relay - Manage ActivityPub relay configuration
 Synopsis
        bin/console relay list [-h|--help|-?] [-v]
        bin/console relay add <actor> [-h|--help|-?] [-v]
-       bin/console relay remove <actor> [-h|--help|-?] [-v]
+       bin/console relay remove <actor> [-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');
index 2212113..1ec1424 100644 (file)
@@ -128,6 +128,7 @@ class Contact
         * Relationship types
         * @{
         */
+       const NOTHING  = 0;
        const FOLLOWER = 1;
        const SHARING  = 2;
        const FRIEND   = 3;
index 1fdd7a5..f5d7cb0 100644 (file)
@@ -161,8 +161,9 @@ class Federation extends BaseAdmin
                        $newVC = $vv['total'];
                        $newVV = $vv['version'];
                        $lastDot = strrpos($newVV, '.');
+                       $firstDash = strpos($newVV, '-');
                        $len = strlen($newVV) - 1;
-                       if (($lastDot == $len - 4) && (!strrpos($newVV, '-rc') == $len - 3)) {
+                       if (($lastDot == $len - 4) && (!strrpos($newVV, '-rc') == $len - 3) && (!$firstDash == $len - 1)) {
                                $newVV = substr($newVV, 0, $lastDot);
                        }
                        if (isset($newV[$newVV])) {
index 67e38fc..69d24a7 100644 (file)
@@ -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);
index b232c8c..54df8e0 100644 (file)
@@ -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;