mirror of
https://github.com/friendica/friendica
synced 2025-04-25 15:10:13 +00:00
Improved message handling / new activity relay handling
This commit is contained in:
parent
7834359957
commit
86105635ca
26 changed files with 280 additions and 428 deletions
|
@ -272,26 +272,39 @@ class Receiver
|
|||
*/
|
||||
public static function prepareObjectData(array $activity, int $uid, bool $push, bool &$trust_source): array
|
||||
{
|
||||
$id = JsonLD::fetchElement($activity, '@id');
|
||||
$id = JsonLD::fetchElement($activity, '@id');
|
||||
$type = JsonLD::fetchElement($activity, '@type');
|
||||
$object_id = JsonLD::fetchElement($activity, 'as:object', '@id');
|
||||
|
||||
if (!empty($object_id) && in_array($type, ['as:Create', 'as:Update'])) {
|
||||
$fetch_id = $object_id;
|
||||
} else {
|
||||
$fetch_id = $id;
|
||||
}
|
||||
|
||||
if (!empty($activity['as:object'])) {
|
||||
$object_type = JsonLD::fetchElement($activity['as:object'], '@type');
|
||||
}
|
||||
|
||||
if (!empty($id) && !$trust_source) {
|
||||
$fetch_uid = $uid ?: self::getBestUserForActivity($activity);
|
||||
|
||||
$fetched_activity = ActivityPub::fetchContent($id, $fetch_uid);
|
||||
$fetched_activity = ActivityPub::fetchContent($fetch_id, $fetch_uid);
|
||||
if (!empty($fetched_activity)) {
|
||||
$object = JsonLD::compact($fetched_activity);
|
||||
$fetched_id = JsonLD::fetchElement($object, '@id');
|
||||
if ($fetched_id == $id) {
|
||||
|
||||
$fetched_id = JsonLD::fetchElement($object, '@id');
|
||||
$fetched_type = JsonLD::fetchElement($object, '@type');
|
||||
|
||||
if (($fetched_id == $id) && !empty($fetched_type) && ($fetched_type == $type)) {
|
||||
Logger::info('Activity had been fetched successfully', ['id' => $id]);
|
||||
$trust_source = true;
|
||||
if ($id != $object_id) {
|
||||
$activity = $object;
|
||||
} else {
|
||||
Logger::info('Fetched data is the object instead of the activity', ['id' => $id]);
|
||||
unset($object['@context']);
|
||||
$activity['as:object'] = $object;
|
||||
}
|
||||
$activity = $object;
|
||||
} elseif (($fetched_id == $object_id) && !empty($fetched_type) && ($fetched_type == $object_type)) {
|
||||
Logger::info('Fetched data is the object instead of the activity', ['id' => $id]);
|
||||
$trust_source = true;
|
||||
unset($object['@context']);
|
||||
$activity['as:object'] = $object;
|
||||
} else {
|
||||
Logger::info('Activity id is not equal', ['id' => $id, 'fetched' => $fetched_id]);
|
||||
}
|
||||
|
@ -371,9 +384,9 @@ class Receiver
|
|||
$object_data['object_object'] = JsonLD::fetchElement($activity['as:object'], 'as:object');
|
||||
$object_data['object_type'] = JsonLD::fetchElement($activity['as:object'], '@type');
|
||||
$object_data['push'] = $push;
|
||||
if ($type == 'as:Delete') {
|
||||
if (!$trust_source && ($type == 'as:Delete')) {
|
||||
$apcontact = APContact::getByURL($object_data['object_id'], true);
|
||||
$trust_source = ($apcontact['type'] == 'Tombstone');
|
||||
$trust_source = empty($apcontact) || ($apcontact['type'] == 'Tombstone') || $apcontact['suspended'];
|
||||
}
|
||||
} elseif (in_array($type, ['as:Create', 'as:Update', 'as:Announce', 'as:Invite']) || strpos($type, '#emojiReaction')) {
|
||||
// Fetch the content only on activities where this matters
|
||||
|
@ -430,8 +443,11 @@ class Receiver
|
|||
$object_data['object_object_type'] = self::fetchObjectType([], $object_data['object_object'], $fetch_uid);
|
||||
}
|
||||
|
||||
if (($type == 'as:Delete') && in_array($object_data['object_type'], array_merge(['as:Tombstone'], self::CONTENT_TYPES))) {
|
||||
if (!$trust_source && ($type == 'as:Delete') && in_array($object_data['object_type'], array_merge(['as:Tombstone', ''], self::CONTENT_TYPES))) {
|
||||
$trust_source = Processor::isActivityGone($object_data['object_id']);
|
||||
if (!$trust_source) {
|
||||
$trust_source = !empty(APContact::getByURL($object_data['object_id'], false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -668,6 +684,9 @@ class Receiver
|
|||
if (!empty($object_data['raw'])) {
|
||||
$announce_object_data['raw'] = $object_data['raw'];
|
||||
}
|
||||
if (!empty($object_data['raw-object'])) {
|
||||
$announce_object_data['raw-object'] = $object_data['raw-object'];
|
||||
}
|
||||
ActivityPub\Processor::createActivity($announce_object_data, Activity::ANNOUNCE);
|
||||
}
|
||||
} else {
|
||||
|
@ -1305,7 +1324,7 @@ class Receiver
|
|||
$object_data = self::processObject($object);
|
||||
|
||||
if (!empty($data)) {
|
||||
$object_data['raw'] = json_encode($data);
|
||||
$object_data['raw-object'] = json_encode($data);
|
||||
}
|
||||
return $object_data;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue