X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FActivityPub%2FObjects.php;h=9aeef3bb52a66ca03fc22e5f0cc31ba0a770438a;hb=53e8b21ca3b5dc8ccb0f4422d9c0ab1e72d7adfc;hp=5ee1b65d88cd0885833e8c12f084716ad780f552;hpb=64a336ee8de35fbea9de668e2497b2dd1220fdaf;p=friendica.git diff --git a/src/Module/ActivityPub/Objects.php b/src/Module/ActivityPub/Objects.php index 5ee1b65d88..9aeef3bb52 100644 --- a/src/Module/ActivityPub/Objects.php +++ b/src/Module/ActivityPub/Objects.php @@ -1,6 +1,6 @@ parameters['guid'])) { throw new HTTPException\BadRequestException(); } @@ -50,10 +51,10 @@ class Objects extends BaseModule DI::baseUrl()->redirect(str_replace('objects/', 'display/', DI::args()->getQueryString())); } - $itemuri = DBA::selectFirst('item-uri', ['id'], ['guid' => $parameters['guid']]); + $itemuri = DBA::selectFirst('item-uri', ['id'], ['guid' => $this->parameters['guid']]); if (DBA::isResult($itemuri)) { - Logger::info('Provided GUID found.', ['guid' => $parameters['guid'], 'uri-id' => $itemuri['id']]); + Logger::info('Provided GUID found.', ['guid' => $this->parameters['guid'], 'uri-id' => $itemuri['id']]); } else { // The item URI does not always contain the GUID. This means that we have to search the URL instead $url = DI::baseUrl()->get() . '/' . DI::args()->getQueryString(); @@ -69,9 +70,7 @@ class Objects extends BaseModule } } - $item = Post::selectFirst(['id', 'uid', 'origin', 'author-link', 'changed', 'private', 'psid', 'gravity', 'deleted', 'parent-uri-id'], - ['uri-id' => $itemuri['id']], ['order' => ['origin' => true]]); - + $item = Post::selectFirst([], ['uri-id' => $itemuri['id'], 'origin' => true]); if (!DBA::isResult($item)) { throw new HTTPException\NotFoundException(); } @@ -80,25 +79,14 @@ class Objects extends BaseModule if (!$validated) { $requester = HTTPSignature::getSigner('', $_SERVER); - if (!empty($requester) && $item['origin']) { - $requester_id = Contact::getIdForURL($requester, $item['uid']); - if (!empty($requester_id)) { - $permissionSets = DI::permissionSet()->selectByContactId($requester_id, $item['uid']); - if (!empty($permissionSets)) { - $psid = array_merge($permissionSets->column('id'), - [DI::permissionSet()->selectPublicForUser($item['uid'])]); - $validated = in_array($item['psid'], $psid); - } - } - } - } + if (!empty($requester)) { + $receivers = Item::enumeratePermissions($item, false); + $receivers[] = $item['contact-id']; - if ($validated) { - // Valid items are original post or posted from this node (including in the case of a forum) - $validated = ($item['origin'] || (parse_url($item['author-link'], PHP_URL_HOST) == parse_url(DI::baseUrl()->get(), PHP_URL_HOST))); - - if (!$validated && $item['deleted']) { - $validated = Post::exists(['origin' => true, 'uri-id' => $item['parent-uri-id']]); + $validated = in_array(Contact::getIdForURL($requester, $item['uid']), $receivers); + if (!$validated) { + $validated = in_array(Contact::getIdForURL($requester), $receivers); + } } } @@ -106,12 +94,12 @@ class Objects extends BaseModule throw new HTTPException\NotFoundException(); } - $etag = md5($parameters['guid'] . '-' . $item['changed']); + $etag = md5($this->parameters['guid'] . '-' . $item['changed']); $last_modified = $item['changed']; Network::checkEtagModified($etag, $last_modified); - if (empty($parameters['activity']) && ($item['gravity'] != GRAVITY_ACTIVITY)) { - $activity = ActivityPub\Transmitter::createActivityFromItem($item['id'], true); + if (empty($this->parameters['activity']) && ($item['gravity'] != Item::GRAVITY_ACTIVITY)) { + $activity = ActivityPub\Transmitter::createCachedActivityFromItem($item['id'], false, true); if (empty($activity['type'])) { throw new HTTPException\NotFoundException(); } @@ -125,16 +113,16 @@ class Objects extends BaseModule $data = ['@context' => ActivityPub::CONTEXT]; $data = array_merge($data, $activity['object']); - } elseif (empty($parameters['activity']) || in_array($parameters['activity'], + } elseif (empty($this->parameters['activity']) || in_array($this->parameters['activity'], ['Create', 'Announce', 'Update', 'Like', 'Dislike', 'Accept', 'Reject', 'TentativeAccept', 'Follow', 'Add'])) { - $data = ActivityPub\Transmitter::createActivityFromItem($item['id']); + $data = ActivityPub\Transmitter::createCachedActivityFromItem($item['id']); if (empty($data)) { throw new HTTPException\NotFoundException(); } - if (!empty($parameters['activity']) && ($parameters['activity'] != 'Create')) { - $data['type'] = $parameters['activity']; - $data['id'] = str_replace('/Create', '/' . $parameters['activity'], $data['id']); + if (!empty($this->parameters['activity']) && ($this->parameters['activity'] != 'Create')) { + $data['type'] = $this->parameters['activity']; + $data['id'] = str_replace('/Create', '/' . $this->parameters['activity'], $data['id']); } } else { throw new HTTPException\NotFoundException(); @@ -142,6 +130,7 @@ class Objects extends BaseModule // Relaxed CORS header for public items header('Access-Control-Allow-Origin: *'); + System::jsonExit($data, 'application/activity+json'); } }