summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Pitcock <nenolod@dereferenced.org>2018-04-14 11:31:12 +0000
committerWilliam Pitcock <nenolod@dereferenced.org>2018-04-14 06:32:45 -0500
commitd24ddd9fb9fb5254b2e80cbe70ba9bc83f2cd0da (patch)
tree6801927c1d5bbda679536a8594a13d21b420e999
parent4a178b3d6589bbb9ab08e8a768cc0a3a5d5e9629 (diff)
downloadpleroma-d24ddd9fb9fb5254b2e80cbe70ba9bc83f2cd0da.tar.gz
pleroma-d24ddd9fb9fb5254b2e80cbe70ba9bc83f2cd0da.zip
ActivityPub MRF: implement the SimplePolicy policy
-rw-r--r--config/config.exs6
-rw-r--r--lib/pleroma/web/activity_pub/mrf/simple_policy.ex65
2 files changed, 71 insertions, 0 deletions
diff --git a/config/config.exs b/config/config.exs
index 660ba1775..b0f4578d5 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -55,6 +55,12 @@ config :pleroma, :instance,
federating: true,
rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy
+config :pleroma, :mrf_simple,
+ media_removal: [],
+ media_nsfw: [],
+ federated_timeline_removal: [],
+ reject: []
+
config :pleroma, :media_proxy,
enabled: false,
redirect_on_failure: true
diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex
new file mode 100644
index 000000000..1322744f1
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex
@@ -0,0 +1,65 @@
+defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
+ alias Pleroma.User
+
+ @mrf_policy Application.get_env(:pleroma, :mrf_simple)
+
+ @reject Keyword.get(@mrf_policy, :reject)
+ defp check_reject(actor_info, object) do
+ if actor_info.host in @reject do
+ {:reject, nil}
+ else
+ {:ok, object}
+ end
+ end
+
+ @media_removal Keyword.get(@mrf_policy, :media_removal)
+ defp check_media_removal(actor_info, object) do
+ if actor_info.host in @media_removal do
+ object = Map.delete(object, "attachments")
+ end
+
+ {:ok, object}
+ end
+
+ @media_nsfw Keyword.get(@mrf_policy, :media_nsfw)
+ defp check_media_nsfw(actor_info, object) do
+ if actor_info.host in @media_nsfw and object["attachment"] != nil and length(object["attachment"]) > 0 do
+ tags = (object["tag"] || []) ++ ["nsfw"]
+ object = Map.put(object, "tags", tags)
+ object = Map.put(object, "sensitive", true)
+ end
+
+ {:ok, object}
+ end
+
+ @ftl_removal Keyword.get(@mrf_policy, :federated_timeline_removal)
+ defp check_ftl_removal(actor_info, object) do
+ if actor_info.host in @ftl_removal do
+ user = User.get_by_ap_id(object["actor"])
+
+ # flip to/cc relationship to make the post unlisted
+ if "https://www.w3.org/ns/activitystreams#Public" in object["to"] and user.follower_address in object["cc"] do
+ to = List.delete(object["to"], "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address]
+ cc = List.delete(object["cc"], user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"]
+
+ object = Map.put(object, "to", to)
+ object = Map.put(object, "cc", cc)
+ end
+ end
+
+ {:ok, object}
+ end
+
+ def filter(object) do
+ actor_info = URI.parse(object["actor"])
+
+ with {:ok, object} <- check_reject(actor_info, object),
+ {:ok, object} <- check_media_removal(actor_info, object),
+ {:ok, object} <- check_media_nsfw(actor_info, object),
+ {:ok, object} <- check_ftl_removal(actor_info, object) do
+ {:ok, object}
+ else
+ e -> {:reject, nil}
+ end
+ end
+end