summaryrefslogtreecommitdiff
path: root/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex
blob: 86965d47b2fb2a922bf9fae4b5b0b18dbe4f6be3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicy do
  alias Pleroma.Config
  alias Pleroma.Web.ActivityPub.MRF

  require Logger

  @behaviour Pleroma.Web.ActivityPub.MRF

  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
      Logger.debug(
        "[SubchainPolicy] Matched #{actor} against #{inspect(match)} with subchain #{
          inspect(subchain)
        }"
      )

      MRF.filter(subchain, message)
    else
      _e -> {:ok, message}
    end
  end

  @impl true
  def filter(message), do: {:ok, message}

  @impl true
  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
end