Fetch the user id when not provided

This commit is contained in:
Michael 2022-02-13 16:42:43 +00:00
parent 9c60b4127b
commit a5a1c81790

View file

@ -263,17 +263,7 @@ class Receiver
{ {
$id = JsonLD::fetchElement($activity, '@id'); $id = JsonLD::fetchElement($activity, '@id');
if (!empty($id) && !$trust_source) { if (!empty($id) && !$trust_source) {
if (empty($uid)) { $fetch_uid = $uid ?: self::getBestUserForActivity($activity);
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id');
if (empty($actor)) {
$actor = '';
}
// Fetch a user out of the receivers of the message.
$fetch_uid = Receiver::getBestUserForActivity($activity, $actor);
} else {
$fetch_uid = $uid;
}
$fetched_activity = ActivityPub::fetchContent($id, $fetch_uid); $fetched_activity = ActivityPub::fetchContent($id, $fetch_uid);
if (!empty($fetched_activity)) { if (!empty($fetched_activity)) {
@ -314,12 +304,12 @@ class Receiver
if (empty($activity['thread-completion']) && (empty($reception_types[$uid]) || in_array($reception_types[$uid], [self::TARGET_UNKNOWN, self::TARGET_FOLLOWER, self::TARGET_ANSWER, self::TARGET_GLOBAL]))) { if (empty($activity['thread-completion']) && (empty($reception_types[$uid]) || in_array($reception_types[$uid], [self::TARGET_UNKNOWN, self::TARGET_FOLLOWER, self::TARGET_ANSWER, self::TARGET_GLOBAL]))) {
$reception_types[$uid] = self::TARGET_BCC; $reception_types[$uid] = self::TARGET_BCC;
} }
} else {
// We possibly need some user to fetch private content,
// so we fetch the first out ot the list.
$uid = self::getFirstUserFromReceivers($receivers);
} }
// We possibly need some user to fetch private content,
// so we fetch one out of the receivers if no uid is provided.
$fetch_uid = $uid ?: self::getBestUserForActivity($activity);
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id'); $object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
if (empty($object_id)) { if (empty($object_id)) {
Logger::info('No object found'); Logger::info('No object found');
@ -331,11 +321,11 @@ class Receiver
return []; return [];
} }
$object_type = self::fetchObjectType($activity, $object_id, $uid); $object_type = self::fetchObjectType($activity, $object_id, $fetch_uid);
// Fetch the activity on Lemmy "Announce" messages (announces of activities) // Fetch the activity on Lemmy "Announce" messages (announces of activities)
if (($type == 'as:Announce') && in_array($object_type, array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) { if (($type == 'as:Announce') && in_array($object_type, array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) {
$data = ActivityPub::fetchContent($object_id, $uid); $data = ActivityPub::fetchContent($object_id, $fetch_uid);
if (!empty($data)) { if (!empty($data)) {
$type = $object_type; $type = $object_type;
$activity = JsonLD::compact($data); $activity = JsonLD::compact($data);
@ -343,7 +333,7 @@ class Receiver
// Some variables need to be refetched since the activity changed // Some variables need to be refetched since the activity changed
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id'); $actor = JsonLD::fetchElement($activity, 'as:actor', '@id');
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id'); $object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
$object_type = self::fetchObjectType($activity, $object_id, $uid); $object_type = self::fetchObjectType($activity, $object_id, $fetch_uid);
} }
} }
@ -360,7 +350,7 @@ class Receiver
// Fetch the content only on activities where this matters // Fetch the content only on activities where this matters
// We can receive "#emojiReaction" when fetching content from Hubzilla systems // We can receive "#emojiReaction" when fetching content from Hubzilla systems
// Always fetch on "Announce" // Always fetch on "Announce"
$object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $uid); $object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $fetch_uid);
if (empty($object_data)) { if (empty($object_data)) {
Logger::info("Object data couldn't be processed"); Logger::info("Object data couldn't be processed");
return []; return [];
@ -408,7 +398,7 @@ class Receiver
// An Undo is done on the object of an object, so we need that type as well // An Undo is done on the object of an object, so we need that type as well
if (($type == 'as:Undo') && !empty($object_data['object_object'])) { if (($type == 'as:Undo') && !empty($object_data['object_object'])) {
$object_data['object_object_type'] = self::fetchObjectType([], $object_data['object_object'], $uid); $object_data['object_object_type'] = self::fetchObjectType([], $object_data['object_object'], $fetch_uid);
} }
} }
@ -663,9 +653,11 @@ class Receiver
* *
* @return int user id * @return int user id
*/ */
private static function getBestUserForActivity(array $activity, string $actor) public static function getBestUserForActivity(array $activity)
{ {
$uid = 0; $uid = 0;
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id') ?? '';
$receivers = self::getReceivers($activity, $actor); $receivers = self::getReceivers($activity, $actor);
foreach ($receivers as $receiver) { foreach ($receivers as $receiver) {
if ($receiver['type'] == self::TARGET_GLOBAL) { if ($receiver['type'] == self::TARGET_GLOBAL) {