]> git.mxchange.org Git - friendica.git/commitdiff
Relay posts with the original protocol
authorMichael <heluecht@pirati.ca>
Fri, 11 Dec 2020 06:35:38 +0000 (06:35 +0000)
committerMichael <heluecht@pirati.ca>
Fri, 11 Dec 2020 06:35:38 +0000 (06:35 +0000)
src/Protocol/ActivityPub/Transmitter.php
src/Protocol/Diaspora.php
src/Worker/Delivery.php
src/Worker/Notifier.php

index c1443bc3318924ce2285681784b28296c04e4837..378f4c9c640c7a414e0b6fe048912d077f940117 100644 (file)
@@ -469,6 +469,20 @@ class Transmitter
                return $permissions;
        }
 
+       /**
+        * Check if the given item id is from ActivityPub
+        *
+        * @param integer $item_id
+        * @return boolean "true" if the post is from ActivityPub
+        */
+       private static function isAPPost(int $item_id) {
+               if (empty($item_id)) {
+                       return false;
+               }
+
+               return Item::exists(['id' => $item_id, 'network' => Protocol::ACTIVITYPUB]);
+       }
+
        /**
         * Creates an array of permissions from an item thread
         *
@@ -501,7 +515,7 @@ class Transmitter
                        $always_bcc = true;
                }
 
-               if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery')) {
+               if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery') || self::isAPPost($last_id)) {
                        // Will be activated in a later step
                        $networks = Protocol::FEDERATED;
                } else {
@@ -680,12 +694,13 @@ class Transmitter
         *
         * @param integer $uid      User ID
         * @param boolean $personal fetch personal inboxes
+        * @param boolean $all_ap   Retrieve all AP enabled inboxes
         *
         * @return array of follower inboxes
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function fetchTargetInboxesforUser($uid, $personal = false)
+       public static function fetchTargetInboxesforUser($uid, $personal = false, bool $all_ap = false)
        {
                $inboxes = [];
 
@@ -698,7 +713,7 @@ class Transmitter
                        }
                }
 
-               if (DI::config()->get('debug', 'total_ap_delivery')) {
+               if (DI::config()->get('debug', 'total_ap_delivery') || $all_ap) {
                        // Will be activated in a later step
                        $networks = Protocol::FEDERATED;
                } else {
@@ -793,7 +808,7 @@ class Transmitter
                                }
 
                                if ($item_profile && ($receiver == $item_profile['followers']) && ($uid == $profile_uid)) {
-                                       $inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal));
+                                       $inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal, self::isAPPost($last_id)));
                                } else {
                                        if (Contact::isLocal($receiver)) {
                                                continue;
index 7ab41eb52b08ea6bd1b2d9bdbf41e442df4b5f65..54a8d1c1bafc8dc908e515074253df4ac298f419 100644 (file)
@@ -3031,7 +3031,18 @@ class Diaspora
                        $owner['uprvkey'] = $owner['prvkey'];
                }
 
-               $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch);
+               // When sending content to Friendica contacts using the Diaspora protocol
+               // we have to fetch the public key from the fcontact.
+               // This is due to the fact that legacy DFRN had unique keys for every contact.
+               $pubkey = $contact['pubkey'];
+               if (!empty($contact['addr'])) {
+                       $fcontact = FContact::getByURL($contact['addr']);
+                       if (!empty($fcontact)) {
+                               $pubkey = $fcontact['pubkey'];
+                       }
+               }
+
+               $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey, $public_batch);
 
                $return_code = self::transmit($owner, $contact, $envelope, $public_batch, $guid);
 
index 8a84f34a2f07f0c562da6d28b06b151e1b2561ab..1d1e8702b28c60390eea80d29e67fe0d5aa1ed12 100644 (file)
@@ -141,13 +141,7 @@ class Delivery
                                }
                        }
 
-                       // When commenting too fast after delivery, a post wasn't recognized as top level post.
-                       // The count then showed more than one entry. The additional check should help.
-                       // The check for the "count" should be superfluous, but I'm not totally sure by now, so we keep it.
-                       if ((($parent['id'] == $target_id) || (count($items) == 1)) && ($parent['uri'] === $parent['parent-uri'])) {
-                               Logger::log('Top level post');
-                               $top_level = true;
-                       }
+                       $top_level = $target_item['gravity'] == GRAVITY_PARENT;
 
                        // This is IMPORTANT!!!!
 
@@ -211,7 +205,8 @@ class Delivery
                // Transmit via Diaspora if the thread had started as Diaspora post.
                // Also transmit via Diaspora if this is a direct answer to a Diaspora comment.
                // This is done since the uri wouldn't match (Diaspora doesn't transmit it)
-               if (!empty($parent) && !empty($thr_parent) && in_array(Protocol::DIASPORA, [$parent['network'], $thr_parent['network']])) {
+               // Also transmit relayed posts from Diaspora contacts via Diaspora.
+               if (!empty($parent) && !empty($thr_parent) && in_array(Protocol::DIASPORA, [$parent['network'], $thr_parent['network'], $target_item['network']])) {
                        $contact['network'] = Protocol::DIASPORA;
                }
 
index 7359ad1d47b64fee1bea3e8212a525947e019d90..3be00359e53d5a0bc881e49b6669a4b0908cd7f9 100644 (file)
@@ -133,10 +133,7 @@ class Notifier
                                }
                        }
 
-                       if ((count($items) == 1) && ($items[0]['id'] === $target_item['id']) && ($items[0]['uri'] === $items[0]['parent-uri'])) {
-                               Logger::info('Top level post', ['target' => $target_id]);
-                               $top_level = true;
-                       }
+                       $top_level = $target_item['gravity'] == GRAVITY_PARENT;
                }
 
                $owner = User::getOwnerDataById($uid);
@@ -774,11 +771,16 @@ class Notifier
                        return 0;
                }
 
-               // Also don't deliver  when the direct thread parent was delivered via Diaspora
+               // Also don't deliver when the direct thread parent was delivered via Diaspora
                if ($thr_parent['network'] == Protocol::DIASPORA) {
                        return 0;
                }
 
+               // Posts from Diaspora contacts are transmitted via Diaspora
+               if ($target_item['network'] == Protocol::DIASPORA) {
+                       return 0;
+               }
+
                $inboxes = [];
                $relay_inboxes = [];