Mark instances as unreachable when returning a 403 from an object fetch
This is a definite sign the instance is blocked and they are enforcing authorized_fetch
This commit is contained in:
parent
603e9f6a92
commit
d472bafec1
@ -99,6 +99,15 @@ defmodule Pleroma.Object.Fetcher do
|
|||||||
{:fetch_object, %Object{} = object} ->
|
{:fetch_object, %Object{} = object} ->
|
||||||
{:ok, object}
|
{:ok, object}
|
||||||
|
|
||||||
|
{:fetch, {:error, {:ok, %Tesla.Env{status: 403}}}} ->
|
||||||
|
Instances.set_consistently_unreachable(id)
|
||||||
|
|
||||||
|
Logger.error(
|
||||||
|
"Error while fetching #{id}: HTTP 403 likely due to instance block rejecting the signed fetch."
|
||||||
|
)
|
||||||
|
|
||||||
|
{:error, "Object fetch has been denied"}
|
||||||
|
|
||||||
{:fetch, {:error, error}} ->
|
{:fetch, {:error, error}} ->
|
||||||
Logger.error("Error while fetching #{id}: #{inspect(error)}")
|
Logger.error("Error while fetching #{id}: #{inspect(error)}")
|
||||||
{:error, error}
|
{:error, error}
|
||||||
|
@ -10,6 +10,17 @@ defmodule Pleroma.Workers.RemoteFetcherWorker do
|
|||||||
@impl Oban.Worker
|
@impl Oban.Worker
|
||||||
def perform(%Job{args: %{"op" => "fetch_remote", "id" => id} = args}) do
|
def perform(%Job{args: %{"op" => "fetch_remote", "id" => id} = args}) do
|
||||||
{:ok, _object} = Fetcher.fetch_object_from_id(id, depth: args["depth"])
|
{:ok, _object} = Fetcher.fetch_object_from_id(id, depth: args["depth"])
|
||||||
|
|
||||||
|
case Fetcher.fetch_object_from_id(id, depth: args["depth"]) do
|
||||||
|
{:ok, _object} ->
|
||||||
|
:ok
|
||||||
|
|
||||||
|
{:error, reason = "Object fetch has been denied"} ->
|
||||||
|
{:cancel, reason}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
:error
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl Oban.Worker
|
@impl Oban.Worker
|
||||||
|
@ -25,6 +25,9 @@ defmodule Pleroma.Object.FetcherTest do
|
|||||||
%{method: :get, url: "https://mastodon.example.org/users/userisgone404"} ->
|
%{method: :get, url: "https://mastodon.example.org/users/userisgone404"} ->
|
||||||
%Tesla.Env{status: 404}
|
%Tesla.Env{status: 404}
|
||||||
|
|
||||||
|
%{method: :get, url: "https://octodon.social/users/cwebber/statuses/111647596861000656"} ->
|
||||||
|
%Tesla.Env{status: 403}
|
||||||
|
|
||||||
%{
|
%{
|
||||||
method: :get,
|
method: :get,
|
||||||
url:
|
url:
|
||||||
@ -233,6 +236,18 @@ defmodule Pleroma.Object.FetcherTest do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "handle HTTP 403 response" do
|
||||||
|
object_id = "https://octodon.social/users/cwebber/statuses/111647596861000656"
|
||||||
|
Instances.set_reachable(object_id)
|
||||||
|
|
||||||
|
assert Instances.reachable?(object_id)
|
||||||
|
|
||||||
|
assert {:error, "Object fetch has been denied"} ==
|
||||||
|
Fetcher.fetch_object_from_id(object_id)
|
||||||
|
|
||||||
|
refute Instances.reachable?(object_id)
|
||||||
|
end
|
||||||
|
|
||||||
test "it can fetch pleroma polls with attachments" do
|
test "it can fetch pleroma polls with attachments" do
|
||||||
{:ok, object} =
|
{:ok, object} =
|
||||||
Fetcher.fetch_object_from_id("https://patch.cx/objects/tesla_mock/poll_attachment")
|
Fetcher.fetch_object_from_id("https://patch.cx/objects/tesla_mock/poll_attachment")
|
||||||
|
Loading…
Reference in New Issue
Block a user