]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Processor.php
Merge pull request #7570 from nupplaphil/bug/friendica-7298
[friendica.git] / src / Protocol / ActivityPub / Processor.php
index f2aae6af2d352547f0d9b58e5425bdc560fb7c1d..7639d0f2a325d97ee6dc3ea6a9f2fb48a4f0d6b4 100644 (file)
@@ -8,6 +8,7 @@ use Friendica\Database\DBA;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
 use Friendica\Core\Config;
+use Friendica\Core\PConfig;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Model\Contact;
@@ -110,7 +111,11 @@ class Processor
                                        continue;
                                }
 
-                               $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
+                               if (empty($attach['name'])) {
+                                       $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
+                               } else {
+                                       $item['body'] .= "\n[img=" . $attach['url'] . ']' . $attach['name'] . '[/img]';
+                               }
                        } else {
                                if (!empty($item["attach"])) {
                                        $item["attach"] .= ',';
@@ -410,9 +415,7 @@ class Processor
 
                        if ($isForum) {
                                $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, true);
-                       }
-
-                       if (empty($item['contact-id'])) {
+                       } else {
                                $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true);
                        }
 
@@ -425,6 +428,21 @@ class Processor
                                continue;
                        }
 
+                       if (PConfig::get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
+                               $skip = !Contact::isSharingByURL($activity['author'], $receiver);
+
+                               if ($skip && (($activity['type'] == 'as:Announce') || $isForum)) {
+                                       $skip = !Contact::isSharingByURL($activity['actor'], $receiver);
+                               }
+
+                               if ($skip) {
+                                       Logger::info('Skipping post', ['uid' => $receiver, 'url' => $item['uri']]);
+                                       continue;
+                               }
+
+                               Logger::info('Accepting post', ['uid' => $receiver, 'url' => $item['uri']]);
+                       }
+
                        if ($activity['object_type'] == 'as:Event') {
                                self::createEvent($activity, $item);
                        }
@@ -518,27 +536,47 @@ class Processor
        /**
         * Fetches missing posts
         *
-        * @param $url
-        * @param $child
+        * @param string $url message URL
+        * @param array $child activity array with the child of this message
+        * @return boolean success
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function fetchMissingActivity($url, $child)
+       public static function fetchMissingActivity($url, $child = [])
        {
-               if (Config::get('system', 'ostatus_full_threads')) {
-                       return;
+               if (!empty($child['receiver'])) {
+                       $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
+               } else {
+                       $uid = 0;
                }
 
-               $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
-
                $object = ActivityPub::fetchContent($url, $uid);
                if (empty($object)) {
                        Logger::log('Activity ' . $url . ' was not fetchable, aborting.');
-                       return;
+                       return false;
                }
 
                if (empty($object['id'])) {
                        Logger::log('Activity ' . $url . ' has got not id, aborting. ' . json_encode($object));
-                       return;
+                       return false;
+               }
+
+               if (!empty($child['author'])) {
+                       $actor = $child['author'];
+               } elseif (!empty($object['actor'])) {
+                       $actor = $object['actor'];
+               } elseif (!empty($object['attributedTo'])) {
+                       $actor = $object['attributedTo'];
+               } else {
+                       // Shouldn't happen
+                       $actor = '';
+               }
+
+               if (!empty($object['published'])) {
+                       $published = $object['published'];
+               } elseif (!empty($child['published'])) {
+                       $published = $child['published'];
+               } else {
+                       $published = DateTimeFormat::utcNow();
                }
 
                $activity = [];
@@ -547,9 +585,9 @@ class Processor
                $activity['id'] = $object['id'];
                $activity['to'] = defaults($object, 'to', []);
                $activity['cc'] = defaults($object, 'cc', []);
-               $activity['actor'] = $child['author'];
+               $activity['actor'] = $actor;
                $activity['object'] = $object;
-               $activity['published'] = defaults($object, 'published', $child['published']);
+               $activity['published'] = $published;
                $activity['type'] = 'Create';
 
                $ldactivity = JsonLD::compact($activity);
@@ -558,6 +596,8 @@ class Processor
 
                ActivityPub\Receiver::processActivity($ldactivity);
                Logger::log('Activity ' . $url . ' had been fetched and processed.');
+
+               return true;
        }
 
        /**