summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlambda <pleromagit@rogerbraun.net>2019-02-09 11:38:37 +0000
committerlambda <pleromagit@rogerbraun.net>2019-02-09 11:38:37 +0000
commit1eecbc1cd1a7f632e536f943fab6612e1e108d59 (patch)
treeaf3d60fbbf416f7466ba9e8c17d0cba0c1b73904 /lib
parentc5f8df08a724763398e2962a2ef378a4f00067a3 (diff)
parentb05a3411871fbfb8d1a5525d6875a635917abffa (diff)
downloadpleroma-1eecbc1cd1a7f632e536f943fab6612e1e108d59.tar.gz
pleroma-1eecbc1cd1a7f632e536f943fab6612e1e108d59.zip
Merge branch 'feature/keyword-policy' into 'develop'
Add keyword policy See merge request pleroma/pleroma!794
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/activity_pub/mrf/keyword_policy.ex73
-rw-r--r--lib/pleroma/web/nodeinfo/nodeinfo_controller.ex28
2 files changed, 101 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex
new file mode 100644
index 000000000..ce6d2e529
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex
@@ -0,0 +1,73 @@
+# 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.KeywordPolicy do
+ @behaviour Pleroma.Web.ActivityPub.MRF
+ defp string_matches?(string, pattern) when is_binary(pattern) do
+ String.contains?(string, pattern)
+ end
+
+ defp string_matches?(string, pattern) do
+ String.match?(string, pattern)
+ end
+
+ defp check_reject(%{"object" => %{"content" => content}} = message) do
+ if Enum.any?(Pleroma.Config.get([:mrf_keyword, :reject]), fn pattern ->
+ string_matches?(content, pattern)
+ end) do
+ {:reject, nil}
+ else
+ {:ok, message}
+ end
+ end
+
+ defp check_ftl_removal(%{"to" => to, "object" => %{"content" => content}} = message) do
+ if "https://www.w3.org/ns/activitystreams#Public" in to and
+ Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern ->
+ string_matches?(content, pattern)
+ end) do
+ to = List.delete(to, "https://www.w3.org/ns/activitystreams#Public")
+ cc = ["https://www.w3.org/ns/activitystreams#Public" | message["cc"] || []]
+
+ message =
+ message
+ |> Map.put("to", to)
+ |> Map.put("cc", cc)
+
+ {:ok, message}
+ else
+ {:ok, message}
+ end
+ end
+
+ defp check_replace(%{"object" => %{"content" => content}} = message) do
+ content =
+ Enum.reduce(Pleroma.Config.get([:mrf_keyword, :replace]), content, fn {pattern, replacement},
+ acc ->
+ String.replace(acc, pattern, replacement)
+ end)
+
+ {:ok, put_in(message["object"]["content"], content)}
+ end
+
+ @impl true
+ def filter(%{"object" => %{"content" => nil}} = message) do
+ {:ok, message}
+ end
+
+ @impl true
+ def filter(%{"type" => "Create", "object" => %{"content" => _content}} = message) do
+ with {:ok, message} <- check_reject(message),
+ {:ok, message} <- check_ftl_removal(message),
+ {:ok, message} <- check_replace(message) do
+ {:ok, message}
+ else
+ _e ->
+ {:reject, nil}
+ end
+ end
+
+ @impl true
+ def filter(message), do: {:ok, message}
+end
diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
index 21694a5ee..8c7df5b90 100644
--- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
+++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
@@ -44,6 +44,33 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
Application.get_env(:pleroma, :mrf_simple)
|> Enum.into(%{})
+ # This horror is needed to convert regex sigils to strings
+ mrf_keyword =
+ Application.get_env(:pleroma, :mrf_keyword, [])
+ |> Enum.map(fn {key, value} ->
+ {key,
+ Enum.map(value, fn
+ {pattern, replacement} ->
+ %{
+ "pattern" =>
+ if not is_binary(pattern) do
+ inspect(pattern)
+ else
+ pattern
+ end,
+ "replacement" => replacement
+ }
+
+ pattern ->
+ if not is_binary(pattern) do
+ inspect(pattern)
+ else
+ pattern
+ end
+ end)}
+ end)
+ |> Enum.into(%{})
+
mrf_policies =
MRF.get_policies()
|> Enum.map(fn policy -> to_string(policy) |> String.split(".") |> List.last() end)
@@ -73,6 +100,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
%{
mrf_policies: mrf_policies,
mrf_simple: mrf_simple,
+ mrf_keyword: mrf_keyword,
mrf_user_allowlist: mrf_user_allowlist,
quarantined_instances: quarantined
}