diff --git a/src/DI.php b/src/DI.php index 59f48fcb5..bf2b5a237 100644 --- a/src/DI.php +++ b/src/DI.php @@ -532,6 +532,16 @@ abstract class DI return self::$dice->create(Contact\Introduction\Factory\Introduction::class); } + public static function report(): Moderation\Repository\Report + { + return self::$dice->create(Moderation\Repository\Report::class); + } + + public static function reportFactory(): Moderation\Factory\Report + { + return self::$dice->create(Moderation\Factory\Report::class); + } + public static function localRelationship(): Contact\LocalRelationship\Repository\LocalRelationship { return self::$dice->create(Contact\LocalRelationship\Repository\LocalRelationship::class); diff --git a/src/Moderation/Repository/Report.php b/src/Moderation/Repository/Report.php index 3ffc0de8a..75a7f06dc 100644 --- a/src/Moderation/Repository/Report.php +++ b/src/Moderation/Repository/Report.php @@ -45,7 +45,7 @@ class Report extends \Friendica\BaseRepository $this->factory = $factory; } - public function selectOneById(int $lastInsertId): \Friendica\Moderation\Factory\Report + public function selectOneById(int $lastInsertId): \Friendica\Moderation\Entity\Report { return $this->_selectOne(['id' => $lastInsertId]); } @@ -59,6 +59,8 @@ class Report extends \Friendica\BaseRepository 'forward' => $Report->forward, ]; + $postUriIds = $Report->postUriIds; + if ($Report->id) { $this->db->update(self::$table_name, $fields, ['id' => $Report->id]); } else { @@ -70,7 +72,7 @@ class Report extends \Friendica\BaseRepository $this->db->delete('report-post', ['rid' => $Report->id]); - foreach ($Report->postUriIds as $uriId) { + foreach ($postUriIds as $uriId) { if (Post::exists(['uri-id' => $uriId])) { $this->db->insert('report-post', ['rid' => $Report->id, 'uri-id' => $uriId]); } else { diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index d689ba72a..843f4b8cf 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -1821,6 +1821,40 @@ class Processor Queue::remove($activity); } + /** + * Report a user + * + * @param array $activity + * @return void + * @throws \Exception + */ + public static function ReportAccount(array $activity) + { + $account_id = Contact::getIdForURL($activity['object_id']); + if (empty($account_id)) { + Logger::info('Unknown account', ['activity' => $activity]); + Queue::remove($activity); + return; + } + + $status_ids = $activity['object_ids']; + array_shift($status_ids); + + $uri_ids = []; + foreach ($status_ids as $status_id) { + $post = Post::selectFirst(['uri-id'], ['uri' => $status_id]); + if (!empty($post['uri-id'])) { + $uri_ids[] = $post['uri-id']; + } + } + + // @todo We should store the actor + $report = DI::reportFactory()->createFromReportsRequest(0, $account_id, $activity['content'], false, $uri_ids); + DI::report()->save($report); + + Logger::info('Stored report', ['account_id' => $account_id, 'comment' => $activity['content'], 'status_ids' => $status_ids]); + } + /** * Accept a follow request * diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index cb76ca7e1..85965d712 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -406,7 +406,14 @@ class Receiver } // Any activities on account types must not be altered - if (in_array($object_type, self::ACCOUNT_TYPES)) { + if (in_array($type, ['as:Flag'])) { + $object_data = []; + $object_data['id'] = JsonLD::fetchElement($activity, '@id'); + $object_data['object_id'] = JsonLD::fetchElement($activity, 'as:object', '@id'); + $object_data['object_ids'] = JsonLD::fetchElementArray($activity, 'as:object', '@id'); + $object_data['content'] = JsonLD::fetchElement($activity, 'as:content', '@type'); + $object_data['push'] = $push; + } elseif (in_array($object_type, self::ACCOUNT_TYPES)) { $object_data = []; $object_data['id'] = JsonLD::fetchElement($activity, '@id'); $object_data['object_id'] = JsonLD::fetchElement($activity, 'as:object', '@id'); @@ -843,6 +850,14 @@ class Receiver } break; + case 'as:Flag': + if (in_array($object_data['object_type'], self::ACCOUNT_TYPES)) { + ActivityPub\Processor::ReportAccount($object_data); + } else { + return false; + } + break; + case 'as:Remove': if (in_array($object_data['object_type'], self::CONTENT_TYPES)) { ActivityPub\Processor::removeFromFeaturedCollection($object_data);