]> git.mxchange.org Git - friendica.git/commitdiff
Issue 11513: Non public replies on public posts should now work
authorMichael <heluecht@pirati.ca>
Thu, 23 Mar 2023 22:25:48 +0000 (22:25 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 23 Mar 2023 22:25:48 +0000 (22:25 +0000)
src/Content/Conversation.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
src/Protocol/ActivityPub/Transmitter.php
src/Worker/Notifier.php

index 249190b1add67c4630aebf2aad6551cd2b5218ff..cdc6e6351f35fbb5b955d7f998f9af60bfc2b73e 100644 (file)
@@ -985,6 +985,8 @@ class Conversation
                $condition = DBA::mergeConditions($condition,
                        ["`uid` IN (0, ?) AND (NOT `vid` IN (?, ?, ?) OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW), Verb::getID(Activity::VIEW), Verb::getID(Activity::READ)]);
 
+               $condition = DBA::mergeConditions($condition, ["(`uid` != ? OR `private` != ?)", 0, ItemModel::PRIVATE]);
+
                $condition = DBA::mergeConditions($condition,
                        ["`visible` AND NOT `deleted` AND NOT `author-blocked` AND NOT `owner-blocked`
                        AND ((NOT `contact-pending` AND (`contact-rel` IN (?, ?))) OR `self` OR `contact-uid` = ?)",
index f96bb196c22f35acbc7ac860d83f9434c2b3117c..42ff0ee12dad34f4fd5c6268f39a4dbd94636469 100644 (file)
@@ -863,11 +863,6 @@ class Processor
                                        Logger::warning('Unknown parent item.', ['uri' => $parent_uri]);
                                        return false;
                                }
-                               if (!empty($activity['type']) && in_array($activity['type'], Receiver::CONTENT_TYPES) && ($item['private'] == Item::PRIVATE) && ($parent['private'] != Item::PRIVATE)) {
-                                       Logger::warning('Item is private but the parent is not. Dropping.', ['item-uri' => $item['uri'], 'thr-parent' => $item['thr-parent']]);
-                                       return false;
-                               }
-
                                $content = self::removeImplicitMentionsFromBody($content, $parent);
                        }
                        $item['content-warning'] = HTML::toBBCode($activity['summary'] ?? '');
index 4b8f1557b88e3aaaa29e85c01406dee915052021..b1de036fd6503b9fcdbf792d751b2a5676cd34be 100644 (file)
@@ -1085,14 +1085,6 @@ class Receiver
                        $reply[] = $object_id;
                }
 
-               if (!empty($reply)) {
-                       $parents = Post::select(['uid'], DBA::mergeConditions(['uri' => $reply], ["`uid` != ?", 0]));
-                       while ($parent = Post::fetch($parents)) {
-                               $receivers[$parent['uid']] = ['uid' => $parent['uid'], 'type' => self::TARGET_ANSWER];
-                       }
-                       DBA::close($parents);
-               }
-
                if (!empty($actor)) {
                        $profile   = APContact::getByURL($actor);
                        $followers = $profile['followers'] ?? '';
@@ -1178,6 +1170,14 @@ class Receiver
                        }
                }
 
+               if (!empty($reply) && (!empty($receivers[0]) || !empty($receivers[-1]))) {
+                       $parents = Post::select(['uid'], DBA::mergeConditions(['uri' => $reply], ["`uid` != ?", 0]));
+                       while ($parent = Post::fetch($parents)) {
+                               $receivers[$parent['uid']] = ['uid' => $parent['uid'], 'type' => self::TARGET_ANSWER];
+                       }
+                       DBA::close($parents);
+               }
+
                self::switchContacts($receivers, $actor);
 
                // "birdsitelive" is a service that mirrors tweets into the fediverse
index 7da110f6716dfd5fb6a2e284e727e19d85e551b8..fb4ed0b4c0d1e4f5b20f03b591fbd3827c45de9f 100644 (file)
@@ -717,7 +717,12 @@ class Transmitter
                }
 
                if (!empty($item['parent'])) {
-                       $parents = Post::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']], ['order' => ['id']]);
+                       if ($item['private'] == Item::PRIVATE) {
+                               $condition = ['parent' => $item['parent'], 'uri-id' => $item['thr-parent-id']];
+                       } else {
+                               $condition = ['parent' => $item['parent']];
+                       }
+                       $parents = Post::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], $condition, ['order' => ['id']]);
                        while ($parent = Post::fetch($parents)) {
                                if ($parent['gravity'] == Item::GRAVITY_PARENT) {
                                        $profile = APContact::getByURL($parent['owner-link'], false);
index 2e42c225fc52837dc502296581733b011e258440..3f5b0fa82900eaaf5974ff7d856f267633cebd22 100644 (file)
@@ -170,13 +170,15 @@ class Notifier
                // Deliver directly to a forum, don't PuSH
                $direct_forum_delivery = false;
 
+               $only_ap_delivery = false;
+
                $followup = false;
                $recipients_followup = [];
 
                if (!empty($target_item) && !empty($items)) {
                        $parent = $items[0];
 
-                       $fields = ['network', 'author-id', 'author-link', 'author-network', 'owner-id'];
+                       $fields = ['network', 'private', 'author-id', 'author-link', 'author-network', 'owner-id'];
                        $condition = ['uri' => $target_item['thr-parent'], 'uid' => $target_item['uid']];
                        $thr_parent = Post::selectFirst($fields, $condition);
                        if (empty($thr_parent)) {
@@ -189,6 +191,11 @@ class Notifier
                                $apdelivery = self::activityPubDelivery($cmd, $target_item, $parent, $thr_parent, $a->getQueueValue('priority'), $a->getQueueValue('created'), $owner);
                                $ap_contacts = $apdelivery['contacts'];
                                $delivery_queue_count += $apdelivery['count'];
+                               if (($thr_parent['network'] == Protocol::ACTIVITYPUB) && ($thr_parent['private'] == Item::PRIVATE)) {
+                                       $only_ap_delivery   = true;
+                                       $public_message     = false;
+                                       $diaspora_delivery  = false;
+                               }
                        }
 
                        // Only deliver threaded replies (comment to a comment) to Diaspora
@@ -421,7 +428,9 @@ class Notifier
                }
 
                if (empty($delivery_contacts_stmt)) {
-                       if ($followup) {
+                       if ($only_ap_delivery) {
+                               $recipients = $ap_contacts;
+                       } elseif ($followup) {
                                $recipients = $recipients_followup;
                        }
                        $condition = ['id' => $recipients, 'self' => false, 'uid' => [0, $uid],