Additional check for direct messages

This commit is contained in:
Michael 2023-11-22 14:20:51 +00:00
parent 08d06064ce
commit c07ce083d1
2 changed files with 59 additions and 8 deletions

View file

@ -1111,6 +1111,10 @@ class Processor
} }
if (!empty($activity['directmessage']) && self::postMail($item)) { if (!empty($activity['directmessage']) && self::postMail($item)) {
if (!empty($item['source']) && DI::config()->get('debug', 'store_source')) {
Post\Activity::insert($item['uri-id'], $item['source']);
}
continue; continue;
} }

View file

@ -436,15 +436,11 @@ class Receiver
$object_data['object_id'] = $object_id; $object_data['object_id'] = $object_id;
// Test if it is an answer to a mail // Test if it is a direct message
if (DBA::exists('mail', ['uri' => $object_data['reply-to-id']])) { if (self::checkForDirectMessage($object_data, $activity)) {
$object_data['directmessage'] = true; $object_data['directmessage'] = true;
} else { } elseif (!empty(JsonLD::fetchElement($activity['as:object'], 'misskey:_misskey_talk'))) {
$object_data['directmessage'] = JsonLD::fetchElement($activity, 'litepub:directMessage'); $object_data = self::setChatData($object_data, $receivers);
if (!empty(JsonLD::fetchElement($activity['as:object'], 'misskey:_misskey_talk'))) {
$object_data = self::setChatData($object_data, $receivers);
}
} }
} elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Announce', 'as:Follow'])) && in_array($object_type, self::CONTENT_TYPES)) { } elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Announce', 'as:Follow'])) && in_array($object_type, self::CONTENT_TYPES)) {
// Create a mostly empty array out of the activity data (instead of the object). // Create a mostly empty array out of the activity data (instead of the object).
@ -523,6 +519,57 @@ class Receiver
return $object_data; return $object_data;
} }
/**
* Check if the received message is a direct message
*
* @param array $object_data
* @param array $activity
* @return boolean
*/
private static function checkForDirectMessage(array $object_data, array $activity): bool
{
if (DBA::exists('mail', ['uri' => $object_data['reply-to-id']])) {
return true;
}
if ($object_data['id'] != $object_data['reply-to-id']) {
return false;
}
if (JsonLD::fetchElement($activity, 'litepub:directMessage')) {
return true;
}
if (!empty($object_data['attachments'])) {
return false;
}
if (!empty($object_data['receiver_urls']['as:cc']) || empty($object_data['receiver_urls']['as:to'])) {
return false;
}
if ((count($object_data['receiver_urls']['as:to']) != 1) || !User::getIdForURL($object_data['receiver_urls']['as:to'][0])) {
return false;
}
$mentions = 0;
foreach ($object_data['tags'] as $mention) {
if ($mention['type'] != 'Mention') {
continue;
}
if (!User::getIdForURL($mention['href'])) {
return false;
}
++$mentions;
}
if ($mentions > 1) {
return false;
}
return true;
}
private static function setChatData(array $object_data, array $receivers): array private static function setChatData(array $object_data, array $receivers): array
{ {
if (count($receivers) != 1) { if (count($receivers) != 1) {