3 * @copyright Copyright (C) 2020, Friendica
5 * @license GNU AGPL version 3 or any later version
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as
9 * published by the Free Software Foundation, either version 3 of the
10 * License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 namespace Friendica\Module;
24 use Friendica\BaseModule;
25 use Friendica\Database\DBA;
27 use Friendica\Model\Item;
28 use Friendica\Protocol\ActivityPub;
33 class Objects extends BaseModule
35 public static function rawContent(array $parameters = [])
39 if (empty($a->argv[1])) {
40 throw new \Friendica\Network\HTTPException\NotFoundException();
43 if (!ActivityPub::isRequest()) {
44 DI::baseUrl()->redirect(str_replace('objects/', 'display/', DI::args()->getQueryString()));
47 /// @todo Add Authentication to enable fetching of non public content
48 // $requester = HTTPSignature::getSigner('', $_SERVER);
50 // At first we try the original post with that guid
51 // @TODO: Replace with parameter from router
52 $item = Item::selectFirst(['id'], ['guid' => $a->argv[1], 'origin' => true, 'private' => [item::PUBLIC, Item::UNLISTED]]);
53 if (!DBA::isResult($item)) {
54 // If no original post could be found, it could possibly be a forum post, there we remove the "origin" field.
55 // @TODO: Replace with parameter from router
56 $item = Item::selectFirst(['id', 'author-link'], ['guid' => $a->argv[1], 'private' => [item::PUBLIC, Item::UNLISTED]]);
57 if (!DBA::isResult($item) || !strstr($item['author-link'], DI::baseUrl()->get())) {
58 throw new \Friendica\Network\HTTPException\NotFoundException();
62 $activity = ActivityPub\Transmitter::createActivityFromItem($item['id'], true);
63 $activity['type'] = $activity['type'] == 'Update' ? 'Create' : $activity['type'];
65 // Only display "Create" activity objects here, no reshares or anything else
66 if (empty($activity['object']) || ($activity['type'] != 'Create')) {
67 throw new \Friendica\Network\HTTPException\NotFoundException();
70 $data = ['@context' => ActivityPub::CONTEXT];
71 $data = array_merge($data, $activity['object']);
73 header('Content-Type: application/activity+json');
74 echo json_encode($data);