automatically trim loading *. prefixes on domain blocks

This commit is contained in:
FloatingGhost 2022-11-07 22:33:18 +00:00
parent c0eecb55bf
commit 7bbaa8f8e0
4 changed files with 37 additions and 38 deletions

View file

@ -6,9 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased ## Unreleased
## UPGRADE NOTES
- Change your instance blocks to remove any `*.` prefixes. `example.com` will block `*.example.com` by default now
## Added ## Added
- Officially supported docker release - Officially supported docker release
- Ability to remove followers unilaterally without a block - Ability to remove followers unilaterally without a block

View file

@ -154,6 +154,8 @@ defp get_policies(_), do: []
# - https://extra.baddomain.net/ # - https://extra.baddomain.net/
# Does NOT match the following: # Does NOT match the following:
# - https://maybebaddomain.net/ # - https://maybebaddomain.net/
def subdomain_regex("*." <> domain), do: subdomain_regex(domain)
def subdomain_regex(domain) do def subdomain_regex(domain) do
~r/^(.+\.)?#{Regex.escape(domain)}$/i ~r/^(.+\.)?#{Regex.escape(domain)}$/i
end end

View file

@ -46,8 +46,8 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
clear_config([:mrf_simple, :media_removal], [{"remote.instance", "Whatever reason"}]) clear_config([:mrf_simple, :media_removal], [{"*.remote.instance", "Whatever reason"}])
media_message = build_media_message("sub.remote.instance") media_message = build_media_message()
local_message = build_local_message() local_message = build_local_message()
assert SimplePolicy.filter(media_message) == assert SimplePolicy.filter(media_message) ==
@ -81,8 +81,8 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
clear_config([:mrf_simple, :media_nsfw], [{"remote.instance", "yeah yeah"}]) clear_config([:mrf_simple, :media_nsfw], [{"*.remote.instance", "yeah yeah"}])
media_message = build_media_message("sub.remote.instance") media_message = build_media_message()
local_message = build_local_message() local_message = build_local_message()
assert SimplePolicy.filter(media_message) == assert SimplePolicy.filter(media_message) ==
@ -92,9 +92,9 @@ test "match with wildcard domain" do
end end
end end
defp build_media_message(domain \\ "remote.instance") do defp build_media_message do
%{ %{
"actor" => "https://#{domain}/users/bob", "actor" => "https://remote.instance/users/bob",
"type" => "Create", "type" => "Create",
"object" => %{ "object" => %{
"attachment" => [%{}], "attachment" => [%{}],
@ -124,8 +124,8 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
clear_config([:mrf_simple, :report_removal], [{"remote.instance", "suya"}]) clear_config([:mrf_simple, :report_removal], [{"*.remote.instance", "suya"}])
report_message = build_report_message("sub.remote.instance") report_message = build_report_message()
local_message = build_local_message() local_message = build_local_message()
assert {:reject, _} = SimplePolicy.filter(report_message) assert {:reject, _} = SimplePolicy.filter(report_message)
@ -133,9 +133,9 @@ test "match with wildcard domain" do
end end
end end
defp build_report_message(domain \\ "remote.instance") do defp build_report_message do
%{ %{
"actor" => "https://#{domain}/users/bob", "actor" => "https://remote.instance/users/bob",
"type" => "Flag" "type" => "Flag"
} }
end end
@ -143,7 +143,7 @@ defp build_report_message(domain \\ "remote.instance") do
describe "when :federated_timeline_removal" do describe "when :federated_timeline_removal" do
test "is empty" do test "is empty" do
clear_config([:mrf_simple, :federated_timeline_removal], []) clear_config([:mrf_simple, :federated_timeline_removal], [])
{_, ftl_message} = build_ftl_actor_and_message("https://remote.instance/users/bob") {_, ftl_message} = build_ftl_actor_and_message()
local_message = build_local_message() local_message = build_local_message()
assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message} assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message}
@ -151,7 +151,7 @@ test "is empty" do
end end
test "has a matching host" do test "has a matching host" do
{actor, ftl_message} = build_ftl_actor_and_message("https://remote.instance/users/bob") {actor, ftl_message} = build_ftl_actor_and_message()
ftl_message_actor_host = ftl_message_actor_host =
ftl_message ftl_message
@ -172,7 +172,7 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
{actor, ftl_message} = build_ftl_actor_and_message("https://sub.remote.instance/users/bob") {actor, ftl_message} = build_ftl_actor_and_message()
ftl_message_actor_host = ftl_message_actor_host =
ftl_message ftl_message
@ -181,7 +181,7 @@ test "match with wildcard domain" do
|> Map.fetch!(:host) |> Map.fetch!(:host)
clear_config([:mrf_simple, :federated_timeline_removal], [ clear_config([:mrf_simple, :federated_timeline_removal], [
{ftl_message_actor_host, "owo"} {"*." <> ftl_message_actor_host, "owo"}
]) ])
local_message = build_local_message() local_message = build_local_message()
@ -196,7 +196,7 @@ test "match with wildcard domain" do
end end
test "has a matching host but only as:Public in to" do test "has a matching host but only as:Public in to" do
{_actor, ftl_message} = build_ftl_actor_and_message("https://remote.instance/users/bob") {_actor, ftl_message} = build_ftl_actor_and_message()
ftl_message_actor_host = ftl_message_actor_host =
ftl_message ftl_message
@ -253,8 +253,8 @@ test "obfuscates domains listed in :transparency_obfuscate_domains" do
end end
end end
defp build_ftl_actor_and_message(ap_id) do defp build_ftl_actor_and_message do
actor = insert(:user, ap_id: ap_id) actor = insert(:user)
{actor, {actor,
%{ %{
@ -282,9 +282,9 @@ test "activity has a matching host" do
end end
test "activity matches with wildcard domain" do test "activity matches with wildcard domain" do
clear_config([:mrf_simple, :reject], [{"remote.instance", ""}]) clear_config([:mrf_simple, :reject], [{"*.remote.instance", ""}])
remote_message = build_remote_message("sub.remote.instance") remote_message = build_remote_message()
assert {:reject, _} = SimplePolicy.filter(remote_message) assert {:reject, _} = SimplePolicy.filter(remote_message)
end end
@ -325,7 +325,7 @@ test "reject by URI object" do
describe "when :followers_only" do describe "when :followers_only" do
test "is empty" do test "is empty" do
clear_config([:mrf_simple, :followers_only], []) clear_config([:mrf_simple, :followers_only], [])
{_, ftl_message} = build_ftl_actor_and_message("https://remote.instance/users/alice") {_, ftl_message} = build_ftl_actor_and_message()
local_message = build_local_message() local_message = build_local_message()
assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message} assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message}
@ -412,10 +412,10 @@ test "activity has a matching host" do
end end
test "activity matches with wildcard domain" do test "activity matches with wildcard domain" do
clear_config([:mrf_simple, :accept], [{"remote.instance", ""}]) clear_config([:mrf_simple, :accept], [{"*.remote.instance", ""}])
local_message = build_local_message() local_message = build_local_message()
remote_message = build_remote_message("sub.remote.instance") remote_message = build_remote_message()
assert SimplePolicy.filter(local_message) == {:ok, local_message} assert SimplePolicy.filter(local_message) == {:ok, local_message}
assert SimplePolicy.filter(remote_message) == {:ok, remote_message} assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
@ -457,9 +457,9 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
clear_config([:mrf_simple, :avatar_removal], [{"remote.instance", ""}]) clear_config([:mrf_simple, :avatar_removal], [{"*.remote.instance", ""}])
remote_user = build_remote_user("sub.remote.instance") remote_user = build_remote_user()
{:ok, filtered} = SimplePolicy.filter(remote_user) {:ok, filtered} = SimplePolicy.filter(remote_user)
refute filtered["icon"] refute filtered["icon"]
@ -493,9 +493,9 @@ test "has a matching host" do
end end
test "match with wildcard domain" do test "match with wildcard domain" do
clear_config([:mrf_simple, :banner_removal], [{"remote.instance", ""}]) clear_config([:mrf_simple, :banner_removal], [{"*.remote.instance", ""}])
remote_user = build_remote_user("sub.remote.instance") remote_user = build_remote_user()
{:ok, filtered} = SimplePolicy.filter(remote_user) {:ok, filtered} = SimplePolicy.filter(remote_user)
refute filtered["image"] refute filtered["image"]
@ -553,10 +553,10 @@ test "it rejects the deletion" do
end end
describe "when :reject_deletes match with wildcard domain" do describe "when :reject_deletes match with wildcard domain" do
setup do: clear_config([:mrf_simple, :reject_deletes], [{"remote.instance", ""}]) setup do: clear_config([:mrf_simple, :reject_deletes], [{"*.remote.instance", ""}])
test "it rejects the deletion" do test "it rejects the deletion" do
deletion_message = build_remote_deletion_message("sub.remote.instance") deletion_message = build_remote_deletion_message()
assert {:reject, _} = SimplePolicy.filter(deletion_message) assert {:reject, _} = SimplePolicy.filter(deletion_message)
end end
@ -570,13 +570,13 @@ defp build_local_message do
} }
end end
defp build_remote_message(domain \\ "remote.instance") do defp build_remote_message do
%{"actor" => "https://#{domain}/users/bob"} %{"actor" => "https://remote.instance/users/bob"}
end end
defp build_remote_user(domain \\ "remote.instance") do defp build_remote_user do
%{ %{
"id" => "https://#{domain}/users/bob", "id" => "https://remote.instance/users/bob",
"icon" => %{ "icon" => %{
"url" => "http://example.com/image.jpg", "url" => "http://example.com/image.jpg",
"type" => "Image" "type" => "Image"
@ -589,10 +589,10 @@ defp build_remote_user(domain \\ "remote.instance") do
} }
end end
defp build_remote_deletion_message(domain \\ "remote.instance") do defp build_remote_deletion_message do
%{ %{
"type" => "Delete", "type" => "Delete",
"actor" => "https://#{domain}/users/bob" "actor" => "https://remote.instance/users/bob"
} }
end end
end end

View file

@ -10,7 +10,7 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do
test "subdomains_regex/1" do test "subdomains_regex/1" do
assert MRF.subdomains_regex(["unsafe.tld", "*.unsafe.tld"]) == [ assert MRF.subdomains_regex(["unsafe.tld", "*.unsafe.tld"]) == [
~r/^(.+\.)?unsafe\.tld$/i, ~r/^(.+\.)?unsafe\.tld$/i,
~r/^(.+\.)?\*\.unsafe\.tld$/i ~r/^(.+\.)?unsafe\.tld$/i
] ]
end end