From ce38e63399aa41b87836dea85f13e3c0491ef5e3 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 18 Jul 2022 14:03:49 +0000 Subject: [PATCH] Add and delete entries --- src/Protocol/ActivityPub/Processor.php | 7 ++- src/Protocol/ActivityPub/Receiver.php | 73 +++++++++++++++----------- static/dbstructure.config.php | 25 ++++----- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index c49a2da686..6e81cb767f 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -223,7 +223,7 @@ class Processor Post\History::add($item['uri-id'], $item); Item::update($item, ['uri' => $activity['id']]); - DBA::delete('inbox-queue', ['url' => $item['uri']]); + Receiver::removeFromQueue($activity); if ($activity['object_type'] == 'as:Event') { $posts = Post::select(['event-id', 'uid'], ["`uri` = ? AND `event-id` > ?", $activity['id'], 0]); @@ -428,6 +428,7 @@ class Processor Logger::info('Deleting item', ['object' => $activity['object_id'], 'owner' => $owner]); Item::markForDeletion(['uri' => $activity['object_id'], 'owner-id' => $owner]); + Receiver::removeFromQueue($activity); } /** @@ -892,7 +893,7 @@ class Processor $item_id = Item::insert($item); if ($item_id) { Logger::info('Item insertion successful', ['user' => $item['uid'], 'item_id' => $item_id]); - DBA::delete('inbox-queue', ['url' => $item['uri']]); + Receiver::removeFromQueue($activity); } else { Logger::notice('Item insertion aborted', ['user' => $item['uid']]); } @@ -1351,6 +1352,7 @@ class Processor Logger::info('Updating profile', ['object' => $activity['object_id']]); Contact::updateFromProbeByURL($activity['object_id']); + Receiver::removeFromQueue($activity); } /** @@ -1379,6 +1381,7 @@ class Processor DBA::close($contacts); Logger::info('Deleted contact', ['object' => $activity['object_id']]); + Receiver::removeFromQueue($activity); } /** diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index b55636a30e..11e7151e1e 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -98,19 +98,6 @@ class Receiver $ldactivity = JsonLD::compact($activity); - $http_signer = HTTPSignature::getSigner($body, $header); - if ($http_signer === false) { - Logger::warning('Invalid HTTP signature, message will be discarded.'); - return; - } elseif (empty($http_signer)) { - Logger::info('Signer is a tombstone. The message will be discarded, the signer account is deleted.'); - return; - } else { - Logger::info('Valid HTTP signature', ['signer' => $http_signer]); - } - - self::enqueuePost($ldactivity, $http_signer, $uid); - $actor = JsonLD::fetchElement($ldactivity, 'as:actor', '@id') ?? ''; $apcontact = APContact::getByURL($actor); @@ -125,6 +112,17 @@ class Receiver APContact::unmarkForArchival($apcontact); } + $http_signer = HTTPSignature::getSigner($body, $header); + if ($http_signer === false) { + Logger::warning('Invalid HTTP signature, message will be discarded.'); + return; + } elseif (empty($http_signer)) { + Logger::info('Signer is a tombstone. The message will be discarded, the signer account is deleted.'); + return; + } else { + Logger::info('Valid HTTP signature', ['signer' => $http_signer]); + } + $signer = [$http_signer]; Logger::info('Message for user ' . $uid . ' is from actor ' . $actor); @@ -158,32 +156,45 @@ class Receiver } $fetchQueue = new FetchQueue(); - self::processActivity($fetchQueue, $ldactivity, $body, $uid, $trust_source, true, $signer); + self::processActivity($fetchQueue, $ldactivity, $body, $uid, $trust_source, true, $signer, $http_signer); $fetchQueue->process(); } - private static function enqueuePost(array $ldactivity = [], string $signer, int $uid) + private static function enqueuePost(array $ldactivity = [], string $type, int $uid, string $http_signer): array { - if (empty($ldactivity['as:object'])) { - return; - } - - $url = JsonLD::fetchElement($ldactivity, 'as:object', '@id'); $fields = [ - 'url' => $url, - 'in-reply-to-url' => JsonLD::fetchElement($ldactivity['as:object'], 'as:inReplyTo', '@id'), - 'signer' => $signer, - 'type' => JsonLD::fetchElement($ldactivity, '@type'), - 'object-type' => JsonLD::fetchElement($ldactivity['as:object'], '@type'), + 'activity-id' => $ldactivity['id'], + 'object-id' => $ldactivity['object_id'], + 'type' => $type, + 'object-type' => $ldactivity['object_type'], 'activity' => json_encode($ldactivity, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), 'received' => DateTimeFormat::utcNow(), ]; - DBA::insert('inbox-queue', $fields, Database::INSERT_IGNORE); - $queue = DBA::selectFirst('inbox-queue', ['id'], ['url' => $url]); - if (!empty($queue['id'])) { - DBA::insert('inbox-queue-receiver', ['queue-id' => $queue['id'], 'uid' => $uid], Database::INSERT_IGNORE); + if (!empty($ldactivity['object_object_type'])) { + $fields['object-object-type'] = $ldactivity['object_object_type']; } + + if (!empty($http_signer)) { + $fields['signer'] = $http_signer; + } + + DBA::insert('inbox-entry', $fields, Database::INSERT_IGNORE); + + $queue = DBA::selectFirst('inbox-entry', ['id'], ['activity-id' => $ldactivity['id']]); + if (!empty($queue['id'])) { + $ldactivity['entry-id'] = $queue['id']; + DBA::insert('inbox-entry-receiver', ['queue-id' => $queue['id'], 'uid' => $uid], Database::INSERT_IGNORE); + } + return $ldactivity; + } + + public static function removeFromQueue(array $activity = []) + { + if (empty($activity['entry-id'])) { + return; + } + DBA::delete('inbox-entry', ['id' => $activity['entry-id']]); } /** @@ -517,7 +528,7 @@ class Receiver * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function processActivity(FetchQueue $fetchQueue, array $activity, string $body = '', int $uid = null, bool $trust_source = false, bool $push = false, array $signer = []) + public static function processActivity(FetchQueue $fetchQueue, array $activity, string $body = '', int $uid = null, bool $trust_source = false, bool $push = false, array $signer = [], string $http_signer = '') { $type = JsonLD::fetchElement($activity, '@type'); if (!$type) { @@ -591,6 +602,8 @@ class Receiver $object_data['from-relay'] = $activity['from-relay']; } + $object_data = self::enqueuePost($object_data, $type, $uid, $http_signer); + if (in_array('as:Question', [$object_data['object_type'] ?? '', $object_data['object_object_type'] ?? ''])) { self::storeUnhandledActivity(false, $type, $object_data, $activity, $body, $uid, $trust_source, $push, $signer); } diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 1d8b21b02c..c1f1cfcbc1 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -784,30 +784,31 @@ return [ "hook_file_function" => ["UNIQUE", "hook", "file", "function"], ] ], - "inbox-queue" => [ + "inbox-entry" => [ "comment" => "Incoming activity", "fields" => [ "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"], - "url" => ["type" => "varbinary(255)", "comment" => "id of the incoming activity"], - "in-reply-to-url" => ["type" => "varbinary(255)", "comment" => "related id of the incoming activity"], - "signer" => ["type" => "varbinary(255)", "comment" => "Signer of the incoming activity"], + "activity-id" => ["type" => "varbinary(255)", "comment" => "id of the incoming activity"], + "object-id" => ["type" => "varbinary(255)", "comment" => ""], + "type" => ["type" => "varchar(64)", "comment" => "Type of the activity"], + "object-type" => ["type" => "varchar(64)", "comment" => "Type of the object activity"], + "object-object-type" => ["type" => "varchar(64)", "comment" => "Type of the object's object activity"], + "received" => ["type" => "datetime", "comment" => "Receiving date"], "activity" => ["type" => "mediumtext", "comment" => "The JSON activity"], - "received" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => "Receiving date"], - "type" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "Type of the activity"], - "object-type" => ["type" => "varchar(64)", "not null" => "1", "default" => "", "comment" => "Type of the object activity"], + "signer" => ["type" => "varchar(255)", "comment" => ""], ], "indexes" => [ "PRIMARY" => ["id"], - "url" => ["UNIQUE", "url"], - "in-reply-to-url" => ["in-reply-to-url"], + "activity-id" => ["UNIQUE", "activity-id"], + "object-id" => ["object-id"], "received" => ["received"], ] ], - "inbox-queue-receiver" => [ + "inbox-entry-receiver" => [ "comment" => "Receiver for the incoming activity", "fields" => [ - "queue-id" => ["type" => "int unsigned", "not null" => "1", "foreign" => ["inbox-queue" => "id"], "comment" => ""], - "uid" => ["type" => "mediumint unsigned", "not null" => "1", "default" => "0", "foreign" => ["user" => "uid"], "comment" => "User id"], + "queue-id" => ["type" => "int unsigned", "not null" => "1", "primary" => "1", "foreign" => ["inbox-entry" => "id"], "comment" => ""], + "uid" => ["type" => "mediumint unsigned", "not null" => "1", "primary" => "1", "foreign" => ["user" => "uid"], "comment" => "User id"], ], "indexes" => [ "PRIMARY" => ["queue-id", "uid"],