HTTP signatures respect allowlist federation
[akkoma] / lib / pleroma / web / activity_pub / publisher.ex
index cd820fa3dcdb20241f92e45fb597fb92ad052f2f..3071c1b770593a8fe3702b2bad336285a169935f 100644 (file)
@@ -103,15 +103,33 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
     end
   end
 
-  defp should_federate?(inbox) do
-    %{host: host} = URI.parse(inbox)
+  defp blocked_instances do
+    Config.get([:instance, :quarantined_instances], []) ++
+      Config.get([:mrf_simple, :reject], [])
+  end
+
+  defp allowed_instances do
+    Config.get([:mrf_simple, :accept])
+  end
 
-    quarantined_instances =
-      Config.get([:instance, :quarantined_instances], [])
+  def should_federate?(url) do
+    %{host: host} = URI.parse(url)
+
+    with allowed <- allowed_instances(),
+         false <- Enum.empty?(allowed) do
+      allowed
       |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
       |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
+      |> Pleroma.Web.ActivityPub.MRF.subdomain_match?(host)
+    else
+      _ ->
+        quarantined_instances =
+          blocked_instances()
+          |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
+          |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
 
-    !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
+        not Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
+    end
   end
 
   @spec recipients(User.t(), Activity.t()) :: list(User.t()) | []