Fix tagpolicy to also work with Update
authorilja <git@ilja.space>
Thu, 8 Dec 2022 20:53:42 +0000 (21:53 +0100)
committerilja <git@ilja.space>
Thu, 8 Dec 2022 20:53:42 +0000 (21:53 +0100)
Objects who got updated would just pass the TagPolicy, undoing the moderation that was set in place for the Actor.
Now we check not only for Create activities, but also Update activities.

lib/pleroma/web/activity_pub/mrf/tag_policy.ex
test/pleroma/web/activity_pub/mrf/tag_policy_test.exs

index 56ae654f27b2dff1f341c8a035753b6a68747f02..65a358c5953410b38f04f6f1616436bf2d4f0a97 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,13 @@ 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 +85,13 @@ 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 +152,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 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