Merge remote-tracking branch 'ilja/fix_tagpolicy_to_also_work_on_updates' into develop
authorFloatingGhost <hannah@coffee-and-dreams.uk>
Fri, 9 Dec 2022 10:31:22 +0000 (10:31 +0000)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Fri, 9 Dec 2022 10:31:22 +0000 (10:31 +0000)
14 files changed:
lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex
lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex
lib/pleroma/web/activity_pub/mrf/force_bot_unlisted_policy.ex
lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex
lib/pleroma/web/activity_pub/mrf/mention_policy.ex
lib/pleroma/web/activity_pub/mrf/simple_policy.ex
lib/pleroma/web/activity_pub/mrf/tag_policy.ex
test/pleroma/web/activity_pub/mrf/activity_expiration_policy_test.exs
test/pleroma/web/activity_pub/mrf/anti_link_spam_policy_test.exs
test/pleroma/web/activity_pub/mrf/force_bot_unlisted_policy_test.exs
test/pleroma/web/activity_pub/mrf/hellthread_policy_test.exs
test/pleroma/web/activity_pub/mrf/mention_policy_test.exs
test/pleroma/web/activity_pub/mrf/simple_policy_test.exs
test/pleroma/web/activity_pub/mrf/tag_policy_test.exs

index e78254280bc109ea5998c09f62381893a0feb307..5f412566d4e1d5f46f6ca89be2f8a505e934d214 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do
-  @moduledoc "Adds expiration to all local Create activities"
+  @moduledoc "Adds expiration to all local Create/Update activities"
   @behaviour Pleroma.Web.ActivityPub.MRF.Policy
 
   @impl true
@@ -25,8 +25,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do
     String.starts_with?(actor, Pleroma.Web.Endpoint.url())
   end
 
-  defp note?(activity) do
-    match?(%{"type" => "Create", "object" => %{"type" => "Note"}}, activity)
+  defp note?(%{"type" => type, "object" => %{"type" => "Note"}})
+       when type in ["Create", "Update"] do
+    true
+  end
+
+  defp note?(_) do
+    false
   end
 
   defp maybe_add_expiration(activity) do
index ba7c8400bf8a8f3dfa877b2d79e126abb6ce2a80..6885df8639d82f1bb48dad8784c28846d2a6dc8a 100644 (file)
@@ -29,7 +29,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do
   defp contains_links?(_), do: false
 
   @impl true
-  def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do
+  def filter(%{"type" => type, "actor" => actor, "object" => object} = message)
+      when type in ["Create", "Update"] do
     with {:ok, %User{local: false} = u} <- User.get_or_fetch_by_ap_id(actor),
          {:contains_links, true} <- {:contains_links, contains_links?(object)},
          {:old_user, true} <- {:old_user, old_user?(u)} do
index 11871375efa0629fef2f736e20e5217af710e2b6..fa6b93333c75c9c45ba5f1b28b038647fcf2a6ca 100644 (file)
@@ -17,13 +17,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy do
   @impl true
   def filter(
         %{
-          "type" => "Create",
+          "type" => type,
           "to" => to,
           "cc" => cc,
           "actor" => actor,
           "object" => object
         } = message
-      ) do
+      )
+      when type in ["Create", "Update"] do
     user = User.get_cached_by_ap_id(actor)
     isbot = check_if_bot(user)
 
index 504bd4d57e56712209924b0f0c91259562d6d911..18704fc2c1a11225ec0e65fe107d2b47807093ad 100644 (file)
@@ -73,8 +73,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
   end
 
   @impl true
