1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
7 @behaviour Pleroma.Web.ActivityPub.MRF
9 defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
10 defp get_tags(_), do: []
13 "mrf_tag:media-force-nsfw",
14 %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message
16 when length(child_attachment) > 0 do
17 tags = (object["tag"] || []) ++ ["nsfw"]
21 |> Map.put("tags", tags)
22 |> Map.put("sensitive", true)
24 message = Map.put(message, "object", object)
30 "mrf_tag:media-strip",
31 %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message
33 when length(child_attachment) > 0 do
34 object = Map.delete(object, "attachment")
35 message = Map.put(message, "object", object)
41 "mrf_tag:force-unlisted",
42 %{"type" => "Create", "to" => to, "cc" => cc, "actor" => actor} = message
44 user = User.get_cached_by_ap_id(actor)
46 if Enum.member?(to, "https://www.w3.org/ns/activitystreams#Public") do
48 List.delete(to, "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address]
51 List.delete(cc, user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"]
66 %{"type" => "Create", "to" => to, "cc" => cc, "actor" => actor} = message
68 user = User.get_cached_by_ap_id(actor)
70 if Enum.member?(to, "https://www.w3.org/ns/activitystreams#Public") or
71 Enum.member?(cc, "https://www.w3.org/ns/activitystreams#Public") do
73 List.delete(to, "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address]
75 cc = List.delete(cc, "https://www.w3.org/ns/activitystreams#Public")
89 "mrf_tag:disable-remote-subscription",
90 %{"type" => "Follow", "actor" => actor} = message
92 user = User.get_cached_by_ap_id(actor)
94 if user.local == true do
101 defp process_tag("mrf_tag:disable-any-subscription", %{"type" => "Follow"}), do: {:reject, nil}
103 defp process_tag(_, message), do: {:ok, message}
105 def filter_message(actor, message) do
106 User.get_cached_by_ap_id(actor)
108 |> Enum.reduce({:ok, message}, fn
109 tag, {:ok, message} ->
110 process_tag(tag, message)
118 def filter(%{"object" => target_actor, "type" => "Follow"} = message),
119 do: filter_message(target_actor, message)
122 def filter(%{"actor" => actor, "type" => "Create"} = message),
123 do: filter_message(actor, message)
126 def filter(message), do: {:ok, message}