forked from mirrors/akkoma
Merge branch 'feature/hellthread-filter-improvements' into 'develop'
Improve hellthread filter Closes #584 See merge request pleroma/pleroma!766
This commit is contained in:
commit
89762ad230
4 changed files with 47 additions and 11 deletions
|
@ -227,7 +227,9 @@ config :pleroma, :mrf_rejectnonpublic,
|
||||||
allow_followersonly: false,
|
allow_followersonly: false,
|
||||||
allow_direct: false
|
allow_direct: false
|
||||||
|
|
||||||
config :pleroma, :mrf_hellthread, threshold: 10
|
config :pleroma, :mrf_hellthread,
|
||||||
|
delist_threshold: 5,
|
||||||
|
reject_threshold: 10
|
||||||
|
|
||||||
config :pleroma, :mrf_simple,
|
config :pleroma, :mrf_simple,
|
||||||
media_removal: [],
|
media_removal: [],
|
||||||
|
|
|
@ -148,7 +148,8 @@ This section is used to configure Pleroma-FE, unless ``:managed_config`` in ``:i
|
||||||
* `allow_direct`: whether to allow direct messages
|
* `allow_direct`: whether to allow direct messages
|
||||||
|
|
||||||
## :mrf_hellthread
|
## :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
|
## :media_proxy
|
||||||
* `enabled`: Enables proxying of remote media to the instance’s proxy
|
* `enabled`: Enables proxying of remote media to the instance’s proxy
|
||||||
|
|
|
@ -12,6 +12,13 @@ defmodule Pleroma.Config.DeprecationWarnings do
|
||||||
You are using the old configuration mechanism for the frontend. Please check config.md.
|
You are using the old configuration mechanism for the frontend. Please check config.md.
|
||||||
""")
|
""")
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
def warn do
|
def warn do
|
||||||
|
|
|
@ -3,20 +3,46 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
|
defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
|
||||||
|
alias Pleroma.User
|
||||||
@behaviour Pleroma.Web.ActivityPub.MRF
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
@impl true
|
defp delist_message(message) do
|
||||||
def filter(%{"type" => "Create"} = object) do
|
follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address
|
||||||
threshold = Pleroma.Config.get([:mrf_hellthread, :threshold])
|
|
||||||
recipients = (object["to"] || []) ++ (object["cc"] || [])
|
|
||||||
|
|
||||||
if length(recipients) > threshold do
|
message
|
||||||
{:reject, nil}
|
|> Map.put("to", [follower_collection])
|
||||||
else
|
|> Map.put("cc", ["https://www.w3.org/ns/activitystreams#Public"])
|
||||||
{:ok, object}
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def filter(object), do: {:ok, object}
|
def filter(message), do: {:ok, message}
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue