]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Receiver.php
AP: Incoming announces are now stored as activities
[friendica.git] / src / Protocol / ActivityPub / Receiver.php
index 7f67bab7f58194c9497bc688d0792ff8a8554c0d..5db12a1073717d03de30db828690263efd5b5a5b 100644 (file)
@@ -62,16 +62,16 @@ class Receiver
        {
                $http_signer = HTTPSignature::getSigner($body, $header);
                if (empty($http_signer)) {
-                       Logger::log('Invalid HTTP signature, message will be discarded.', Logger::DEBUG);
+                       Logger::warning('Invalid HTTP signature, message will be discarded.');
                        return;
                } else {
-                       Logger::log('HTTP signature is signed by ' . $http_signer, Logger::DEBUG);
+                       Logger::info('Valid HTTP signature', ['signer' => $http_signer]);
                }
 
                $activity = json_decode($body, true);
 
                if (empty($activity)) {
-                       Logger::log('Invalid body.', Logger::DEBUG);
+                       Logger::warning('Invalid body.');
                        return;
                }
 
@@ -79,7 +79,7 @@ class Receiver
 
                $actor = JsonLD::fetchElement($ldactivity, 'as:actor');
 
-               Logger::log('Message for user ' . $uid . ' is from actor ' . $actor, Logger::DEBUG);
+               Logger::info('Message for user ' . $uid . ' is from actor ' . $actor);
 
                if (LDSignature::isSigned($activity)) {
                        $ld_signer = LDSignature::getSigner($activity);
@@ -206,9 +206,12 @@ class Receiver
                                Logger::log("Object data couldn't be processed", Logger::DEBUG);
                                return [];
                        }
+                       $object_data['object_id'] = $object_id;
+
                        // We had been able to retrieve the object data - so we can trust the source
                        $trust_source = true;
-               } elseif (in_array($type, ['as:Like', 'as:Dislike'])) {
+               } elseif (in_array($type, ['as:Like', 'as:Dislike']) ||
+                       (($type == 'as:Follow') && in_array($object_type, self::CONTENT_TYPES))) {
                        // Create a mostly empty array out of the activity data (instead of the object).
                        // This way we later don't have to check for the existence of ech individual array element.
                        $object_data = self::processObject($activity);
@@ -351,9 +354,31 @@ class Receiver
 
                switch ($type) {
                        case 'as:Create':
+                               if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
+                                       ActivityPub\Processor::createItem($object_data);
+                               }
+                               break;
+
                        case 'as:Announce':
                                if (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
+                                       $profile = APContact::getByURL($object_data['actor']);
+                                       if ($profile['type'] == 'Person') {
+                                               // Reshared posts from persons appear as summary at the bottom
+                                               // If this isn't set, then a single reshare appears on top. This is used for groups.
+                                               $object_data['thread-completion'] = true;
+                                       }
                                        ActivityPub\Processor::createItem($object_data);
+
+                                       // Add the bottom reshare information only for persons
+                                       if ($profile['type'] == 'Person') {
+                                               $announce_object_data = self::processObject($activity);
+                                               $announce_object_data['name'] = $type;
+                                               $announce_object_data['author'] = JsonLD::fetchElement($activity, 'as:actor');
+                                               $announce_object_data['object_id'] = $object_data['object_id'];
+                                               $announce_object_data['object_type'] = $object_data['object_type'];
+
+                                               ActivityPub\Processor::createActivity($announce_object_data, ACTIVITY2_ANNOUNCE);
+                                       }
                                }
                                break;
 
@@ -394,6 +419,9 @@ class Receiver
                        case 'as:Follow':
                                if (in_array($object_data['object_type'], self::ACCOUNT_TYPES)) {
                                        ActivityPub\Processor::followUser($object_data);
+                               } elseif (in_array($object_data['object_type'], self::CONTENT_TYPES)) {
+                                       $object_data['reply-to-id'] = $object_data['object_id'];
+                                       ActivityPub\Processor::createActivity($object_data, ACTIVITY_FOLLOW);
                                }
                                break;
 
@@ -503,13 +531,13 @@ class Receiver
 
                                // Check if the potential receiver is following the actor
                                // Exception: The receiver is targetted via "to" or this is a comment
-                               if ((($element != 'as:to') && empty($replyto)) || ($contact['contact-type'] == Contact::ACCOUNT_TYPE_COMMUNITY)) {
+                               if ((($element != 'as:to') && empty($replyto)) || ($contact['contact-type'] == Contact::TYPE_COMMUNITY)) {
                                        $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
                                        $condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND],
                                                'network' => $networks, 'archive' => false, 'pending' => false, 'uid' => $contact['uid']];
 
                                        // Forum posts are only accepted from forum contacts
-                                       if ($contact['contact-type'] == Contact::ACCOUNT_TYPE_COMMUNITY) {
+                                       if ($contact['contact-type'] == Contact::TYPE_COMMUNITY) {
                                                $condition['rel'] = [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER];
                                        }
 
@@ -576,7 +604,7 @@ class Receiver
 
                // When the possible receiver isn't a community, then it is no valid receiver
                $owner = User::getOwnerDataById($contact['uid']);
-               if (empty($owner) || ($owner['contact-type'] != Contact::ACCOUNT_TYPE_COMMUNITY)) {
+               if (empty($owner) || ($owner['contact-type'] != Contact::TYPE_COMMUNITY)) {
                        return false;
                }