From db907c2ff8755d1f4b511fdfc9cb12cfb6698e23 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 27 May 2020 19:05:33 +0000 Subject: [PATCH] Issue 8700: Resolvable activities --- src/Module/Objects.php | 28 ++++++++++++++++++------ src/Protocol/ActivityPub/Transmitter.php | 4 ++-- static/routes.config.php | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/Module/Objects.php b/src/Module/Objects.php index b5b5227141..b1346b5850 100644 --- a/src/Module/Objects.php +++ b/src/Module/Objects.php @@ -65,17 +65,31 @@ class Objects extends BaseModule $last_modified = $item['changed']; Network::checkEtagModified($etag, $last_modified); - $activity = ActivityPub\Transmitter::createActivityFromItem($item['id'], true); - $activity['type'] = $activity['type'] == 'Update' ? 'Create' : $activity['type']; + if (empty($parameters['activity'])) { + $activity = ActivityPub\Transmitter::createActivityFromItem($item['id'], true); + $activity['type'] = $activity['type'] == 'Update' ? 'Create' : $activity['type']; - // Only display "Create" activity objects here, no reshares or anything else - if (empty($activity['object']) || ($activity['type'] != 'Create')) { + // Only display "Create" activity objects here, no reshares or anything else + if (empty($activity['object']) || ($activity['type'] != 'Create')) { + throw new HTTPException\NotFoundException(); + } + + $data = ['@context' => ActivityPub::CONTEXT]; + $data = array_merge($data, $activity['object']); + } elseif (in_array($parameters['activity'], ['Create', 'Announce', 'Update', + 'Like', 'Dislike', 'Accept', 'Reject', 'TentativeAccept', 'Follow', 'Add'])) { + $data = ActivityPub\Transmitter::createActivityFromItem($item['id']); + if (empty($data)) { + throw new HTTPException\NotFoundException(); + } + if ($parameters['activity'] != 'Create') { + $data['type'] = $parameters['activity']; + $data['id'] = str_replace('/Create', '/' . $parameters['activity'], $data['id']); + } + } else { throw new HTTPException\NotFoundException(); } - $data = ['@context' => ActivityPub::CONTEXT]; - $data = array_merge($data, $activity['object']); - // Relaxed CORS header for public items header('Access-Control-Allow-Origin: *'); System::jsonExit($data, 'application/activity+json'); diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index a7e4a73840..9cb5efca41 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -729,7 +729,7 @@ class Transmitter $data = []; } - $data['id'] = $mail['uri'] . '#Create'; + $data['id'] = $mail['uri'] . '/Create'; $data['type'] = 'Create'; $data['actor'] = $mail['author-link']; $data['published'] = DateTimeFormat::utc($mail['created'] . '+00:00', DateTimeFormat::ATOM); @@ -893,7 +893,7 @@ class Transmitter $data = []; } - $data['id'] = $item['uri'] . '#' . $type; + $data['id'] = $item['uri'] . '/' . $type; $data['type'] = $type; if (Item::isForumPost($item) && ($type != 'Announce')) { diff --git a/static/routes.config.php b/static/routes.config.php index 85ec6d8bb4..9fbe358830 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -218,7 +218,7 @@ return [ '/mark/all' => [Module\Notifications\Notification::class, [R::GET]], '/{id:\d+}' => [Module\Notifications\Notification::class, [R::GET, R::POST]], ], - '/objects/{guid}' => [Module\Objects::class, [R::GET]], + '/objects/{guid}[/{activity}]' => [Module\Objects::class, [R::GET]], '/oembed' => [ '/b2h' => [Module\Oembed::class, [R::GET]],