Merge pull request 'Magical patches' (#357) from magical-patches into develop
[akkoma] / test / pleroma / web / activity_pub / mrf / simple_policy_test.exs
index 5f80c162967772881c7808ba76c489902f2a70a6..875cf8f43232db382c8a40c15851c98f9c3f6fc7 100644 (file)
@@ -26,15 +26,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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) ==
@@ -42,12 +45,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
                 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) ==
@@ -55,6 +64,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
                 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
@@ -63,38 +77,48 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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" => [%{}],
@@ -104,6 +128,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     }
   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], [])
@@ -124,8 +160,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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)
@@ -133,9 +169,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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
@@ -143,7 +179,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   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}
@@ -151,7 +187,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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
@@ -172,7 +208,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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
@@ -181,7 +217,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
         |> 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()
@@ -196,7 +232,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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
@@ -253,8 +289,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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,
      %{
@@ -282,9 +318,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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
@@ -320,12 +356,92 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
       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}
@@ -412,10 +528,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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}
@@ -457,9 +573,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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"]
@@ -493,9 +609,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     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"]
@@ -553,10 +669,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   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
@@ -570,13 +686,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     }
   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"
@@ -589,10 +705,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     }
   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