83 lines
3.3 KiB
Diff
83 lines
3.3 KiB
Diff
From b3ac2ebdad979f8b7436384b3ae5b00eb7ece4f1 Mon Sep 17 00:00:00 2001
|
||
From: Oneric <oneric@oneric.stub>
|
||
Date: Wed, 4 Dec 2024 02:09:49 +0100
|
||
Subject: [PATCH 2/4] Error out earlier on missing mandatory reference
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
This is the only user of fetch_actor_and_object which previously just
|
||
always preteneded to be successful. For all the activity types handled
|
||
here, we absolutely need the referenced object to be able to process it
|
||
(other than Announce whether or not processing those activity types for
|
||
unknown remote objects is desirable in the first place is up for debate)
|
||
|
||
All other users of the similar fetch_actor already properly check success.
|
||
|
||
TODO: if the return value is 404, use {:error, :ignore} instead,
|
||
the reference is most likely a private object we’re not allowed to access
|
||
or already deleted
|
||
---
|
||
lib/pleroma/web/activity_pub/object_validator.ex | 9 ++++++---
|
||
lib/pleroma/web/activity_pub/transmogrifier.ex | 5 ++++-
|
||
lib/pleroma/workers/receiver_worker.ex | 5 +++++
|
||
3 files changed, 15 insertions(+), 4 deletions(-)
|
||
|
||
diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex
|
||
index cb0cc9ed7..e44f2fdee 100644
|
||
--- a/lib/pleroma/web/activity_pub/object_validator.ex
|
||
+++ b/lib/pleroma/web/activity_pub/object_validator.ex
|
||
@@ -253,9 +253,12 @@ def fetch_actor(object) do
|
||
end
|
||
|
||
def fetch_actor_and_object(object) do
|
||
- fetch_actor(object)
|
||
- Object.normalize(object["object"], fetch: true)
|
||
- :ok
|
||
+ with {:ok, %User{}} <- fetch_actor(object),
|
||
+ %Object{} <- Object.normalize(object["object"], fetch: true) do
|
||
+ :ok
|
||
+ else
|
||
+ _ -> :error
|
||
+ end
|
||
end
|
||
|
||
defp for_each_history_item(
|
||
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||
index 18015e07e..e8d112727 100644
|
||
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||
@@ -519,10 +519,13 @@ defp handle_incoming_normalised(
|
||
|
||
defp handle_incoming_normalised(%{"type" => type} = data, _options)
|
||
when type in ~w{Like EmojiReact Announce Add Remove} do
|
||
- with :ok <- ObjectValidator.fetch_actor_and_object(data),
|
||
+ with {_, :ok} <- {:link, ObjectValidator.fetch_actor_and_object(data)},
|
||
{:ok, activity, _meta} <- Pipeline.common_pipeline(data, local: false) do
|
||
{:ok, activity}
|
||
else
|
||
+ {:link, _} ->
|
||
+ {:error, :link_resolve_failed}
|
||
+
|
||
e ->
|
||
{:error, e}
|
||
end
|
||
diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex
|
||
index f82d1b8cc..aaaae636e 100644
|
||
--- a/lib/pleroma/workers/receiver_worker.ex
|
||
+++ b/lib/pleroma/workers/receiver_worker.ex
|
||
@@ -33,6 +33,11 @@ def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
|
||
Logger.info("Received invalid AP document: (3e) #{inspect(ecto_changeset)}")
|
||
{:discard, :invalid}
|
||
|
||
+ # failed to resolve a necessary referenced remote AP object;
|
||
+ # might be temporary server/network trouble thus reattempt
|
||
+ {:error, :link_resolve_failed} = e ->
|
||
+ e
|
||
+
|
||
{:error, _} = e ->
|
||
Logger.error("Unexpected AP doc error: #{inspect(e)} from #{inspect(params)}")
|
||
e
|
||
--
|
||
2.47.1
|
||
|