X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FProcessor.php;h=7639d0f2a325d97ee6dc3ea6a9f2fb48a4f0d6b4;hb=ce7ec11d1d40b21c68086962791f985d407f1cd1;hp=41aed2fe3be883d03e41f8c9a03540b919b134e3;hpb=496910e750adb48827fe1ce06c766d5f9f067478;p=friendica.git diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 41aed2fe3b..7639d0f2a3 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -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"] .= ','; @@ -373,6 +378,8 @@ class Processor $item['owner-link'] = $activity['actor']; $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true); + $isForum = false; + if (!empty($activity['thread-completion'])) { // Store the original actor in the "causer" fields to enable the check for ignored or blocked contacts $item['causer-link'] = $item['owner-link']; @@ -381,6 +388,9 @@ class Processor Logger::info('Ignoring actor because of thread completion.', ['actor' => $item['owner-link']]); $item['owner-link'] = $item['author-link']; $item['owner-id'] = $item['author-id']; + } else { + $actor = APContact::getByURL($item['owner-link'], false); + $isForum = ($actor['type'] == 'Group'); } $item['uri'] = $activity['id']; @@ -402,7 +412,12 @@ class Processor foreach ($activity['receiver'] as $receiver) { $item['uid'] = $receiver; - $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true); + + if ($isForum) { + $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver, true); + } else { + $item['contact-id'] = Contact::getIdForURL($activity['author'], $receiver, true); + } if (($receiver != 0) && empty($item['contact-id'])) { $item['contact-id'] = Contact::getIdForURL($activity['author'], 0, true); @@ -413,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); } @@ -506,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 = []; @@ -535,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); @@ -546,6 +596,8 @@ class Processor ActivityPub\Receiver::processActivity($ldactivity); Logger::log('Activity ' . $url . ' had been fetched and processed.'); + + return true; } /** @@ -611,7 +663,7 @@ class Processor } Logger::log('Updating profile for ' . $activity['object_id'], Logger::DEBUG); - APContact::getByURL($activity['object_id'], true); + Contact::updateFromProbeByURL($activity['object_id'], true); } /**