forked from mirrors/akkoma
Chain policies
- The `:pleroma, :instance, :rewrite_policy` can now be either a policy or a list of policies - Made a behaviour for MRF policies
This commit is contained in:
parent
ffe028cd73
commit
e9e6f37bda
|
@ -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 @@ def get_recipients(data) 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{
|
||||
|
|
21
lib/pleroma/web/activity_pub/mrf.ex
Normal file
21
lib/pleroma/web/activity_pub/mrf.ex
Normal file
|
@ -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
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 @@ defp check_ftl_removal(actor_info, object) do
|
|||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(object) do
|
||||
actor_info = URI.parse(object["actor"])
|
||||
|
||||
|
|
Loading…
Reference in a new issue