mrf: add initial MRF.TagPolicy engine
[akkoma] / lib / pleroma / web / activity_pub / mrf / tag_policy.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
6 alias Pleroma.User
7 @behaviour Pleroma.Web.ActivityPub.MRF
8
9 defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
10 defp get_tags(_), do: []
11
12 defp process_tag(
13 "mrf_tag:media-force-nsfw",
14 %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message
15 )
16 when length(child_attachment) > 0 do
17 tags = (object["tag"] || []) ++ ["nsfw"]
18
19 object =
20 object
21 |> Map.put("tags", tags)
22 |> Map.put("sensitive", true)
23
24 message = Map.put(message, "object", object)
25
26 {:ok, message}
27 end
28
29 defp process_tag(
30 "mrf_tag:media-strip",
31 %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message
32 )
33 when length(child_attachment) > 0 do
34 object = Map.delete(object, "attachment")
35 message = Map.put(message, "object", object)
36
37 {:ok, message}
38 end
39
40 defp process_tag(_, message), do: {:ok, message}
41
42 @impl true
43 def filter(%{"actor" => actor} = message) do
44 User.get_cached_by_ap_id(actor)
45 |> get_tags()
46 |> Enum.reduce({:ok, message}, fn
47 tag, {:ok, message} ->
48 process_tag(tag, message)
49
50 _, error ->
51 error
52 end)
53 end
54 end