diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 3042d86f2..2e09a89b6 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1999,6 +1999,10 @@ def get_or_fetch_by_ap_id(ap_id, options \\ []) do {%User{} = user, _} -> {:ok, user} + {_, {:error, {:reject, :mrf}}} -> + Logger.debug("Rejected to fetch user due to MRF: #{ap_id}") + {:error, {:reject, :mrf}} + e -> Logger.error("Could not fetch user #{ap_id}, #{inspect(e)}") {:error, :not_found} diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index e44f2fdee..93980f35b 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -15,6 +15,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object alias Pleroma.Object.Containment + alias Pleroma.Object.Fetcher alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AddRemoveValidator @@ -253,11 +254,27 @@ def fetch_actor(object) do end def fetch_actor_and_object(object) do + # Fetcher.fetch_object_from_id already first does a local db lookup with {:ok, %User{}} <- fetch_actor(object), - %Object{} <- Object.normalize(object["object"], fetch: true) do + {:ap_id, id} when is_binary(id) <- + {:ap_id, Pleroma.Web.ActivityPub.Utils.get_ap_id(object["object"])}, + {:ok, %Object{}} <- Fetcher.fetch_object_from_id(id) do :ok else - _ -> :error + {:ap_id, id} -> + {:error, {:validate, "Invalid AP id: #{inspect(id)}"}} + + # if actor: late post from a previously unknown, deleted profile + # if object: private post we're not allowed to access + # (other HTTP replies might just indicate a temporary network failure though!) + {:error, e} when e in [:not_found, :forbidden] -> + {:error, :ignore} + + {:error, _} = e -> + e + + e -> + {:error, e} end end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 02253a2c8..51912c6a8 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -523,6 +523,15 @@ defp handle_incoming_normalised(%{"type" => type} = data, _options) {:ok, activity, _meta} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} else + {:link, {:error, :ignore}} -> + {:error, :ignore} + + {:link, {:error, {:validate, _}} = e} -> + e + + {:link, {:error, {:reject, _}} = e} -> + e + {:link, _} -> {:error, :link_resolve_failed} diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex index 4cde93503..16241a75f 100644 --- a/lib/pleroma/workers/receiver_worker.ex +++ b/lib/pleroma/workers/receiver_worker.ex @@ -23,6 +23,9 @@ def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do {:error, :already_present} -> {:discard, :already_present} + {:error, :ignore} -> + {:discard, :ignore} + # invalid data or e.g. deleting an object we don't know about anyway {:error, {:validate, issue}} -> Logger.info("Received invalid AP document: #{inspect(issue)}") @@ -36,7 +39,6 @@ def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do # failed to resolve a necessary referenced remote AP object; # might be temporary server/network trouble thus reattempt {:error, :link_resolve_failed} = e -> - # TODO: lower to debug for PR! Logger.info("Failed to resolve AP link; may retry: #{inspect(params)}") e