Prevent requeuing Remote Fetcher jobs that exceed thread depth

This commit is contained in:
Mark Felder 2023-12-27 22:28:41 -05:00 committed by Floatingghost
parent 7e5004b3e2
commit ff515c05c3
5 changed files with 20 additions and 5 deletions

View file

@ -1,2 +0,0 @@
Remote object fetch failures will prevent the object fetch job from retrying if the object has been deleted or the fetch was denied with a 403 due to instance block behavior with authorized_fetch enabled.
Skip fetching objects from unreachable instances.

View file

@ -153,7 +153,7 @@ def fetch_object_from_id(id, options \\ []) do
else else
{:allowed_depth, false} = e -> {:allowed_depth, false} = e ->
log_fetch_error(id, e) log_fetch_error(id, e)
{:error, "Max thread distance exceeded."} {:error, :allowed_depth}
{:scheme, false} -> {:scheme, false} ->
{:error, "URI Scheme Invalid"} {:error, "URI Scheme Invalid"}

View file

@ -21,6 +21,9 @@ def perform(%Job{args: %{"op" => "fetch_remote", "id" => id} = args}) do
{:error, :not_found} -> {:error, :not_found} ->
{:cancel, :not_found} {:cancel, :not_found}
{:error, :allowed_depth} ->
{:cancel, :allowed_depth}
_ -> _ ->
:error :error
end end

View file

@ -205,8 +205,7 @@ test "it works when fetching the OP actor errors out" do
test "it returns thread depth exceeded error if thread depth is exceeded" do test "it returns thread depth exceeded error if thread depth is exceeded" do
clear_config([:instance, :federation_incoming_replies_max_depth], 0) clear_config([:instance, :federation_incoming_replies_max_depth], 0)
assert {:error, "Max thread distance exceeded."} = assert {:error, :allowed_depth} = Fetcher.fetch_object_from_id(@ap_id, depth: 1)
Fetcher.fetch_object_from_id(@ap_id, depth: 1)
end end
test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do

View file

@ -13,6 +13,7 @@ defmodule Pleroma.Workers.RemoteFetcherWorkerTest do
@deleted_object_two "https://deleted-410.example.com/" @deleted_object_two "https://deleted-410.example.com/"
@unauthorized_object "https://unauthorized.example.com/" @unauthorized_object "https://unauthorized.example.com/"
@unreachable_object "https://unreachable.example.com/" @unreachable_object "https://unreachable.example.com/"
@depth_object "https://depth.example.com/"
describe "it does not" do describe "it does not" do
setup do setup do
@ -31,6 +32,11 @@ defmodule Pleroma.Workers.RemoteFetcherWorkerTest do
%Tesla.Env{ %Tesla.Env{
status: 403 status: 403
} }
%{method: :get, url: @depth_object} ->
%Tesla.Env{
status: 200
}
end) end)
end end
@ -63,5 +69,14 @@ test "fetch an unreachable instance" do
args: %{"op" => "fetch_remote", "id" => @unreachable_object} args: %{"op" => "fetch_remote", "id" => @unreachable_object}
}) })
end end
test "requeue an object that exceeded depth" do
clear_config([:instance, :federation_incoming_replies_max_depth], 0)
assert {:cancel, _} =
RemoteFetcherWorker.perform(%Oban.Job{
args: %{"op" => "fetch_remote", "id" => @depth_object, "depth" => 1}
})
end
end end
end end