Fetcher: Correctly return MRF reject reason

This commit is contained in:
Haelwenn (lanodan) Monnier 2020-09-11 19:58:58 +02:00
parent 6316350918
commit f1f44069ae
No known key found for this signature in database
GPG key ID: D5B7A8E43C997DEE
3 changed files with 23 additions and 10 deletions

View file

@ -98,8 +98,8 @@ def fetch_object_from_id(id, options \\ []) do
{:containment, _} -> {:containment, _} ->
{:error, "Object containment failed."} {:error, "Object containment failed."}
{:transmogrifier, {:error, {:reject, nil}}} -> {:transmogrifier, {:error, {:reject, e}}} ->
{:reject, nil} {:reject, e}
{:transmogrifier, _} = e -> {:transmogrifier, _} = e ->
{:error, e} {:error, e}

View file

@ -154,8 +154,8 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when
{:remote_limit_pass, _} -> {:remote_limit_pass, _} ->
{:error, :remote_limit} {:error, :remote_limit}
{:reject, reason} -> {:reject, _} = e ->
{:error, reason} {:error, e}
end end
end end

View file

@ -6,10 +6,13 @@ defmodule Pleroma.Object.FetcherTest do
use Pleroma.DataCase use Pleroma.DataCase
alias Pleroma.Activity alias Pleroma.Activity
alias Pleroma.Config
alias Pleroma.Object alias Pleroma.Object
alias Pleroma.Object.Fetcher alias Pleroma.Object.Fetcher
import Tesla.Mock
import ExUnit.CaptureLog
import Mock import Mock
import Tesla.Mock
setup do setup do
mock(fn mock(fn
@ -71,20 +74,20 @@ test "it works when fetching the OP actor errors out" do
setup do: clear_config([:instance, :federation_incoming_replies_max_depth]) setup do: clear_config([:instance, :federation_incoming_replies_max_depth])
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
Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) Config.put([:instance, :federation_incoming_replies_max_depth], 0)
assert {:error, "Max thread distance exceeded."} = assert {:error, "Max thread distance exceeded."} =
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
Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) Config.put([:instance, :federation_incoming_replies_max_depth], 0)
assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id) assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id)
end end
test "it fetches object if requested depth does not exceed max thread depth" do test "it fetches object if requested depth does not exceed max thread depth" do
Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 10) Config.put([:instance, :federation_incoming_replies_max_depth], 10)
assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id, depth: 10) assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id, depth: 10)
end end
@ -120,6 +123,16 @@ test "it fetches an object" do
assert object == object_again assert object == object_again
end end
test "Return MRF reason when fetched status is rejected by one" do
clear_config([:mrf_keyword, :reject], ["yeah"])
clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy])
assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} ==
Fetcher.fetch_object_from_id(
"http://mastodon.example.org/@admin/99541947525187367"
)
end
end end
describe "implementation quirks" do describe "implementation quirks" do
@ -212,7 +225,7 @@ test "it can refetch pruned objects" do
Pleroma.Signature, Pleroma.Signature,
[:passthrough], [:passthrough],
[] do [] do
Pleroma.Config.put([:activitypub, :sign_object_fetches], true) Config.put([:activitypub, :sign_object_fetches], true)
Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
@ -223,7 +236,7 @@ test "it can refetch pruned objects" do
Pleroma.Signature, Pleroma.Signature,
[:passthrough], [:passthrough],
[] do [] do
Pleroma.Config.put([:activitypub, :sign_object_fetches], false) Config.put([:activitypub, :sign_object_fetches], false)
Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")