-  def filter(%{"type" => "Create", "object" => %{"type" => object_type}} = message)
-      when object_type in ~w{Note Article} do
+  def filter(%{"type" => type, "object" => %{"type" => object_type}} = message)
+      when type in ~w{Create Update} and object_type in ~w{Note Article} do
     reject_threshold =
       Pleroma.Config.get(
         [:mrf_hellthread, :reject_threshold],
index 05b28e4f567a755a7c081d874e4d713405ae5d22..11e9bd4780f03997a6cb5dbdf2ab5e1b8fdec1de 100644 (file)
@@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicy do
   @behaviour Pleroma.Web.ActivityPub.MRF.Policy
 
   @impl true
-  def filter(%{"type" => "Create"} = message) do
+  def filter(%{"type" => type} = message) when type in ["Create", "Update"] do
     reject_actors = Pleroma.Config.get([:mrf_mention, :actors], [])
     recipients = (message["to"] || []) ++ (message["cc"] || [])
 
index 415c5d2ddb87937605684f547bba6fe457426f03..a59212db461ab61fa9c22dbfc12cc159d17eab82 100644 (file)
@@ -40,9 +40,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
 
   defp check_media_removal(
          %{host: actor_host} = _actor_info,
-         %{"type" => "Create", "object" => %{"attachment" => child_attachment}} = object
+         %{"type" => type, "object" => %{"attachment" => child_attachment}} = object
        )
-       when length(child_attachment) > 0 do
+       when type in ["Create", "Update"] and length(child_attachment) > 0 do
     media_removal =
       instance_list(:media_removal)
       |> MRF.subdomains_regex()
@@ -63,10 +63,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
   defp check_media_nsfw(
          %{host: actor_host} = _actor_info,
          %{
-           "type" => "Create",
+           "type" => type,
            "object" => %{} = _child_object
          } = object
-       ) do
+       )
+       when type in ["Create", "Update"] do
     media_nsfw =
       instance_list(:media_nsfw)
       |> MRF.subdomains_regex()
index 56ae654f27b2dff1f341c8a035753b6a68747f02..634b6a62f934b144a9198ceda3aff9e6bb3dcc0e 100644 (file)
@@ -27,22 +27,22 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
   defp process_tag(
          "mrf_tag:media-force-nsfw",
          %{
-           "type" => "Create",
+           "type" => type,
            "object" => %{"attachment" => child_attachment}
          } = message
        )
-       when length(child_attachment) > 0 do
+       when length(child_attachment) > 0 and type in ["Create", "Update"] do
     {:ok, Kernel.put_in(message, ["object", "sensitive"], true)}
   end
 
   defp process_tag(
          "mrf_tag:media-strip",
          %{
-           "type" => "Create",
+           "type" => type,
            "object" => %{"attachment" => child_attachment} = object
          } = message
        )
-       when length(child_attachment) > 0 do
+       when length(child_attachment) > 0 and type in ["Create", "Update"] do
     object = Map.delete(object, "attachment")
     message = Map.put(message, "object", object)
 
@@ -52,13 +52,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
   defp process_tag(
          "mrf_tag:force-unlisted",
          %{
-           "type" => "Create",
+           "type" => type,
            "to" => to,
            "cc" => cc,
            "actor" => actor,
            "object" => object
          } = message
-       ) do
+       )
+       when type in ["Create", "Update"] do
     user = User.get_cached_by_ap_id(actor)
 
     if Enum.member?(to, Pleroma.Constants.as_public()) do
@@ -85,13 +86,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
   defp process_tag(
          "mrf_tag:sandbox",
          %{
-           "type" => "Create",
+           "type" => type,
            "to" => to,
            "cc" => cc,
            "actor" => actor,
            "object" => object
          } = message
-       ) do
+       )
+       when type in ["Create", "Update"] do
     user = User.get_cached_by_ap_id(actor)
 
     if Enum.member?(to, Pleroma.Constants.as_public()) or
@@ -152,7 +154,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
     do: filter_message(target_actor, message)
 
   @impl true
-  def filter(%{"actor" => actor, "type" => "Create"} = message),
+  def filter(%{"actor" => actor, "type" => type} = message) when type in ["Create", "Update"],
     do: filter_message(actor, message)
 
   @impl true
index 47b07fdd94995726afef6d2803bda51d65ad6936..a3c23a85ce4c9c839bdb83ce998c97241d8bfaf2 100644 (file)
@@ -19,6 +19,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do
              })
 
     assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
