X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FReceiver.php;h=bb676b396e338113ee517be084f8dfde49ec994e;hb=15535811752e5b3cb548dcbe1abe5d9c98c276b0;hp=97bd7dc7e76a05007c6c9c8103138aa816314bb9;hpb=9245942a0c2c98254c575e9f3d8c46c1da985ba6;p=friendica.git diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 97bd7dc7e7..bb676b396e 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -194,6 +194,11 @@ class Receiver return []; } + if (!is_string($object_id)) { + Logger::info('Invalid object id', ['object' => $object_id]); + return []; + } + $object_type = self::fetchObjectType($activity, $object_id, $uid); // Fetch the content only on activities where this matters @@ -217,8 +222,7 @@ class Receiver // 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']) || - (($type == 'as:Follow') && in_array($object_type, self::CONTENT_TYPES))) { + } elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['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); @@ -382,15 +386,14 @@ class Receiver 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; - } + // 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'] = ($profile['type'] != 'Group'); + ActivityPub\Processor::createItem($object_data); // Add the bottom reshare information only for persons - if ($profile['type'] == 'Person') { + if ($profile['type'] != 'Group') { $announce_object_data = self::processObject($activity); $announce_object_data['name'] = $type; $announce_object_data['author'] = JsonLD::fetchElement($activity, 'as:actor', '@id'); @@ -552,7 +555,7 @@ 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::TYPE_COMMUNITY)) { - $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]; + $networks = Protocol::FEDERATED; $condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND], 'network' => $networks, 'archive' => false, 'pending' => false, 'uid' => $contact['uid']]; @@ -587,7 +590,7 @@ class Receiver public static function getReceiverForActor($actor, $tags) { $receivers = []; - $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]; + $networks = Protocol::FEDERATED; $condition = ['nurl' => Strings::normaliseLink($actor), 'rel' => [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER], 'network' => $networks, 'archive' => false, 'pending' => false]; $contacts = DBA::select('contact', ['uid', 'rel'], $condition); @@ -653,27 +656,14 @@ class Receiver */ public static function switchContact($cid, $uid, $url) { - $profile = ActivityPub::probeProfile($url); - if (empty($profile)) { - return; - } - - Logger::log('Switch contact ' . $cid . ' (' . $profile['url'] . ') for user ' . $uid . ' to ActivityPub'); - - $photo = defaults($profile, 'photo', null); - unset($profile['photo']); - unset($profile['baseurl']); - unset($profile['guid']); + Contact::updateFromProbe($cid, '', true); - $profile['nurl'] = Strings::normaliseLink($profile['url']); - DBA::update('contact', $profile, ['id' => $cid]); - - Contact::updateAvatar($photo, $uid, $cid); + Logger::log('Switch contact ' . $cid . ' (' . $url . ') for user ' . $uid . ' to ActivityPub'); // Send a new follow request to be sure that the connection still exists if (($uid != 0) && DBA::exists('contact', ['id' => $cid, 'rel' => [Contact::SHARING, Contact::FRIEND]])) { - ActivityPub\Transmitter::sendActivity('Follow', $profile['url'], $uid); - Logger::log('Send a new follow request to ' . $profile['url'] . ' for user ' . $uid, Logger::DEBUG); + ActivityPub\Transmitter::sendActivity('Follow', $url, $uid); + Logger::log('Send a new follow request to ' . $url . ' for user ' . $uid, Logger::DEBUG); } } @@ -736,11 +726,11 @@ class Receiver * @param boolean $trust_source Do we trust the provided object? * @param integer $uid User ID for the signature that we use to fetch data * - * @return array with trusted and valid object data + * @return array|false with trusted and valid object data * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - private static function fetchObject($object_id, $object = [], $trust_source = false, $uid = 0) + private static function fetchObject(string $object_id, array $object = [], bool $trust_source = false, int $uid = 0) { // By fetching the type we check if the object is complete. $type = JsonLD::fetchElement($object, '@type'); @@ -779,13 +769,14 @@ class Receiver if ($type == 'as:Announce') { $object_id = JsonLD::fetchElement($object, 'object', '@id'); - if (empty($object_id)) { + if (empty($object_id) || !is_string($object_id)) { return false; } return self::fetchObject($object_id, [], false, $uid); } Logger::log('Unhandled object type: ' . $type, Logger::DEBUG); + return false; } /**