From a88283c526a779389efa2b819201a2331de0f2b2 Mon Sep 17 00:00:00 2001 From: winter Date: Mon, 24 Feb 2025 18:29:51 +0000 Subject: implement federation policies and instance info substitution policy --- routes/actor.php | 9 +++++++++ routes/admin.php | 1 - routes/interaction.php | 5 +++++ routes/note.php | 4 ++++ 4 files changed, 18 insertions(+), 1 deletion(-) (limited to 'routes') diff --git a/routes/actor.php b/routes/actor.php index c228f45..b768413 100644 --- a/routes/actor.php +++ b/routes/actor.php @@ -1,21 +1,26 @@ mount('/actor/:id', function (array $args) { $actor = Actor::find($args['id']); + $instance = Instance::findByRequestHeaders(); if ($actor == null || $actor->deleted) { throw new NotFound("i don't know that actor"); } if (!$actor->isLocal) { throw new NotFound("that actor is not local!"); } + PolicyManager::getInstance()->checkFederationOrThrow($actor, $instance); if (isset($_SERVER['HTTP_ACCEPT']) && str_contains($_SERVER['HTTP_ACCEPT'], 'text/html')) { throw new TemporaryRedirect("/@/$actor->handle"); } @@ -24,6 +29,8 @@ Router::getInstance()->mount('/actor/:id', function (array $args) { Router::getInstance()->mount('/actor/:id/basicFeed', function (array $args) { $actor = Actor::find($args['id']); + $instance = Instance::findByRequestHeaders(); + PolicyManager::getInstance()->checkFederationOrThrow($actor, $instance); $page = +($_GET['page'] ?? 1); $pageSize = 100; $notes = array_filter( @@ -47,6 +54,8 @@ Router::getInstance()->mount('/actor/:id/basicFeed', function (array $args) { Router::getInstance()->mount('/actor/:id/fullFeed', function (array $args) { $actor = Actor::find($args['id']); + $instance = Instance::findByRequestHeaders(); + PolicyManager::getInstance()->checkFederationOrThrow($actor, $instance); $page = +($_GET['page'] ?? 1); $pageSize = 10; $notes = array_filter( diff --git a/routes/admin.php b/routes/admin.php index 9915fde..c89f3d5 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -18,7 +18,6 @@ Router::getInstance()->mount('/fragment/admin/settings/:prefix', function (array foreach ($_POST as $key => $value) { // same workaround as in settings_field $key = str_replace('', '.', $key); - error_log("setting '$key' to '$value'"); $settings->set($key, $value); } $saved = true; diff --git a/routes/interaction.php b/routes/interaction.php index 53bc193..5768fe1 100644 --- a/routes/interaction.php +++ b/routes/interaction.php @@ -1,16 +1,21 @@ mount('/interaction/:id', function (array $args) { $interaction = Interaction::find($args['id']); + $instance = Instance::findByRequestHeaders(); if ($interaction == null || $interaction->deleted) { throw new NotFound("i don't know that interaction"); } if (!$interaction->author->isLocal) { throw new NotFound("i don't want to tell you about non-local interactions!"); } + PolicyManager::getInstance()->checkFederationOrThrow($interaction, $instance); json_response($interaction); }); \ No newline at end of file diff --git a/routes/note.php b/routes/note.php index 90009d2..2612f0f 100644 --- a/routes/note.php +++ b/routes/note.php @@ -2,21 +2,25 @@ use Digitigrade\HttpResponseStatus\Forbidden; use Digitigrade\HttpResponseStatus\NotFound; +use Digitigrade\HttpResponseStatus\PolicyRejected; use Digitigrade\HttpResponseStatus\TemporaryRedirect; use Digitigrade\Model\Instance; use Digitigrade\Model\Note; use Digitigrade\Model\NotePrivacyScope; use Digitigrade\Model\UserAccount; +use Digitigrade\PolicyManager; use Digitigrade\Router; Router::getInstance()->mount('/note/:id', function (array $args) { $note = Note::find($args['id']); + $instance = Instance::findByRequestHeaders(); if ($note == null || $note->deleted) { throw new NotFound("i don't know that note"); } if (!$note->author->isLocal) { throw new NotFound("i don't want to tell you about non local notes sorry"); } + PolicyManager::getInstance()->checkFederationOrThrow($note, $instance); if (isset($_SERVER['HTTP_ACCEPT']) && str_contains($_SERVER['HTTP_ACCEPT'], 'text/html')) { throw new TemporaryRedirect('/@/' . $note->author->handle . "/note/$note->id"); } -- cgit v1.3