+
+    assert {:ok, %{"type" => "Update", "expires_at" => expires_at}} =
+             ActivityExpirationPolicy.filter(%{
+               "id" => @id,
+               "actor" => @local_actor,
+               "type" => "Update",
+               "object" => %{"type" => "Note"}
+             })
+
+    assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
   end
 
   test "keeps existing `expires_at` if it less than the config setting" do
@@ -32,6 +42,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do
                "expires_at" => expires_at,
                "object" => %{"type" => "Note"}
              })
+
+    assert {:ok, %{"type" => "Update", "expires_at" => ^expires_at}} =
+             ActivityExpirationPolicy.filter(%{
+               "id" => @id,
+               "actor" => @local_actor,
+               "type" => "Update",
+               "expires_at" => expires_at,
+               "object" => %{"type" => "Note"}
+             })
   end
 
   test "overwrites existing `expires_at` if it greater than the config setting" do
@@ -47,6 +66,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do
              })
 
     assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
+
+    assert {:ok, %{"type" => "Update", "expires_at" => expires_at}} =
+             ActivityExpirationPolicy.filter(%{
+               "id" => @id,
+               "actor" => @local_actor,
+               "type" => "Update",
+               "expires_at" => too_distant_future,
+               "object" => %{"type" => "Note"}
+             })
+
+    assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364
   end
 
   test "ignores remote activities" do
@@ -59,9 +89,19 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do
              })
 
     refute Map.has_key?(activity, "expires_at")
+
+    assert {:ok, activity} =
+             ActivityExpirationPolicy.filter(%{
+               "id" => "https://example.com/123",
+               "actor" => "https://example.com/users/cofe",
+               "type" => "Update",
+               "object" => %{"type" => "Note"}
+             })
+
+    refute Map.has_key?(activity, "expires_at")
   end
 
-  test "ignores non-Create/Note activities" do
+  test "ignores non-Create/Update/Note activities" do
     assert {:ok, activity} =
              ActivityExpirationPolicy.filter(%{
                "id" => "https://example.com/123",
index c3ee03a054f7974e290077c81e9fe27b7476aff1..6182e9717cf3764ddbe56b30d4e2935d23b62701 100644 (file)
@@ -32,6 +32,28 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
     }
   }
 
+  @linkless_update_message %{
+    "type" => "Update",
+    "object" => %{
+      "content" => "hi world!"
+    }
+  }
+
+  @linkful_update_message %{
+    "type" => "Update",
+    "object" => %{
+      "content" => "<a href='https://example.com'>hi world!</a>"
+    }
+  }
+
+  @response_update_message %{
+    "type" => "Update",
+    "object" => %{
+      "name" => "yes",
+      "type" => "Answer"
+    }
+  }
+
   describe "with new user" do
     test "it allows posts without links" do
       user = insert(:user, local: false)
@@ -42,7 +64,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkless_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkless_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
 
     test "it disallows posts with links" do
@@ -66,7 +93,24 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         }
       }
 
+      update_message = %{
+        "type" => "Update",
+        "actor" => user.ap_id,
+        "object" => %{
+          "formerRepresentations" => %{
+            "type" => "OrderedCollection",
+            "orderedItems" => [
+              %{
+                "content" => "<a href='https://example.com'>hi world!</a>"
+              }
+            ]
+          },
+          "content" => "mew"
+        }
+      }
+
       {:reject, _} = MRF.filter_one(AntiLinkSpamPolicy, message)
+      {:reject, _} = MRF.filter_one(AntiLinkSpamPolicy, update_message)
     end
 
     test "it allows posts with links for local users" do
@@ -78,7 +122,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkful_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkful_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
 
     test "it disallows posts with links in history" do
@@ -90,7 +139,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkful_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkful_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:reject, _} = AntiLinkSpamPolicy.filter(message)
+      {:reject, _} = AntiLinkSpamPolicy.filter(update_message)
     end
   end
 
