test "is empty" do
clear_config([:mrf_simple, :media_removal], [])
media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) == {:ok, media_message}
+ assert SimplePolicy.filter(media_update_message) == {:ok, media_update_message}
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
test "has a matching host" do
clear_config([:mrf_simple, :media_removal], [{"remote.instance", "Some reason"}])
media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) ==
media_message
|> Map.put("object", Map.delete(media_message["object"], "attachment"))}
+ assert SimplePolicy.filter(media_update_message) ==
+ {:ok,
+ media_update_message
+ |> Map.put("object", Map.delete(media_update_message["object"], "attachment"))}
+
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
test "match with wildcard domain" do
- clear_config([:mrf_simple, :media_removal], [{"remote.instance", "Whatever reason"}])
- media_message = build_media_message("sub.remote.instance")
+ clear_config([:mrf_simple, :media_removal], [{"*.remote.instance", "Whatever reason"}])
+ media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) ==
media_message
|> Map.put("object", Map.delete(media_message["object"], "attachment"))}
+ assert SimplePolicy.filter(media_update_message) ==
+ {:ok,
+ media_update_message
+ |> Map.put("object", Map.delete(media_update_message["object"], "attachment"))}
+
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
end
test "is empty" do
clear_config([:mrf_simple, :media_nsfw], [])
media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) == {:ok, media_message}
+ assert SimplePolicy.filter(media_update_message) == {:ok, media_update_message}
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
test "has a matching host" do
clear_config([:mrf_simple, :media_nsfw], [{"remote.instance", "Whetever"}])
media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) ==
{:ok, put_in(media_message, ["object", "sensitive"], true)}
+ assert SimplePolicy.filter(media_update_message) ==
+ {:ok, put_in(media_update_message, ["object", "sensitive"], true)}
+
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
test "match with wildcard domain" do
- clear_config([:mrf_simple, :media_nsfw], [{"remote.instance", "yeah yeah"}])
- media_message = build_media_message("sub.remote.instance")
+ clear_config([:mrf_simple, :media_nsfw], [{"*.remote.instance", "yeah yeah"}])
+ media_message = build_media_message()
+ media_update_message = build_media_update_message()
local_message = build_local_message()
assert SimplePolicy.filter(media_message) ==
{:ok, put_in(media_message, ["object", "sensitive"], true)}
+ assert SimplePolicy.filter(media_update_message) ==
+ {:ok, put_in(media_update_message, ["object", "sensitive"], true)}
+
assert SimplePolicy.filter(local_message) == {:ok, local_message}
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",
"object" => %{
"attachment" => [%{}],
}
end
+ defp build_media_update_message do
+ %{
+ "actor" => "https://remote.instance/users/bob",
+ "type" => "Update",
+ "object" => %{
+ "attachment" => [%{}],
+ "tag" => ["foo"],
+ "sensitive" => false
+ }
+ }
+ end
+
describe "when :report_removal" do
test "is empty" do
clear_config([:mrf_simple, :report_removal], [])
end
test "match with wildcard domain" do
- clear_config([:mrf_simple, :report_removal], [{"remote.instance", "suya"}])
- report_message = build_report_message("sub.remote.instance")
+ clear_config([:mrf_simple, :report_removal], [{"*.remote.instance", "suya"}])
+ report_message = build_report_message()
local_message = build_local_message()
assert {:reject, _} = SimplePolicy.filter(report_message)
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"
}
end
describe "when :federated_timeline_removal" do
test "is empty" do
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()
assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message}
end
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
end
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
|> Map.fetch!(:host)
clear_config([:mrf_simple, :federated_timeline_removal], [
- {ftl_message_actor_host, "owo"}
+ {"*." <> ftl_message_actor_host, "owo"}
])
local_message = build_local_message()
end
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
end
end
- defp build_ftl_actor_and_message(ap_id) do
- actor = insert(:user, ap_id: ap_id)
+ defp build_ftl_actor_and_message do
+ actor = insert(:user)
{actor,
%{
end
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)
end
assert {:reject, _} = SimplePolicy.filter(announce)
end
+
+ test "accept by matching context URI if :handle_threads is disabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], false)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put("context", "https://blocked.tld/contexts/abc")
+
+ assert {:ok, _} = SimplePolicy.filter(remote_message)
+ end
+
+ test "accept by matching conversation field if :handle_threads is disabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], false)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put(
+ "conversation",
+ "tag:blocked.tld,1997-06-25:objectId=12345:objectType=Conversation"
+ )
+
+ assert {:ok, _} = SimplePolicy.filter(remote_message)
+ end
+
+ test "accept by matching reply ID if :handle_threads is disabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], false)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put("type", "Create")
+ |> Map.put("object", %{
+ "type" => "Note",
+ "inReplyTo" => "https://blocked.tld/objects/1"
+ })
+
+ assert {:ok, _} = SimplePolicy.filter(remote_message)
+ end
+
+ test "reject by matching context URI if :handle_threads is enabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], true)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put("context", "https://blocked.tld/contexts/abc")
+
+ assert {:reject, _} = SimplePolicy.filter(remote_message)
+ end
+
+ test "reject by matching conversation field if :handle_threads is enabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], true)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put(
+ "conversation",
+ "tag:blocked.tld,1997-06-25:objectId=12345:objectType=Conversation"
+ )
+
+ assert {:reject, _} = SimplePolicy.filter(remote_message)
+ end
+
+ test "reject by matching reply ID if :handle_threads is enabled" do
+ clear_config([:mrf_simple, :reject], [{"blocked.tld", ""}])
+ clear_config([:mrf_simple, :handle_threads], true)
+
+ remote_message =
+ build_remote_message()
+ |> Map.put("type", "Create")
+ |> Map.put("object", %{
+ "type" => "Note",
+ "inReplyTo" => "https://blocked.tld/objects/1"
+ })
+
+ assert {:reject, _} = SimplePolicy.filter(remote_message)
+ end
end
describe "when :followers_only" do
test "is empty" do
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()
assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message}
end
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()
- remote_message = build_remote_message("sub.remote.instance")
+ remote_message = build_remote_message()
assert SimplePolicy.filter(local_message) == {:ok, local_message}
assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
end
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)
refute filtered["icon"]
end
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)
refute filtered["image"]
end
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
- deletion_message = build_remote_deletion_message("sub.remote.instance")
+ deletion_message = build_remote_deletion_message()
assert {:reject, _} = SimplePolicy.filter(deletion_message)
end
}
end
- defp build_remote_message(domain \\ "remote.instance") do
- %{"actor" => "https://#{domain}/users/bob"}
+ defp build_remote_message do
+ %{"actor" => "https://remote.instance/users/bob"}
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" => %{
"url" => "http://example.com/image.jpg",
"type" => "Image"
}
end
- defp build_remote_deletion_message(domain \\ "remote.instance") do
+ defp build_remote_deletion_message do
%{
"type" => "Delete",
- "actor" => "https://#{domain}/users/bob"
+ "actor" => "https://remote.instance/users/bob"
}
end
end