added optional delist feature
authorKaren Konou <konoukaren@gmail.com>
Sun, 3 Feb 2019 19:12:23 +0000 (20:12 +0100)
committerKaren Konou <konoukaren@gmail.com>
Sun, 3 Feb 2019 19:12:23 +0000 (20:12 +0100)
config/config.exs
lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex

index d0d53a64a2fa25127c8d9f1a226ee727b87db190..8b42a53513626b0ee58d9c31e9375d29cafc728d 100644 (file)
@@ -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: [],
index a3f516ae7fde83b0680c7ec6f9f98ad8c9a72a3c..0b9caeb11641bfd823db6857894be9825dd90bcd 100644 (file)
@@ -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