Merge branch 'task-204-on-options-request' into 'develop'
[akkoma] / lib / pleroma / web / activity_pub / mrf / reject_non_public.ex
1 defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
2 alias Pleroma.User
3 @behaviour Pleroma.Web.ActivityPub.MRF
4
5 @mrf_rejectnonpublic Application.get_env(:pleroma, :mrf_rejectnonpublic)
6 @allow_followersonly Keyword.get(@mrf_rejectnonpublic, :allow_followersonly)
7 @allow_direct Keyword.get(@mrf_rejectnonpublic, :allow_direct)
8
9 @impl true
10 def filter(%{"type" => "Create"} = object) do
11 user = User.get_cached_by_ap_id(object["actor"])
12 public = "https://www.w3.org/ns/activitystreams#Public"
13
14 # Determine visibility
15 visibility =
16 cond do
17 public in object["to"] -> "public"
18 public in object["cc"] -> "unlisted"
19 user.follower_address in object["to"] -> "followers"
20 true -> "direct"
21 end
22
23 case visibility do
24 "public" ->
25 {:ok, object}
26
27 "unlisted" ->
28 {:ok, object}
29
30 "followers" ->
31 with true <- @allow_followersonly do
32 {:ok, object}
33 else
34 _e -> {:reject, nil}
35 end
36
37 "direct" ->
38 with true <- @allow_direct do
39 {:ok, object}
40 else
41 _e -> {:reject, nil}
42 end
43 end
44 end
45
46 @impl true
47 def filter(object), do: {:ok, object}
48 end