diff options
| -rw-r--r-- | config/config.exs | 4 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex | 30 | 
2 files changed, 28 insertions, 6 deletions
| diff --git a/config/config.exs b/config/config.exs index d0d53a64a..8b42a5351 100644 --- 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/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex index a3f516ae7..0b9caeb11 100644 --- a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex @@ -3,17 +3,37 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do +  alias Pleroma.User    @behaviour Pleroma.Web.ActivityPub.MRF    @impl true    def filter(%{"type" => "Create"} = object) do -    threshold = Pleroma.Config.get([:mrf_hellthread, :threshold]) +    delist_threshold = Pleroma.Config.get([:mrf_hellthread, :delist_threshold]) +    reject_threshold = Pleroma.Config.get([:mrf_hellthread, :reject_threshold])      recipients = (object["to"] || []) ++ (object["cc"] || []) -    if length(recipients) > threshold do -      {:reject, nil} -    else -      {:ok, object} +    cond do +      length(recipients) > reject_threshold -> +        {:reject, nil} + +      length(recipients) > delist_threshold -> +        if Enum.member?(object["to"], "https://www.w3.org/ns/activitystreams#Public") or +             Enum.member?(object["cc"], "https://www.w3.org/ns/activitystreams#Public") do +          object +          |> Kernel.update_in(["object", "to"], [ +            User.get_cached_by_ap_id(object["actor"].follower_address) +          ]) +          |> Kernel.update_in(["object", "cc"], ["https://www.w3.org/ns/activitystreams#Public"]) +          |> Kernel.update_in(["to"], [ +            User.get_cached_by_ap_id(object["actor"].follower_address) +          ]) +          |> Kernel.update_in(["cc"], ["https://www.w3.org/ns/activitystreams#Public"]) +        else +          {:ok, object} +        end + +      true -> +        {:ok, object}      end    end | 
