Merge develop
[akkoma] / lib / pleroma / web / activity_pub / mrf / tag_policy.ex
index 2af36616fbde389211a1274634066b3c4b57d7d4..b52be30e72c2553b375cf1b17ca4b6064247b650 100644 (file)
@@ -5,6 +5,19 @@
 defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
   alias Pleroma.User
   @behaviour Pleroma.Web.ActivityPub.MRF
+  @moduledoc """
+     Apply policies based on user tags
+
+     This policy applies policies on a user activities depending on their tags
+     on your instance.
+
+     - `mrf_tag:media-force-nsfw`: Mark as sensitive on presence of attachments
+     - `mrf_tag:media-strip`: Remove attachments
+     - `mrf_tag:force-unlisted`: Mark as unlisted (removes from the federated timeline)
+     - `mrf_tag:sandbox`: Remove from public (local and federated) timelines
+     - `mrf_tag:disable-remote-subscription`: Reject non-local follow requests
+     - `mrf_tag:disable-any-subscription`: Reject any follow requests
+  """
 
   defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
   defp get_tags(_), do: []
@@ -50,10 +63,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
       cc =
         List.delete(cc, user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"]
 
+      object =
+        message["object"]
+        |> Map.put("to", to)
+        |> Map.put("cc", cc)
+
       message =
         message
         |> Map.put("to", to)
         |> Map.put("cc", cc)
+        |> Map.put("object", object)
 
       {:ok, message}
     else
@@ -74,10 +93,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
 
       cc = List.delete(cc, "https://www.w3.org/ns/activitystreams#Public")
 
+      object =
+        message["object"]
+        |> Map.put("to", to)
+        |> Map.put("cc", cc)
+
       message =
         message
         |> Map.put("to", to)
         |> Map.put("cc", cc)
+        |> Map.put("object", object)
 
       {:ok, message}
     else
@@ -85,11 +110,25 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
     end
   end
 
+  defp process_tag(
+         "mrf_tag:disable-remote-subscription",
+         %{"type" => "Follow", "actor" => actor} = message
+       ) do
+    user = User.get_cached_by_ap_id(actor)
+
+    if user.local == true do
+      {:ok, message}
+    else
+      {:reject, nil}
+    end
+  end
+
+  defp process_tag("mrf_tag:disable-any-subscription", %{"type" => "Follow"}), do: {:reject, nil}
+
   defp process_tag(_, message), do: {:ok, message}
 
-  @impl true
-  def filter(%{"object" => target_actor, "type" => "Follow"} = message) do
-    User.get_cached_by_ap_id(target_actor)
+  def filter_message(actor, message) do
+    User.get_cached_by_ap_id(actor)
     |> get_tags()
     |> Enum.reduce({:ok, message}, fn
       tag, {:ok, message} ->
@@ -101,17 +140,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
   end
 
   @impl true
-  def filter(%{"actor" => actor, "type" => "Create"} = message) do
-    User.get_cached_by_ap_id(actor)
-    |> get_tags()
-    |> Enum.reduce({:ok, message}, fn
-      tag, {:ok, message} ->
-        process_tag(tag, message)
+  def filter(%{"object" => target_actor, "type" => "Follow"} = message),
+    do: filter_message(target_actor, message)
 
-      _, error ->
-        error
-    end)
-  end
+  @impl true
+  def filter(%{"actor" => actor, "type" => "Create"} = message),
+    do: filter_message(actor, message)
 
   @impl true
   def filter(message), do: {:ok, message}