@@ -104,7 +158,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkless_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkless_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
 
     test "it allows posts with links" do
@@ -116,7 +175,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkful_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkful_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
   end
 
@@ -130,7 +194,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkless_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkless_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
 
     test "it allows posts with links" do
@@ -142,7 +211,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkful_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @linkful_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
   end
 
@@ -161,9 +235,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkless_message
         |> Map.put("actor", "http://invalid.actor")
 
+      update_message =
+        @linkless_update_message
+        |> Map.put("actor", "http://invalid.actor")
+
       assert capture_log(fn ->
                {:reject, _} = AntiLinkSpamPolicy.filter(message)
              end) =~ "[error] Could not decode user at fetch http://invalid.actor"
+
+      assert capture_log(fn ->
+               {:reject, _} = AntiLinkSpamPolicy.filter(update_message)
+             end) =~ "[error] Could not decode user at fetch http://invalid.actor"
     end
 
     test "it rejects posts with links" do
@@ -171,9 +253,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @linkful_message
         |> Map.put("actor", "http://invalid.actor")
 
+      update_message =
+        @linkful_update_message
+        |> Map.put("actor", "http://invalid.actor")
+
       assert capture_log(fn ->
                {:reject, _} = AntiLinkSpamPolicy.filter(message)
              end) =~ "[error] Could not decode user at fetch http://invalid.actor"
+
+      assert capture_log(fn ->
+               {:reject, _} = AntiLinkSpamPolicy.filter(update_message)
+             end) =~ "[error] Could not decode user at fetch http://invalid.actor"
     end
   end
 
@@ -185,7 +275,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
         @response_message
         |> Map.put("actor", user.ap_id)
 
+      update_message =
+        @response_update_message
+        |> Map.put("actor", user.ap_id)
+
       {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+      {:ok, _update_message} = AntiLinkSpamPolicy.filter(update_message)
     end
   end
 end
index e3325d1444ea28058915635dd75bca6df03c6694..aa88f2f936b48045ca157db2b7e8e8bb408f17db 100644 (file)
@@ -26,35 +26,60 @@ defmodule Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicyTest do
      }}
   end
 
+  defp generate_update_messages(actor) do
+    {%{
+       "actor" => actor.ap_id,
+       "type" => "Update",
+       "object" => %{},
+       "to" => [@public, "f"],
+       "cc" => [actor.follower_address, "d"]
+     },
+     %{
+       "actor" => actor.ap_id,
+       "type" => "Update",
+       "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
+       "to" => ["f", actor.follower_address],
+       "cc" => ["d", @public]
+     }}
+  end
+
   test "removes from the federated timeline by nickname heuristics 1" do
     actor = insert(:user, %{nickname: "annoying_ebooks@example.com"})
 
     {message, except_message} = generate_messages(actor)
+    {update_message, except_update_message} = generate_update_messages(actor)
 
     assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
+    assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
   end
 
   test "removes from the federated timeline by nickname heuristics 2" do
     actor = insert(:user, %{nickname: "cirnonewsnetworkbot@meow.cat"})
 
     {message, except_message} = generate_messages(actor)
+    {update_message, except_update_message} = generate_update_messages(actor)
 
     assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
+    assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
   end
 
   test "removes from the federated timeline by actor type Application" do
     actor = insert(:user, %{actor_type: "Application"})
 
     {message, except_message} = generate_messages(actor)
+    {update_message, except_update_message} = generate_update_messages(actor)
 
     assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
+    assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
   end
 
   test "removes from the federated timeline by actor type Service" do
     actor = insert(:user, %{actor_type: "Service"})
 
     {message, except_message} = generate_messages(actor)
+    {update_message, except_update_message} = generate_update_messages(actor)
 
     assert ForceBotUnlistedPolicy.filter(message) == {:ok, except_message}
+    assert ForceBotUnlistedPolicy.filter(update_message) == {:ok, except_update_message}
   end
 end
