Change what nodeinfo returns without breaking backwards compatibility

* Only for SimplePolicy for now
* I added an extra mrf_simple_info key that has an object as value. The object contains only relevant extra info
This commit is contained in:
Ilja 2020-11-20 13:48:28 +01:00 committed by Haelwenn (lanodan) Monnier
parent 7fdc3cde06
commit 47fc57bbcc
No known key found for this signature in database
GPG key ID: D5B7A8E43C997DEE
2 changed files with 90 additions and 28 deletions

View file

@ -260,15 +260,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
def describe do def describe do
exclusions = Config.get([:mrf, :transparency_exclusions]) |> MRF.instance_list_from_tuples() exclusions = Config.get([:mrf, :transparency_exclusions]) |> MRF.instance_list_from_tuples()
mrf_simple = mrf_simple_excluded =
Config.get(:mrf_simple) Config.get(:mrf_simple)
|> Enum.map(fn {k, v} -> {k, Enum.reject(v, fn {v, _} -> v in exclusions end)} end) |> Enum.map(fn {k, v} -> {k, Enum.reject(v, fn {v, _} -> v in exclusions end)} end)
mrf_simple =
mrf_simple_excluded
|> Enum.map(fn {k, v} -> |> Enum.map(fn {k, v} ->
{k, Enum.map(v, fn {i, r} -> %{"instance" => i, "reason" => r} end)} {k, Enum.map(v, fn {instance, _} -> instance end)}
end) end)
|> Enum.into(%{}) |> Enum.into(%{})
{:ok, %{mrf_simple: mrf_simple}} mrf_simple_info =
mrf_simple_excluded
|> Enum.map(fn {k, v} -> {k, Enum.reject(v, fn {_, reason} -> reason == "" end)} end)
|> Enum.reject(fn {_, v} -> v == [] end)
|> Enum.map(fn {k, l} ->
{k, l |> Enum.map(fn {i, r} -> {i, %{"reason" => r}} end) |> Enum.into(%{})}
end)
|> Enum.into(%{})
{:ok, %{mrf_simple: mrf_simple, mrf_simple_info: mrf_simple_info}}
end end
@impl true @impl true

View file

@ -166,39 +166,89 @@ defmodule Pleroma.Web.NodeInfoTest do
assert response["metadata"]["federation"]["quarantined_instances"] == expected_config assert response["metadata"]["federation"]["quarantined_instances"] == expected_config
end end
test "it shows MRF transparency data if enabled", %{conn: conn} do describe "MRF SimplePolicy" do
clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) setup do
clear_config([:mrf, :transparency], true) clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy])
clear_config([:mrf, :transparency], true)
end
simple_config = %{"reject" => [{"example.com", ""}]} test "shows MRF transparency data if enabled", %{conn: conn} do
clear_config(:mrf_simple, simple_config) simple_config = %{"reject" => [{"example.com", ""}]}
clear_config(:mrf_simple, simple_config)
expected_config = %{"reject" => [%{"instance" => "example.com", "reason" => ""}]} expected_config = %{"reject" => ["example.com"]}
response = response =
conn conn
|> get("/nodeinfo/2.1.json") |> get("/nodeinfo/2.1.json")
|> json_response(:ok) |> json_response(:ok)
assert response["metadata"]["federation"]["mrf_simple"] == expected_config assert response["metadata"]["federation"]["mrf_simple"] == expected_config
end end
test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do test "performs exclusions from MRF transparency data if configured", %{conn: conn} do
clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) clear_config([:mrf, :transparency_exclusions], [
clear_config([:mrf, :transparency], true) {"other.site", "We don't want them to know"}
clear_config([:mrf, :transparency_exclusions], [{"other.site", "We don't want them to know"}]) ])
simple_config = %{"reject" => [{"example.com", ""}, {"other.site", ""}]} simple_config = %{"reject" => [{"example.com", ""}, {"other.site", ""}]}
clear_config(:mrf_simple, simple_config) clear_config(:mrf_simple, simple_config)
expected_config = %{"reject" => [%{"instance" => "example.com", "reason" => ""}]} expected_config = %{"reject" => ["example.com"]}
response = response =
conn conn
|> get("/nodeinfo/2.1.json") |> get("/nodeinfo/2.1.json")
|> json_response(:ok) |> json_response(:ok)
assert response["metadata"]["federation"]["mrf_simple"] == expected_config assert response["metadata"]["federation"]["mrf_simple"] == expected_config
assert response["metadata"]["federation"]["exclusions"] == true assert response["metadata"]["federation"]["exclusions"] == true
end
test "shows extra information in the mrf_simple_extra field for relevant entries", %{
conn: conn
} do
simple_config = %{
media_removal: [{"no.media", "LEEWWWDD >//<"}],
media_nsfw: [],
federated_timeline_removal: [{"no.ftl", ""}],
report_removal: [],
reject: [
{"example.instance", "Some reason"},
{"uwu.owo", "awoo to much"},
{"no.reason", ""}
],
followers_only: [],
accept: [],
avatar_removal: [],
banner_removal: [],
reject_deletes: [
{"peak.me", "I want to peak at what they don't want me to see, eheh"}
]
}
clear_config(:mrf_simple, simple_config)
clear_config([:mrf, :transparency_exclusions], [
{"peak.me", "I don't want them to know"}
])
expected_config = %{
"media_removal" => %{
"no.media" => %{"reason" => "LEEWWWDD >//<"}
},
"reject" => %{
"example.instance" => %{"reason" => "Some reason"},
"uwu.owo" => %{"reason" => "awoo to much"}
}
}
response =
conn
|> get("/nodeinfo/2.1.json")
|> json_response(:ok)
assert response["metadata"]["federation"]["mrf_simple_info"] == expected_config
end
end end
end end