GNU socialのバグ修正(2023年9月3日)

コミット
8611b64

修正内容

修正の詳細

(1) 外部サーバーから「いいね解除」された時の増幅を防止する。

関数「create_notice」の中で、引数の「$object」がすでに DB にある場合、処理を中断します。

plugins/ActivityPub/lib/models/Activitypub_notice.php

diff --git a/plugins/ActivityPub/lib/models/Activitypub_notice.php b/plugins/ActivityPub/lib/models/Activitypub_notice.php
index 14b4c3eae2..e66d263c23 100644
--- a/plugins/ActivityPub/lib/models/Activitypub_notice.php
+++ b/plugins/ActivityPub/lib/models/Activitypub_notice.php
@@ -150,6 +150,12 @@ class Activitypub_notice
         $url = isset($object['url']) ? $object['url'] : $id; // string
         $content = $object['content'];                       // string
 
+        // Avoid duplication
+        if (is_numeric($id) && Notice::getByID((int)$id)) {
+            common_debug('create_notice: not found $id' . $id);
+            return null;
+        }
+
         // possible keys: ['inReplyTo', 'latitude', 'longitude']
         $settings = [];
         if (isset($object['inReplyTo'])) {

(2) 「いいね解除」した事を外部サーバーに通知する。

関数「like_to_array」の中のメソッド「getParent」の呼び出しに条件をつけました。修正前は「いいね解除」に「getParent」を呼び出すと、処理が終了する様でした。

plugins/ActivityPub/lib/models/Activitypub_like.php

diff --git a/plugins/ActivityPub/lib/models/Activitypub_like.php b/plugins/ActivityPub/lib/models/Activitypub_like.php
index 147025b29c..f8fb929d51 100644
--- a/plugins/ActivityPub/lib/models/Activitypub_like.php
+++ b/plugins/ActivityPub/lib/models/Activitypub_like.php
@@ -46,12 +46,18 @@ class Activitypub_like
      */
     public static function like_to_array(string $actor, Notice $notice): array
     {
+       if ($notice->hasParent() && Notice::getByID($notice->reply_to)) {
+               $object = Activitypub_notice::getUri($notice->getParent());
+       } else {
+               // When unlike.
+               $object = Activitypub_notice::getUri($notice);
+       }
         $res = [
             '@context' => 'https://www.w3.org/ns/activitystreams',
             'id'       => Activitypub_notice::getUri($notice),
             'type'     => 'Like',
             'actor'    => $actor,
-            'object'   => Activitypub_notice::getUri($notice->getParent()),
+            'object'   => $object,
         ];
         return $res;
     }

(3) 外部サーバーからの「いいね解除」をローカルDBに反映する。

関数「handle_undo_like」内で「grab_notice_from_url」に渡す URL を変更しました。

plugins/ActivityPub/lib/inbox_handler.php

diff --git a/plugins/ActivityPub/lib/inbox_handler.php b/plugins/ActivityPub/lib/inbox_handler.php
index bbc28c6aad..2e6048d332 100644
--- a/plugins/ActivityPub/lib/inbox_handler.php
+++ b/plugins/ActivityPub/lib/inbox_handler.php
@@ -391,7 +391,9 @@ class Activitypub_inbox_handler
      */
     private function handle_undo_like()
     {
-        $notice = ActivityPubPlugin::grab_notice_from_url($this->activity['id']);
+        $object = $this->activity['object'];
+        $notice_url = $object['object'];
+        $notice = ActivityPubPlugin::grab_notice_from_url($notice_url);
         Fave::removeEntry($this->actor, $notice);
     }