Pleroma/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex

67 lines
1.8 KiB
Elixir
Raw Normal View History

2019-06-02 11:50:16 +02:00
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
2019-06-02 11:50:16 +02:00
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicy do
alias Pleroma.Config
alias Pleroma.Web.ActivityPub.MRF
require Logger
2020-02-14 18:02:24 +01:00
@behaviour Pleroma.Web.ActivityPub.MRF
2019-06-02 11:50:16 +02:00
defp lookup_subchain(actor) do
with matches <- Config.get([:mrf_subchain, :match_actor]),
{match, subchain} <- Enum.find(matches, fn {k, _v} -> String.match?(actor, k) end) do
{:ok, match, subchain}
else
_e -> {:error, :notfound}
end
end
@impl true
def filter(%{"actor" => actor} = message) do
with {:ok, match, subchain} <- lookup_subchain(actor) do
2019-06-02 12:29:15 +02:00
Logger.debug(
"[SubchainPolicy] Matched #{actor} against #{inspect(match)} with subchain #{
inspect(subchain)
}"
)
2019-06-02 11:50:16 +02:00
MRF.filter(subchain, message)
2019-06-02 11:50:16 +02:00
else
_e -> {:ok, message}
end
end
@impl true
def filter(message), do: {:ok, message}
@impl true
2019-08-14 00:36:24 +02:00
def describe, do: {:ok, %{}}
@impl true
def config_description do
%{
key: :mrf_subchain,
related_policy: "Pleroma.Web.ActivityPub.MRF.SubchainPolicy",
label: "MRF Subchain",
description:
"This policy processes messages through an alternate pipeline when a given message matches certain criteria." <>
" All criteria are configured as a map of regular expressions to lists of policy modules.",
children: [
%{
key: :match_actor,
type: {:map, {:list, :string}},
description: "Matches a series of regular expressions against the actor field",
suggestions: [
%{
~r/https:\/\/example.com/s => [Pleroma.Web.ActivityPub.MRF.DropPolicy]
}
]
}
]
}
end
2019-06-02 11:50:16 +02:00
end