X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FReceiver.php;h=6797330442ab5b91bf1dc50e2b07dda97c7ac672;hb=8720561e49d2d5889fa4f4fd611efc790258ad1c;hp=4de28fc2a89becd2764cc351fba6c12bb745db59;hpb=71afbabbd8a6ae24d86c052c3bf127a5594595fe;p=friendica.git diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 4de28fc2a8..6797330442 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -39,6 +39,7 @@ use Friendica\Protocol\ActivityPub; use Friendica\Util\HTTPSignature; use Friendica\Util\JsonLD; use Friendica\Util\LDSignature; +use Friendica\Util\Network; use Friendica\Util\Strings; /** @@ -384,7 +385,7 @@ class Receiver } else { $object_data['directmessage'] = JsonLD::fetchElement($activity, 'litepub:directMessage'); } - } elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Follow'])) && in_array($object_type, self::CONTENT_TYPES)) { + } elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Follow', 'litepub:EmojiReact', 'as:View'])) && 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 each individual array element. $object_data = self::processObject($activity); @@ -577,8 +578,7 @@ class Receiver if ($object_data['object_type'] == 'as:tag') { ActivityPub\Processor::addTag($object_data); } elseif (in_array($object_data['object_type'], self::CONTENT_TYPES)) { - // Seems to be used by Mastodon to announce that a post is pinned - self::storeUnhandledActivity(false, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); + ActivityPub\Processor::addToFeaturedCollection($object_data); } elseif ($object_data['object_type'] == '') { // The object type couldn't be determined. We don't have it and we can't fetch it. We ignore this activity. } else { @@ -670,8 +670,7 @@ class Receiver case 'as:Block': if (in_array($object_data['object_type'], self::ACCOUNT_TYPES)) { - // Used by Mastodon to announce that the sender has blocked the account - self::storeUnhandledActivity(false, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); + ActivityPub\Processor::blockAccount($object_data); } else { self::storeUnhandledActivity(true, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); } @@ -679,8 +678,7 @@ class Receiver case 'as:Remove': if (in_array($object_data['object_type'], self::CONTENT_TYPES)) { - // Seems to be used by Mastodon to remove the pinned status of a post - self::storeUnhandledActivity(false, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); + ActivityPub\Processor::removeFromFeaturedCollection($object_data); } elseif ($object_data['object_type'] == '') { // The object type couldn't be determined. We don't have it and we can't fetch it. We ignore this activity. } else { @@ -729,11 +727,14 @@ class Receiver } elseif (($object_data['object_type'] == 'as:Accept') && in_array($object_data['object_object_type'], self::ACCOUNT_TYPES)) { ActivityPub\Processor::rejectFollowUser($object_data); + } elseif (($object_data['object_type'] == 'as:Block') && + in_array($object_data['object_object_type'], self::ACCOUNT_TYPES)) { + ActivityPub\Processor::unblockAccount($object_data); } elseif (in_array($object_data['object_type'], array_merge(self::ACTIVITY_TYPES, ['as:Announce'])) && in_array($object_data['object_object_type'], array_merge(['as:Tombstone'], self::CONTENT_TYPES))) { ActivityPub\Processor::undoActivity($object_data); } elseif (in_array($object_data['object_type'], array_merge(self::ACTIVITY_TYPES, ['as:Announce', 'as:Create', ''])) && - ($object_data['object_object_type'] == '')) { + empty($object_data['object_object_type'])) { // We cannot detect the target object. So we can ignore it. } elseif (in_array($object_data['object_type'], ['as:Create']) && in_array($object_data['object_object_type'], ['pt:CacheFile'])) { @@ -744,8 +745,10 @@ class Receiver break; case 'as:View': - if (in_array($object_data['object_type'], ['as:Note', 'as:Video'])) { - // Unhandled Peertube activity + if (in_array($object_data['object_type'], self::CONTENT_TYPES)) { + ActivityPub\Processor::createActivity($object_data, Activity::VIEW); + } elseif ($object_data['object_type'] == '') { + // The object type couldn't be determined. Most likely we don't have it here. We ignore this activity. } else { self::storeUnhandledActivity(true, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); } @@ -753,7 +756,9 @@ class Receiver case 'litepub:EmojiReact': if (in_array($object_data['object_type'], self::CONTENT_TYPES)) { - // Unhandled Pleroma activity to react to a post via an emoji + ActivityPub\Processor::createActivity($object_data, Activity::EMOJIREACT); + } elseif ($object_data['object_type'] == '') { + // The object type couldn't be determined. We don't have it and we can't fetch it. We ignore this activity. } else { self::storeUnhandledActivity(true, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); } @@ -767,7 +772,7 @@ class Receiver } /** - * Stores unhandled or unknown Activitities as a file + * Stores unhandled or unknown Activities as a file * * @param boolean $unknown "true" if the activity is unknown, "false" if it is unhandled * @param string $type Activity type @@ -786,8 +791,18 @@ class Receiver return; } - $tempfile = tempnam(System::getTempPath(), ($unknown ? 'unknown-' : 'unhandled-') . str_replace(':', '-', $type) . '-' . str_replace(':', '-', $object_data['object_type']) . '-' . str_replace(':', '-', $object_data['object_object_type'] ?? '') . '-'); - file_put_contents($tempfile, json_encode(['activity' => $activity, 'body' => $body, 'uid' => $uid, 'trust_source' => $trust_source, 'push' => $push, 'signer' => $signer, 'object_data' => $object_data], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + $file = ($unknown ? 'unknown-' : 'unhandled-') . str_replace(':', '-', $type) . '-'; + + if (!empty($object_data['object_type'])) { + $file .= str_replace(':', '-', $object_data['object_type']) . '-'; + } + + if (!empty($object_data['object_object_type'])) { + $file .= str_replace(':', '-', $object_data['object_object_type']) . '-'; + } + + $tempfile = tempnam(System::getTempPath(), $file); + file_put_contents($tempfile, json_encode(['activity' => $activity, 'body' => $body, 'uid' => $uid, 'trust_source' => $trust_source, 'push' => $push, 'signer' => $signer, 'object_data' => $object_data], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); Logger::notice('Unknown activity stored', ['type' => $type, 'object_type' => $object_data['object_type'], $object_data['object_object_type'] ?? '', 'file' => $tempfile]); } @@ -1655,6 +1670,10 @@ class Receiver } } + if (!empty($object_data['alternate-url']) && !Network::isValidHttpUrl($object_data['alternate-url'])) { + $object_data['alternate-url'] = null; + } + if (in_array($object_data['object_type'], ['as:Audio', 'as:Video'])) { $object_data['alternate-url'] = self::extractAlternateUrl($object['as:url'] ?? []) ?: $object_data['alternate-url']; $object_data['attachments'] = array_merge($object_data['attachments'], self::processAttachmentUrls($object['as:url'] ?? []));