Merge remote-tracking branch 'upstream/develop' into simplepolicy-announce-leak
[akkoma] / test / pleroma / web / activity_pub / mrf / simple_policy_test.exs
index 9777fcde1b0d8a2e98c319b7f643bd2170911d03..9c263c7e6fd1cc50de0069d4acf10555c41d7c42 100644 (file)
@@ -1,11 +1,10 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   use Pleroma.DataCase
   import Pleroma.Factory
-  alias Pleroma.Config
   alias Pleroma.Web.ActivityPub.MRF.SimplePolicy
   alias Pleroma.Web.CommonAPI
 
@@ -25,7 +24,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :media_removal" do
     test "is empty" do
-      Config.put([:mrf_simple, :media_removal], [])
+      clear_config([:mrf_simple, :media_removal], [])
       media_message = build_media_message()
       local_message = build_local_message()
 
@@ -34,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "has a matching host" do
-      Config.put([:mrf_simple, :media_removal], ["remote.instance"])
+      clear_config([:mrf_simple, :media_removal], ["remote.instance"])
       media_message = build_media_message()
       local_message = build_local_message()
 
@@ -47,7 +46,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "match with wildcard domain" do
-      Config.put([:mrf_simple, :media_removal], ["*.remote.instance"])
+      clear_config([:mrf_simple, :media_removal], ["*.remote.instance"])
       media_message = build_media_message()
       local_message = build_local_message()
 
@@ -62,7 +61,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :media_nsfw" do
     test "is empty" do
-      Config.put([:mrf_simple, :media_nsfw], [])
+      clear_config([:mrf_simple, :media_nsfw], [])
       media_message = build_media_message()
       local_message = build_local_message()
 
@@ -71,29 +70,23 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "has a matching host" do
-      Config.put([:mrf_simple, :media_nsfw], ["remote.instance"])
+      clear_config([:mrf_simple, :media_nsfw], ["remote.instance"])
       media_message = build_media_message()
       local_message = build_local_message()
 
       assert SimplePolicy.filter(media_message) ==
-               {:ok,
-                media_message
-                |> put_in(["object", "hashtags"], ["foo", "nsfw"])
-                |> put_in(["object", "sensitive"], true)}
+               {:ok, put_in(media_message, ["object", "sensitive"], true)}
 
       assert SimplePolicy.filter(local_message) == {:ok, local_message}
     end
 
     test "match with wildcard domain" do
-      Config.put([:mrf_simple, :media_nsfw], ["*.remote.instance"])
+      clear_config([:mrf_simple, :media_nsfw], ["*.remote.instance"])
       media_message = build_media_message()
       local_message = build_local_message()
 
       assert SimplePolicy.filter(media_message) ==
-               {:ok,
-                media_message
-                |> put_in(["object", "hashtags"], ["foo", "nsfw"])
-                |> put_in(["object", "sensitive"], true)}
+               {:ok, put_in(media_message, ["object", "sensitive"], true)}
 
       assert SimplePolicy.filter(local_message) == {:ok, local_message}
     end
@@ -105,7 +98,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
       "type" => "Create",
       "object" => %{
         "attachment" => [%{}],
-        "hashtags" => ["foo"],
+        "tag" => ["foo"],
         "sensitive" => false
       }
     }
@@ -113,7 +106,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :report_removal" do
     test "is empty" do
-      Config.put([:mrf_simple, :report_removal], [])
+      clear_config([:mrf_simple, :report_removal], [])
       report_message = build_report_message()
       local_message = build_local_message()
 
@@ -122,7 +115,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "has a matching host" do
-      Config.put([:mrf_simple, :report_removal], ["remote.instance"])
+      clear_config([:mrf_simple, :report_removal], ["remote.instance"])
       report_message = build_report_message()
       local_message = build_local_message()
 
@@ -131,7 +124,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "match with wildcard domain" do
-      Config.put([:mrf_simple, :report_removal], ["*.remote.instance"])
+      clear_config([:mrf_simple, :report_removal], ["*.remote.instance"])
       report_message = build_report_message()
       local_message = build_local_message()
 
@@ -149,7 +142,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :federated_timeline_removal" do
     test "is empty" do
-      Config.put([:mrf_simple, :federated_timeline_removal], [])
+      clear_config([:mrf_simple, :federated_timeline_removal], [])
       {_, ftl_message} = build_ftl_actor_and_message()
       local_message = build_local_message()
 
@@ -166,7 +159,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
         |> URI.parse()
         |> Map.fetch!(:host)
 
