diff options
author | William Pitcock <nenolod@dereferenced.org> | 2019-02-04 02:35:46 +0000 |
---|---|---|
committer | William Pitcock <nenolod@dereferenced.org> | 2019-02-04 17:04:05 +0000 |
commit | 88e32a32ce6a23de12a431c57a6db8251b0e323a (patch) | |
tree | b3081a40bac3e940f31c914858ed279cbb2bf7f7 | |
parent | 93e136d70b181fa271c2b4a5decd258f1287b1fa (diff) | |
download | pleroma-88e32a32ce6a23de12a431c57a6db8251b0e323a.tar.gz |
mrf: add initial MRF.TagPolicy engine
-rw-r--r-- | lib/pleroma/web/activity_pub/mrf/tag_policy.ex | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/mrf/tag_policy.ex b/lib/pleroma/web/activity_pub/mrf/tag_policy.ex new file mode 100644 index 000000000..4d6dc9c9e --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/tag_policy.ex @@ -0,0 +1,54 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do + alias Pleroma.User + @behaviour Pleroma.Web.ActivityPub.MRF + + defp get_tags(%User{tags: tags}) when is_list(tags), do: tags + defp get_tags(_), do: [] + + defp process_tag( + "mrf_tag:media-force-nsfw", + %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message + ) + when length(child_attachment) > 0 do + tags = (object["tag"] || []) ++ ["nsfw"] + + object = + object + |> Map.put("tags", tags) + |> Map.put("sensitive", true) + + message = Map.put(message, "object", object) + + {:ok, message} + end + + defp process_tag( + "mrf_tag:media-strip", + %{"type" => "Create", "object" => %{"attachment" => child_attachment} = object} = message + ) + when length(child_attachment) > 0 do + object = Map.delete(object, "attachment") + message = Map.put(message, "object", object) + + {:ok, message} + end + + defp process_tag(_, message), do: {:ok, message} + + @impl true + def filter(%{"actor" => actor} = message) do + User.get_cached_by_ap_id(actor) + |> get_tags() + |> Enum.reduce({:ok, message}, fn + tag, {:ok, message} -> + process_tag(tag, message) + + _, error -> + error + end) + end +end |