index a88e1fa2e470d37f795a39df2c09f1097cf13fa7..2bcf49bc52bc997482c9e64333421714791f55bc 100644 (file)
@@ -26,54 +26,86 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do
       }
     }
 
-    [user: user, message: message]
+    update_message = %{
+      "actor" => user.ap_id,
+      "cc" => [user.follower_address],
+      "type" => "Update",
+      "to" => [
+        "https://www.w3.org/ns/activitystreams#Public",
+        "https://instance.tld/users/user1",
+        "https://instance.tld/users/user2",
+        "https://instance.tld/users/user3"
+      ],
+      "object" => %{
+        "type" => "Note"
+      }
+    }
+
+    [user: user, message: message, update_message: update_message]
   end
 
   setup do: clear_config(:mrf_hellthread)
 
   describe "reject" do
     test "rejects the message if the recipient count is above reject_threshold", %{
-      message: message
+      message: message,
+      update_message: update_message
     } do
       clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 2})
 
       assert {:reject, "[HellthreadPolicy] 3 recipients is over the limit of 2"} ==
                filter(message)
+
+      assert {:reject, "[HellthreadPolicy] 3 recipients is over the limit of 2"} ==
+               filter(update_message)
     end
 
     test "does not reject the message if the recipient count is below reject_threshold", %{
-      message: message
+      message: message,
+      update_message: update_message
     } do
       clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 3})
 
       assert {:ok, ^message} = filter(message)
+      assert {:ok, ^update_message} = filter(update_message)
     end
   end
 
   describe "delist" do
     test "delists the message if the recipient count is above delist_threshold", %{
       user: user,
-      message: message
+      message: message,
+      update_message: update_message
     } do
       clear_config([:mrf_hellthread], %{delist_threshold: 2, reject_threshold: 0})
 
       {:ok, message} = filter(message)
       assert user.follower_address in message["to"]
       assert "https://www.w3.org/ns/activitystreams#Public" in message["cc"]
+
+      {:ok, update_message} = filter(update_message)
+      assert user.follower_address in update_message["to"]
+      assert "https://www.w3.org/ns/activitystreams#Public" in update_message["cc"]
     end
 
     test "does not delist the message if the recipient count is below delist_threshold", %{
-      message: message
+      message: message,
+      update_message: update_message
     } do
       clear_config([:mrf_hellthread], %{delist_threshold: 4, reject_threshold: 0})
 
       assert {:ok, ^message} = filter(message)
+      assert {:ok, ^update_message} = filter(update_message)
     end
   end
 
-  test "excludes follower collection and public URI from threshold count", %{message: message} do
+  test "excludes follower collection and public URI from threshold count", %{
+    message: message,
+    update_message: update_message
+  } do
     clear_config([:mrf_hellthread], %{delist_threshold: 0, reject_threshold: 3})
 
     assert {:ok, ^message} = filter(message)
+    assert {:ok, ^update_message} = filter(update_message)
   end
 end
index 80ddcacbed7c2c57323c7383e4a01b57072e7ca7..8aef8bb1a128f9d4b5283d0c4a6feda319154df3 100644 (file)
@@ -18,7 +18,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
       "cc" => ["https://example.com/blocked"]
     }
 
+    update_message = %{
+      "type" => "Update",
+      "to" => ["https://example.com/ok"],
+      "cc" => ["https://example.com/blocked"]
+    }
+
     assert MentionPolicy.filter(message) == {:ok, message}
+    assert MentionPolicy.filter(update_message) == {:ok, update_message}
   end
 
   describe "allow" do
@@ -29,7 +36,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "type" => "Create"
       }
 
+      update_message = %{
+        "type" => "Update"
+      }
+
       assert MentionPolicy.filter(message) == {:ok, message}
+      assert MentionPolicy.filter(update_message) == {:ok, update_message}
     end
 
     test "to" do
@@ -40,7 +52,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "to" => ["https://example.com/ok"]
       }
 
+      update_message = %{
+        "type" => "Update",
+        "to" => ["https://example.com/ok"]
+      }
+
       assert MentionPolicy.filter(message) == {:ok, message}
