Prevent requeuing Remote Fetcher jobs that exceed thread depth

This commit is contained in:
Mark Felder 2023-12-27 22:28:41 -05:00
parent a2708f7fe3
commit ad0a5deb67
5 changed files with 21 additions and 4 deletions

View File

@ -1 +1 @@
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. Remote object fetch failures will prevent the object fetch job from retrying if the object request returns 403, 404, 410, or exceeds the maximum thread depth.

View File

@ -74,7 +74,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}
{:containment, reason} = e -> {:containment, reason} = e ->
log_fetch_error(id, e) log_fetch_error(id, e)

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

@ -101,8 +101,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