-      Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
+      clear_config([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
       local_message = build_local_message()
 
       assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
@@ -187,7 +180,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
         |> URI.parse()
         |> Map.fetch!(:host)
 
-      Config.put([:mrf_simple, :federated_timeline_removal], ["*." <> ftl_message_actor_host])
+      clear_config([:mrf_simple, :federated_timeline_removal], ["*." <> ftl_message_actor_host])
       local_message = build_local_message()
 
       assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
@@ -210,7 +203,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
       ftl_message = Map.put(ftl_message, "cc", [])
 
-      Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
+      clear_config([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
 
       assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
       refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"]
@@ -231,7 +224,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :reject" do
     test "is empty" do
-      Config.put([:mrf_simple, :reject], [])
+      clear_config([:mrf_simple, :reject], [])
 
       remote_message = build_remote_message()
 
@@ -239,7 +232,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "activity has a matching host" do
-      Config.put([:mrf_simple, :reject], ["remote.instance"])
+      clear_config([:mrf_simple, :reject], ["remote.instance"])
 
       remote_message = build_remote_message()
 
@@ -247,7 +240,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "activity matches with wildcard domain" do
-      Config.put([:mrf_simple, :reject], ["*.remote.instance"])
+      clear_config([:mrf_simple, :reject], ["*.remote.instance"])
 
       remote_message = build_remote_message()
 
@@ -255,17 +248,41 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "actor has a matching host" do
-      Config.put([:mrf_simple, :reject], ["remote.instance"])
+      clear_config([:mrf_simple, :reject], ["remote.instance"])
 
       remote_user = build_remote_user()
 
       assert {:reject, _} = SimplePolicy.filter(remote_user)
     end
+
+    test "reject Announce when object would be rejected" do
+      clear_config([:mrf_simple, :reject], ["blocked.tld"])
+
+      announce = %{
+        "type" => "Announce",
+        "actor" => "https://okay.tld/users/alice",
+        "object" => %{"type" => "Note", "actor" => "https://blocked.tld/users/bob"}
+      }
+
+      assert {:reject, _} = SimplePolicy.filter(announce)
+    end
+
+    test "reject by URI object" do
+      clear_config([:mrf_simple, :reject], ["blocked.tld"])
+
+      announce = %{
+        "type" => "Announce",
+        "actor" => "https://okay.tld/users/alice",
+        "object" => "https://blocked.tld/activities/1"
+      }
+
+      assert {:reject, _} = SimplePolicy.filter(announce)
+    end
   end
 
   describe "when :followers_only" do
     test "is empty" do
-      Config.put([:mrf_simple, :followers_only], [])
+      clear_config([:mrf_simple, :followers_only], [])
       {_, ftl_message} = build_ftl_actor_and_message()
       local_message = build_local_message()
 
@@ -305,7 +322,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
         |> URI.parse()
         |> Map.fetch!(:host)
 
-      Config.put([:mrf_simple, :followers_only], [actor_domain])
+      clear_config([:mrf_simple, :followers_only], [actor_domain])
 
       assert {:ok, new_activity} = SimplePolicy.filter(activity)
       assert actor.follower_address in new_activity["cc"]
@@ -323,7 +340,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :accept" do
     test "is empty" do
-      Config.put([:mrf_simple, :accept], [])
+      clear_config([:mrf_simple, :accept], [])
 
       local_message = build_local_message()
       remote_message = build_remote_message()
@@ -333,7 +350,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "is not empty but activity doesn't have a matching host" do
-      Config.put([:mrf_simple, :accept], ["non.matching.remote"])
+      clear_config([:mrf_simple, :accept], ["non.matching.remote"])
 
       local_message = build_local_message()
       remote_message = build_remote_message()
@@ -343,7 +360,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "activity has a matching host" do
-      Config.put([:mrf_simple, :accept], ["remote.instance"])
+      clear_config([:mrf_simple, :accept], ["remote.instance"])
 
       local_message = build_local_message()
       remote_message = build_remote_message()
@@ -353,7 +370,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "activity matches with wildcard domain" do
-      Config.put([:mrf_simple, :accept], ["*.remote.instance"])
+      clear_config([:mrf_simple, :accept], ["*.remote.instance"])
 
       local_message = build_local_message()
       remote_message = build_remote_message()
@@ -363,7 +380,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "actor has a matching host" do
-      Config.put([:mrf_simple, :accept], ["remote.instance"])
+      clear_config([:mrf_simple, :accept], ["remote.instance"])
 
       remote_user = build_remote_user()
 
@@ -373,7 +390,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :avatar_removal" do
     test "is empty" do
-      Config.put([:mrf_simple, :avatar_removal], [])
+      clear_config([:mrf_simple, :avatar_removal], [])
 
       remote_user = build_remote_user()
 
@@ -381,7 +398,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "is not empty but it doesn't have a matching host" do
-      Config.put([:mrf_simple, :avatar_removal], ["non.matching.remote"])
+      clear_config([:mrf_simple, :avatar_removal], ["non.matching.remote"])
 
       remote_user = build_remote_user()
 
@@ -389,7 +406,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "has a matching host" do
-      Config.put([:mrf_simple, :avatar_removal], ["remote.instance"])
+      clear_config([:mrf_simple, :avatar_removal], ["remote.instance"])
 
       remote_user = build_remote_user()
       {:ok, filtered} = SimplePolicy.filter(remote_user)
@@ -398,7 +415,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "match with wildcard domain" do
-      Config.put([:mrf_simple, :avatar_removal], ["*.remote.instance"])
+      clear_config([:mrf_simple, :avatar_removal], ["*.remote.instance"])
 
       remote_user = build_remote_user()
       {:ok, filtered} = SimplePolicy.filter(remote_user)
@@ -409,7 +426,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
 
   describe "when :banner_removal" do
     test "is empty" do
-      Config.put([:mrf_simple, :banner_removal], [])
+      clear_config([:mrf_simple, :banner_removal], [])
 
       remote_user = build_remote_user()
 
@@ -417,7 +434,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "is not empty but it doesn't have a matching host" do
-      Config.put([:mrf_simple, :banner_removal], ["non.matching.remote"])
+      clear_config([:mrf_simple, :banner_removal], ["non.matching.remote"])
 
       remote_user = build_remote_user()
 
@@ -425,7 +442,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "has a matching host" do
-      Config.put([:mrf_simple, :banner_removal], ["remote.instance"])
+      clear_config([:mrf_simple, :banner_removal], ["remote.instance"])
 
       remote_user = build_remote_user()
       {:ok, filtered} = SimplePolicy.filter(remote_user)
@@ -434,7 +451,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "match with wildcard domain" do
-      Config.put([:mrf_simple, :banner_removal], ["*.remote.instance"])
+      clear_config([:mrf_simple, :banner_removal], ["*.remote.instance"])
 
       remote_user = build_remote_user()
       {:ok, filtered} = SimplePolicy.filter(remote_user)
@@ -444,10 +461,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   end
 
   describe "when :reject_deletes is empty" do
-    setup do: Config.put([:mrf_simple, :reject_deletes], [])
+    setup do: clear_config([:mrf_simple, :reject_deletes], [])
 
     test "it accepts deletions even from rejected servers" do
-      Config.put([:mrf_simple, :reject], ["remote.instance"])
+      clear_config([:mrf_simple, :reject], ["remote.instance"])
 
       deletion_message = build_remote_deletion_message()
 
@@ -455,7 +472,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "it accepts deletions even from non-whitelisted servers" do
-      Config.put([:mrf_simple, :accept], ["non.matching.remote"])
+      clear_config([:mrf_simple, :accept], ["non.matching.remote"])
 
       deletion_message = build_remote_deletion_message()
 
@@ -464,10 +481,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   end
 
   describe "when :reject_deletes is not empty but it doesn't have a matching host" do
-    setup do: Config.put([:mrf_simple, :reject_deletes], ["non.matching.remote"])
+    setup do: clear_config([:mrf_simple, :reject_deletes], ["non.matching.remote"])
 
     test "it accepts deletions even from rejected servers" do
-      Config.put([:mrf_simple, :reject], ["remote.instance"])
+      clear_config([:mrf_simple, :reject], ["remote.instance"])
 
       deletion_message = build_remote_deletion_message()
 
@@ -475,7 +492,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
     end
 
     test "it accepts deletions even from non-whitelisted servers" do
-      Config.put([:mrf_simple, :accept], ["non.matching.remote"])
+      clear_config([:mrf_simple, :accept], ["non.matching.remote"])
 
       deletion_message = build_remote_deletion_message()
 
@@ -484,7 +501,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   end
 
   describe "when :reject_deletes has a matching host" do
-    setup do: Config.put([: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()
@@ -494,7 +511,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
   end
 
   describe "when :reject_deletes match with wildcard domain" do
-    setup do: Config.put([: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()