1 # Pleroma: A lightweight social networking server
2 # Copyright © 2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
9 alias Pleroma.Web.ActivityPub.MRF.SimplePolicy
12 orig = Config.get!(:mrf_simple)
14 Config.put(:mrf_simple,
17 federated_timeline_removal: [],
26 Config.put(:mrf_simple, orig)
30 describe "when :media_removal" do
32 Config.put([:mrf_simple, :media_removal], [])
33 media_message = build_media_message()
34 local_message = build_local_message()
36 assert SimplePolicy.filter(media_message) == {:ok, media_message}
37 assert SimplePolicy.filter(local_message) == {:ok, local_message}
40 test "has a matching host" do
41 Config.put([:mrf_simple, :media_removal], ["remote.instance"])
42 media_message = build_media_message()
43 local_message = build_local_message()
45 assert SimplePolicy.filter(media_message) ==
48 |> Map.put("object", Map.delete(media_message["object"], "attachment"))}
50 assert SimplePolicy.filter(local_message) == {:ok, local_message}
54 describe "when :media_nsfw" do
56 Config.put([:mrf_simple, :media_nsfw], [])
57 media_message = build_media_message()
58 local_message = build_local_message()
60 assert SimplePolicy.filter(media_message) == {:ok, media_message}
61 assert SimplePolicy.filter(local_message) == {:ok, local_message}
64 test "has a matching host" do
65 Config.put([:mrf_simple, :media_nsfw], ["remote.instance"])
66 media_message = build_media_message()
67 local_message = build_local_message()
69 assert SimplePolicy.filter(media_message) ==
72 |> put_in(["object", "tag"], ["foo", "nsfw"])
73 |> put_in(["object", "sensitive"], true)}
75 assert SimplePolicy.filter(local_message) == {:ok, local_message}
79 defp build_media_message do
81 "actor" => "https://remote.instance/users/bob",
84 "attachment" => [%{}],
91 describe "when :report_removal" do
93 Config.put([:mrf_simple, :report_removal], [])
94 report_message = build_report_message()
95 local_message = build_local_message()
97 assert SimplePolicy.filter(report_message) == {:ok, report_message}
98 assert SimplePolicy.filter(local_message) == {:ok, local_message}
101 test "has a matching host" do
102 Config.put([:mrf_simple, :report_removal], ["remote.instance"])
103 report_message = build_report_message()
104 local_message = build_local_message()
106 assert SimplePolicy.filter(report_message) == {:reject, nil}
107 assert SimplePolicy.filter(local_message) == {:ok, local_message}
111 defp build_report_message do
113 "actor" => "https://remote.instance/users/bob",
118 describe "when :federated_timeline_removal" do
120 Config.put([:mrf_simple, :federated_timeline_removal], [])
121 {_, ftl_message} = build_ftl_actor_and_message()
122 local_message = build_local_message()
124 assert SimplePolicy.filter(ftl_message) == {:ok, ftl_message}
125 assert SimplePolicy.filter(local_message) == {:ok, local_message}
128 test "has a matching host" do
129 {actor, ftl_message} = build_ftl_actor_and_message()
131 ftl_message_actor_host =
133 |> Map.fetch!("actor")
137 Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
138 local_message = build_local_message()
140 assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
141 assert actor.follower_address in ftl_message["to"]
142 refute actor.follower_address in ftl_message["cc"]
143 refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"]
144 assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"]
146 assert SimplePolicy.filter(local_message) == {:ok, local_message}
149 test "has a matching host but only as:Public in to" do
150 {_actor, ftl_message} = build_ftl_actor_and_message()
152 ftl_message_actor_host =
154 |> Map.fetch!("actor")
158 ftl_message = Map.put(ftl_message, "cc", [])
160 Config.put([:mrf_simple, :federated_timeline_removal], [ftl_message_actor_host])
162 assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
163 refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"]
164 assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"]
168 defp build_ftl_actor_and_message do
169 actor = insert(:user)
173 "actor" => actor.ap_id,
174 "to" => ["https://www.w3.org/ns/activitystreams#Public", "http://foo.bar/baz"],
175 "cc" => [actor.follower_address, "http://foo.bar/qux"]
179 describe "when :reject" do
181 Config.put([:mrf_simple, :reject], [])
183 remote_message = build_remote_message()
185 assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
188 test "has a matching host" do
189 Config.put([:mrf_simple, :reject], ["remote.instance"])
191 remote_message = build_remote_message()
193 assert SimplePolicy.filter(remote_message) == {:reject, nil}
197 describe "when :accept" do
199 Config.put([:mrf_simple, :accept], [])
201 local_message = build_local_message()
202 remote_message = build_remote_message()
204 assert SimplePolicy.filter(local_message) == {:ok, local_message}
205 assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
208 test "is not empty but it doesn't have a matching host" do
209 Config.put([:mrf_simple, :accept], ["non.matching.remote"])
211 local_message = build_local_message()
212 remote_message = build_remote_message()
214 assert SimplePolicy.filter(local_message) == {:ok, local_message}
215 assert SimplePolicy.filter(remote_message) == {:reject, nil}
218 test "has a matching host" do
219 Config.put([:mrf_simple, :accept], ["remote.instance"])
221 local_message = build_local_message()
222 remote_message = build_remote_message()
224 assert SimplePolicy.filter(local_message) == {:ok, local_message}
225 assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
229 describe "when :avatar_removal" do
231 Config.put([:mrf_simple, :avatar_removal], [])
233 remote_user = build_remote_user()
235 assert SimplePolicy.filter(remote_user) == {:ok, remote_user}
238 test "is not empty but it doesn't have a matching host" do
239 Config.put([:mrf_simple, :avatar_removal], ["non.matching.remote"])
241 remote_user = build_remote_user()
243 assert SimplePolicy.filter(remote_user) == {:ok, remote_user}
246 test "has a matching host" do
247 Config.put([:mrf_simple, :avatar_removal], ["remote.instance"])
249 remote_user = build_remote_user()
250 {:ok, filtered} = SimplePolicy.filter(remote_user)
252 refute filtered["icon"]
256 describe "when :banner_removal" do
258 Config.put([:mrf_simple, :banner_removal], [])
260 remote_user = build_remote_user()
262 assert SimplePolicy.filter(remote_user) == {:ok, remote_user}
265 test "is not empty but it doesn't have a matching host" do
266 Config.put([:mrf_simple, :banner_removal], ["non.matching.remote"])
268 remote_user = build_remote_user()
270 assert SimplePolicy.filter(remote_user) == {:ok, remote_user}
273 test "has a matching host" do
274 Config.put([:mrf_simple, :banner_removal], ["remote.instance"])
276 remote_user = build_remote_user()
277 {:ok, filtered} = SimplePolicy.filter(remote_user)
279 refute filtered["image"]
283 defp build_local_message do
285 "actor" => "#{Pleroma.Web.base_url()}/users/alice",
291 defp build_remote_message do
292 %{"actor" => "https://remote.instance/users/bob"}
295 defp build_remote_user do
297 "id" => "https://remote.instance/users/bob",
299 "url" => "http://example.com/image.jpg",
303 "url" => "http://example.com/image.jpg",