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 @@ defmodule Pleroma.Object.Fetcher 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 @@ defmodule Pleroma.Workers.RemoteFetcherWorker 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 @@ defmodule Pleroma.Object.FetcherTest 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 @@ defmodule Pleroma.Workers.RemoteFetcherWorkerTest 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