MRF: add describe() to all modules, add base MRF configuration to base describe()

This commit is contained in:
Ariadne Conill 2019-08-13 21:52:54 +00:00
parent 7089400675
commit c574b7a1fc
17 changed files with 117 additions and 8 deletions

View file

@ -39,15 +39,31 @@ def subdomain_match?(domains, host) do
@callback describe() :: {:ok | :error, Map.t()} @callback describe() :: {:ok | :error, Map.t()}
def describe(policies) do def describe(policies) do
policies {:ok, policy_configs} =
|> Enum.reduce({:ok, %{}}, fn policies
policy, {:ok, data} -> |> Enum.reduce({:ok, %{}}, fn
{:ok, policy_data} = policy.describe() policy, {:ok, data} ->
{:ok, Map.merge(data, policy_data)} {:ok, policy_data} = policy.describe()
{:ok, Map.merge(data, policy_data)}
_, error -> _, error ->
error error
end) end)
mrf_policies =
get_policies()
|> Enum.map(fn policy -> to_string(policy) |> String.split(".") |> List.last() end)
exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions])
base =
%{
mrf_policies: mrf_policies,
exclusions: length(exclusions) > 0,
}
|> Map.merge(policy_configs)
{:ok, base}
end end
def describe(), do: get_policies() |> describe() def describe(), do: get_policies() |> describe()

View file

@ -62,4 +62,7 @@ def filter(%{"type" => "Follow", "actor" => actor_id} = message) do
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -5,6 +5,8 @@
defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do
alias Pleroma.User alias Pleroma.User
@behaviour Pleroma.Web.ActivityPub.MRF
require Logger require Logger
# has the user successfully posted before? # has the user successfully posted before?
@ -22,6 +24,7 @@ defp contains_links?(%{"content" => content} = _object) do
defp contains_links?(_), do: false defp contains_links?(_), do: false
@impl true
def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do
with {:ok, %User{} = u} <- User.get_or_fetch_by_ap_id(actor), with {:ok, %User{} = u} <- User.get_or_fetch_by_ap_id(actor),
{:contains_links, true} <- {:contains_links, contains_links?(object)}, {:contains_links, true} <- {:contains_links, contains_links?(object)},
@ -45,4 +48,7 @@ def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message
# in all other cases, pass through # in all other cases, pass through
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -12,4 +12,7 @@ def filter(object) do
Logger.info("REJECTING #{inspect(object)}") Logger.info("REJECTING #{inspect(object)}")
{:reject, object} {:reject, object}
end end
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -39,4 +39,6 @@ def filter(%{"type" => "Create", "object" => child_object} = object) do
end end
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
def describe(), do: {:ok, %{}}
end end

View file

@ -90,4 +90,7 @@ def filter(%{"type" => "Create"} = message) do
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{mrf_hellthread: Pleroma.Config.get([:mrf_hellthread])}}
end end

View file

@ -96,4 +96,36 @@ def filter(%{"type" => "Create", "object" => %{"content" => _content}} = message
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe() do
# This horror is needed to convert regex sigils to strings
mrf_keyword =
Pleroma.Config.get(:mrf_keyword, [])
|> Enum.map(fn {key, value} ->
{key,
Enum.map(value, fn
{pattern, replacement} ->
%{
"pattern" =>
if not is_binary(pattern) do
inspect(pattern)
else
pattern
end,
"replacement" => replacement
}
pattern ->
if not is_binary(pattern) do
inspect(pattern)
else
pattern
end
end)}
end)
|> Enum.into(%{})
{:ok, %{mrf_keyword: mrf_keyword}}
end
end end

View file

@ -53,4 +53,7 @@ def filter(
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -21,4 +21,7 @@ def filter(%{"type" => "Create"} = message) do
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -19,4 +19,7 @@ def filter(
@impl true @impl true
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -10,4 +10,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.NoOpPolicy do
def filter(object) do def filter(object) do
{:ok, object} {:ok, object}
end end
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -21,4 +21,6 @@ def filter(%{"type" => "Create", "object" => child_object} = object) do
end end
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
def describe(), do: {:ok, %{}}
end end

View file

@ -44,4 +44,7 @@ def filter(%{"type" => "Create"} = object) do
@impl true @impl true
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
@impl true
def describe(), do: {:ok, %{mrf_rejectnonpublic: Pleroma.Config.get([:mrf_rejectnonpublic])}}
end end

View file

@ -177,4 +177,16 @@ def filter(%{"id" => actor, "type" => obj_type} = object)
end end
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
@impl true
def describe() do
exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions])
mrf_simple =
Pleroma.Config.get(:mrf_simple)
|> Enum.map(fn {k, v} -> {k, Enum.reject(v, fn v -> v in exclusions end)} end)
|> Enum.into(%{})
{:ok, %{mrf_simple: mrf_simple}}
end
end end

View file

@ -37,4 +37,7 @@ def filter(%{"actor" => actor} = message) do
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -165,4 +165,7 @@ def filter(%{"actor" => actor, "type" => "Create"} = message),
@impl true @impl true
def filter(message), do: {:ok, message} def filter(message), do: {:ok, message}
@impl true
def describe(), do: {:ok, %{}}
end end

View file

@ -32,4 +32,13 @@ def filter(%{"actor" => actor} = object) do
end end
def filter(object), do: {:ok, object} def filter(object), do: {:ok, object}
@impl true
def describe() do
mrf_user_allowlist =
Config.get([:mrf_user_allowlist], [])
|> Enum.into(%{}, fn {k, v} -> {k, length(v)} end)
{:ok, %{mrf_user_allowlist: mrf_user_allowlist}}
end
end end