From ce517ff4e5a9cc144853ec8112bfac2a38a3a68a Mon Sep 17 00:00:00 2001 From: ilja Date: Thu, 8 Dec 2022 21:53:42 +0100 Subject: [PATCH] Fix tagpolicy to also work with Update 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. --- .../web/activity_pub/mrf/tag_policy.ex | 18 +++--- .../web/activity_pub/mrf/tag_policy_test.exs | 60 +++++++++++++++++++ 2 files changed, 69 insertions(+), 9 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/tag_policy.ex b/lib/pleroma/web/activity_pub/mrf/tag_policy.ex index 56ae654f2..65a358c59 100644 --- a/lib/pleroma/web/activity_pub/mrf/tag_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/tag_policy.ex @@ -27,22 +27,22 @@ defp get_tags(_), 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 @@ defp process_tag( 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 @@ defp process_tag( 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 @@ def filter(%{"object" => target_actor, "type" => "Follow"} = message), 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 diff --git a/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs b/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs index faaadff79..0c84b5bf3 100644 --- a/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/tag_policy_test.exs @@ -53,7 +53,24 @@ test "removes from public timelines" 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 @@ test "removes from the federated timeline" 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 @@ test "removes attachments" 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 @@ test "Mark as sensitive on presence of attachments" 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