logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 89762ad23034668f7440c9fb238dcf270e8c2e59
parent: c57f37bd36702fa8865366fbfaea9ac3f28dfad3
Author: rinpatch <rinpatch@sdf.org>
Date:   Mon,  4 Feb 2019 12:36:50 +0000

Merge branch 'feature/hellthread-filter-improvements' into 'develop'

Improve hellthread filter

Closes #584

See merge request pleroma/pleroma!766

Diffstat:

Mconfig/config.exs4+++-
Mdocs/config.md3++-
Mlib/pleroma/config/deprecation_warnings.ex7+++++++
Mlib/pleroma/web/activity_pub/mrf/hellthread_policy.ex44+++++++++++++++++++++++++++++++++++---------
4 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/config/config.exs b/config/config.exs @@ -227,7 +227,9 @@ config :pleroma, :mrf_rejectnonpublic, allow_followersonly: false, allow_direct: false -config :pleroma, :mrf_hellthread, threshold: 10 +config :pleroma, :mrf_hellthread, + delist_threshold: 5, + reject_threshold: 10 config :pleroma, :mrf_simple, media_removal: [], diff --git a/docs/config.md b/docs/config.md @@ -148,7 +148,8 @@ This section is used to configure Pleroma-FE, unless ``:managed_config`` in ``:i * `allow_direct`: whether to allow direct messages ## :mrf_hellthread -* `threshold`: Number of mentioned users after which the message gets discarded as spam +* `delist_threshold`: Number of mentioned users after which the message gets delisted (the message can still be seen, but it will not show up in public timelines and mentioned users won't get notifications about it). Set to 0 to disable. +* `reject_threshold`: Number of mentioned users after which the messaged gets rejected. Set to 0 to disable. ## :media_proxy * `enabled`: Enables proxying of remote media to the instance’s proxy diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex @@ -12,6 +12,13 @@ defmodule Pleroma.Config.DeprecationWarnings do You are using the old configuration mechanism for the frontend. Please check config.md. """) end + + if Pleroma.Config.get(:mrf_hellthread, :threshold) do + Logger.warn(""" + !!!DEPRECATION WARNING!!! + You are using the old configuration mechanism for the hellthread filter. Please check config.md. + """) + end end def warn do diff --git a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex @@ -3,20 +3,46 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do + alias Pleroma.User @behaviour Pleroma.Web.ActivityPub.MRF + defp delist_message(message) do + follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address + + message + |> Map.put("to", [follower_collection]) + |> Map.put("cc", ["https://www.w3.org/ns/activitystreams#Public"]) + end + @impl true - def filter(%{"type" => "Create"} = object) do - threshold = Pleroma.Config.get([:mrf_hellthread, :threshold]) - recipients = (object["to"] || []) ++ (object["cc"] || []) - - if length(recipients) > threshold do - {:reject, nil} - else - {:ok, object} + def filter(%{"type" => "Create"} = message) do + delist_threshold = Pleroma.Config.get([:mrf_hellthread, :delist_threshold]) + + reject_threshold = + Pleroma.Config.get( + [:mrf_hellthread, :reject_threshold], + Pleroma.Config.get([:mrf_hellthread, :threshold]) + ) + + recipients = (message["to"] || []) ++ (message["cc"] || []) + + cond do + length(recipients) > reject_threshold and reject_threshold > 0 -> + {:reject, nil} + + length(recipients) > delist_threshold and delist_threshold > 0 -> + if Enum.member?(message["to"], "https://www.w3.org/ns/activitystreams#Public") or + Enum.member?(message["cc"], "https://www.w3.org/ns/activitystreams#Public") do + {:ok, delist_message(message)} + else + {:ok, message} + end + + true -> + {:ok, message} end end @impl true - def filter(object), do: {:ok, object} + def filter(message), do: {:ok, message} end