Merge branch 'develop' into feature/database-compaction
[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(
41 "mrf_tag:force-unlisted",
42 %{"type" => "Create", "to" => to, "cc" => cc, "actor" => actor} = message
43 ) do
44 user = User.get_cached_by_ap_id(actor)
45
46 if Enum.member?(to, "https://www.w3.org/ns/activitystreams#Public") do
47 to =
48 List.delete(to, "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address]
49
50 cc =
51 List.delete(cc, user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"]
52
53 object =
54 message["object"]
55 |> Map.put("to", to)
56 |> Map.put("cc", cc)
57
58 message =
59 message
60 |> Map.put("to", to)
61 |> Map.put("cc", cc)
62 |> Map.put("object", object)
63
64 {:ok, message}
65 else
66 {:ok, message}
67 end
68 end
69
70 defp process_tag(
71 "mrf_tag:sandbox",
72 %{"type" => "Create", "to" => to, "cc" => cc, "actor" => actor} = message
73 ) do
74 user = User.get_cached_by_ap_id(actor)
75
76 if Enum.member?(to, "https://www.w3.org/ns/activitystreams#Public") or
77 Enum.member?(cc, "https://www.w3.org/ns/activitystreams#Public") do
78 to =
79 List.delete(to, "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address]
80
81 cc = List.delete(cc, "https://www.w3.org/ns/activitystreams#Public")
82
83 object =
84 message["object"]
85 |> Map.put("to", to)
86 |> Map.put("cc", cc)
87
88 message =
89 message
90 |> Map.put("to", to)
91 |> Map.put("cc", cc)
92 |> Map.put("object", object)
93
94 {:ok, message}
95 else
96 {:ok, message}
97 end
98 end
99
100 defp process_tag(
101 "mrf_tag:disable-remote-subscription",
102 %{"type" => "Follow", "actor" => actor} = message
103 ) do
104 user = User.get_cached_by_ap_id(actor)
105
106 if user.local == true do
107 {:ok, message}
108 else
109 {:reject, nil}
110 end
111 end
112
113 defp process_tag("mrf_tag:disable-any-subscription", %{"type" => "Follow"}), do: {:reject, nil}
114
115 defp process_tag(_, message), do: {:ok, message}
116
117 def filter_message(actor, message) do
118 User.get_cached_by_ap_id(actor)
119 |> get_tags()
120 |> Enum.reduce({:ok, message}, fn
121 tag, {:ok, message} ->
122 process_tag(tag, message)
123
124 _, error ->
125 error
126 end)
127 end
128
129 @impl true
130 def filter(%{"object" => target_actor, "type" => "Follow"} = message),
131 do: filter_message(target_actor, message)
132
133 @impl true
134 def filter(%{"actor" => actor, "type" => "Create"} = message),
135 do: filter_message(actor, message)
136
137 @impl true
138 def filter(message), do: {:ok, message}
139 end