Chain policies
authorhref <href@random.sh>
Thu, 10 May 2018 16:34:09 +0000 (18:34 +0200)
committerhref <href@random.sh>
Thu, 10 May 2018 16:41:06 +0000 (18:41 +0200)
- The `:pleroma, :instance, :rewrite_policy` can now be either a policy
or a list of policies
- Made a behaviour for MRF policies

lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/mrf.ex [new file with mode: 0644]
lib/pleroma/web/activity_pub/mrf/drop_policy.ex
lib/pleroma/web/activity_pub/mrf/noop_policy.ex
lib/pleroma/web/activity_pub/mrf/simple_policy.ex

index fde6e12d78f712e3074cbddd0cf0f37bc2653731..956c223ee67dfec81c936c979b47a3d277736829 100644 (file)
@@ -1,6 +1,6 @@
 defmodule Pleroma.Web.ActivityPub.ActivityPub do
   alias Pleroma.{Activity, Repo, Object, Upload, User, Notification}
-  alias Pleroma.Web.ActivityPub.Transmogrifier
+  alias Pleroma.Web.ActivityPub.{Transmogrifier, MRF}
   alias Pleroma.Web.WebFinger
   alias Pleroma.Web.Federator
   alias Pleroma.Web.OStatus
@@ -11,7 +11,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   @httpoison Application.get_env(:pleroma, :httpoison)
 
   @instance Application.get_env(:pleroma, :instance)
-  @rewrite_policy Keyword.get(@instance, :rewrite_policy)
 
   def get_recipients(data) do
     (data["to"] || []) ++ (data["cc"] || [])
@@ -20,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   def insert(map, local \\ true) when is_map(map) do
     with nil <- Activity.get_by_ap_id(map["id"]),
          map <- lazy_put_activity_defaults(map),
-         {:ok, map} <- @rewrite_policy.filter(map),
+         {:ok, map} <- MRF.filter(map),
          :ok <- insert_full_object(map) do
       {:ok, activity} =
         Repo.insert(%Activity{
diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex
new file mode 100644 (file)
index 0000000..6d5aa95
--- /dev/null
@@ -0,0 +1,21 @@
+defmodule Pleroma.Web.ActivityPub.MRF do
+
+  @callback filter(Map.t) :: {:ok | :reject, Map.t}
+
+  def filter(object) do
+    get_policies()
+    |> Enum.reduce({:ok, object}, fn
+      (policy, {:ok, object}) ->
+        policy.filter(object)
+      (_, error) -> error
+    end)
+  end
+
+  def get_policies() do
+    Application.get_env(:pleroma, :instance, [])
+    |> Keyword.get(:rewrite_policy, [])
+    |> get_policies()
+  end
+  def get_policies(policy) when is_atom(policy), do: [policy]
+  def get_policies(policies) when is_list(policies), do: policies
+end
index 4333bca28b7c61225433498b323959ea2dd134ee..8119479435ef69b0300d27f90bd5b62248dbb7e7 100644 (file)
@@ -1,6 +1,8 @@
 defmodule Pleroma.Web.ActivityPub.MRF.DropPolicy do
   require Logger
+  @behaviour Pleroma.Web.ActivityPub.MRF
 
+  @impl true
   def filter(object) do
     Logger.info("REJECTING #{inspect(object)}")
     {:reject, object}
index 9dd3acb04b4b6a904b3162a6746337e632455bff..e26f60d26b603bc27e681d02ea965b83e6592111 100644 (file)
@@ -1,4 +1,7 @@
 defmodule Pleroma.Web.ActivityPub.MRF.NoOpPolicy do
+  @behaviour Pleroma.Web.ActivityPub.MRF
+
+  @impl true
   def filter(object) do
     {:ok, object}
   end
index d840d759d85eaf486419c9e528ba1ba250dfd8dc..8d770387db960fddc6c6b169c33573e955d99455 100644 (file)
@@ -1,5 +1,6 @@
 defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
   alias Pleroma.User
+  @behaviour Pleroma.Web.ActivityPub.MRF
 
   @mrf_policy Application.get_env(:pleroma, :mrf_simple)
 
@@ -69,6 +70,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
     end
   end
 
+  @impl true
   def filter(object) do
     actor_info = URI.parse(object["actor"])