added checks for public url and follower collections
authorKaren Konou <konoukaren@gmail.com>
Tue, 12 Feb 2019 22:25:09 +0000 (23:25 +0100)
committerKaren Konou <konoukaren@gmail.com>
Tue, 12 Feb 2019 23:01:34 +0000 (00:01 +0100)
lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex

index 4c6e612b28357025f8b436c6ea3065e1bdce6bf7..9be3829724b1123ba09d815271141cb96ad16484 100644 (file)
@@ -14,6 +14,23 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
     |> Map.put("cc", ["https://www.w3.org/ns/activitystreams#Public"])
   end
 
+  defp get_recipient_count(message) do
+    recipients = (message["to"] || []) ++ (message["cc"] || [])
+
+    cond do
+      Enum.member?(recipients, "https://www.w3.org/ns/activitystreams#Public") &&
+          Enum.find(recipients, &String.ends_with?(&1, "/followers")) ->
+        length(recipients) - 2
+
+      Enum.member?(recipients, "https://www.w3.org/ns/activitystreams#Public") ||
+          Enum.find(recipients, &String.ends_with?(&1, "/followers")) ->
+        length(recipients) - 1
+
+      true ->
+        length(recipients)
+    end
+  end
+
   @impl true
   def filter(%{"type" => "Create"} = message) do
     delist_threshold = Pleroma.Config.get([:mrf_hellthread, :delist_threshold])
@@ -24,13 +41,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
         Pleroma.Config.get([:mrf_hellthread, :threshold])
       )
 
-    recipients = (message["to"] || []) ++ (message["cc"] || [])
+    recipients = get_recipient_count(message)
 
     cond do
-      length(recipients) > reject_threshold and reject_threshold > 0 ->
+      recipients > reject_threshold and reject_threshold > 0 ->
         {:reject, nil}
 
-      length(recipients) > delist_threshold and delist_threshold > 0 ->
+      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)}