+      assert MentionPolicy.filter(update_message) == {:ok, update_message}
     end
 
     test "cc" do
@@ -51,7 +69,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "cc" => ["https://example.com/ok"]
       }
 
+      update_message = %{
+        "type" => "Update",
+        "cc" => ["https://example.com/ok"]
+      }
+
       assert MentionPolicy.filter(message) == {:ok, message}
+      assert MentionPolicy.filter(update_message) == {:ok, update_message}
     end
 
     test "both" do
@@ -63,7 +87,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "cc" => ["https://example.com/ok2"]
       }
 
+      update_message = %{
+        "type" => "Update",
+        "to" => ["https://example.com/ok"],
+        "cc" => ["https://example.com/ok2"]
+      }
+
       assert MentionPolicy.filter(message) == {:ok, message}
+      assert MentionPolicy.filter(update_message) == {:ok, update_message}
     end
   end
 
@@ -76,8 +107,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "to" => ["https://example.com/blocked"]
       }
 
+      update_message = %{
+        "type" => "Update",
+        "to" => ["https://example.com/blocked"]
+      }
+
       assert MentionPolicy.filter(message) ==
                {:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
+
+      assert MentionPolicy.filter(update_message) ==
+               {:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
     end
 
     test "cc" do
@@ -89,8 +128,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
         "cc" => ["https://example.com/blocked"]
       }
 
+      update_message = %{
+        "type" => "Update",
+        "to" => ["https://example.com/ok"],
+        "cc" => ["https://example.com/blocked"]
+      }
+
       assert MentionPolicy.filter(message) ==
                {:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
+
+      assert MentionPolicy.filter(update_message) ==
+               {:reject, "[MentionPolicy] Rejected for mention of https://example.com/blocked"}
     end
   end
 end
index 0569bfed309e8ed2cacbcc7d8950e91f2f528062..036573171e719af7cdbaa50931592281e99c382e 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()
+      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,31 +77,41 @@ 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()
+      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
@@ -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], [])
index faaadff798fd706d7cee3c70a863fa7c7063f4af..0c84b5bf33c1dd3d752a0cb4ae60412978065902 100644 (file)
@@ -53,7 +53,24 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do
         "cc" => ["d"]
       }
 
+      edit_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{},
+        "to" => [@public, "f"],
+        "cc" => [@public, "d"]
+      }
+
+      edit_expect_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d"]},
+        "to" => ["f", actor.follower_address],
+        "cc" => ["d"]
+      }
+
       assert TagPolicy.filter(message) == {:ok, except_message}
+      assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
     end
   end
 
@@ -77,7 +94,24 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do
         "cc" => ["d", @public]
       }
 
+      edit_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{},
+        "to" => [@public, "f"],
+        "cc" => [actor.follower_address, "d"]
+      }
+
+      edit_expect_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
+        "to" => ["f", actor.follower_address],
+        "cc" => ["d", @public]
+      }
+
       assert TagPolicy.filter(message) == {:ok, except_message}
+      assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
     end
   end
 
@@ -97,7 +131,20 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do
         "object" => %{}
       }
 
+      edit_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{"attachment" => ["file1"]}
+      }
+
+      edit_expect_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{}
+      }
+
       assert TagPolicy.filter(message) == {:ok, except_message}
+      assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
     end
   end
 
@@ -117,7 +164,20 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do
         "object" => %{"tag" => ["test"], "attachment" => ["file1"], "sensitive" => true}
       }
 
+      edit_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{"tag" => ["test"], "attachment" => ["file1"]}
+      }
+
+      edit_expect_message = %{
+        "actor" => actor.ap_id,
+        "type" => "Update",
+        "object" => %{"tag" => ["test"], "attachment" => ["file1"], "sensitive" => true}
+      }
+
       assert TagPolicy.filter(message) == {:ok, except_message}
+      assert TagPolicy.filter(edit_message) == {:ok, edit_expect_message}
     end
   end
 end