remove public post quarantine exception (#114)
authorfloatingghost <hannah@coffee-and-dreams.uk>
Tue, 26 Jul 2022 11:09:13 +0000 (11:09 +0000)
committerfloatingghost <hannah@coffee-and-dreams.uk>
Tue, 26 Jul 2022 11:09:13 +0000 (11:09 +0000)
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/114

CHANGELOG.md
config/description.exs
docs/docs/configuration/cheatsheet.md
lib/pleroma/web/activity_pub/publisher.ex
test/pleroma/web/activity_pub/publisher_test.exs

index 4982a319130abccdf7a8a73d8c0f286ba05acacc..b75720f8d96eff5a49cdea47edef67bc8eca589b 100644 (file)
@@ -10,6 +10,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - extended runtime module support, see config cheatsheet
 - quote posting; quotes are limited to public posts
 
+### Changed
+- quarantining is now considered absolutely; public activities are no longer
+  an exception.
+
 ### Fixed
 - Updated mastoFE path, for the newer version
 
index a447c58ecbaebfc081ce17c2b75d643b1a777e72..b8a053c3c3c0684fcb40f777df555c97506a6d9b 100644 (file)
@@ -691,7 +691,7 @@ config :pleroma, :config_description, [
         key_placeholder: "instance",
         value_placeholder: "reason",
         description:
-          "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so",
+          "List of ActivityPub instances where activities will not be sent, and the reason for doing so",
         suggestions: [
           {"quarantined.com", "Reason"},
           {"*.quarantined.com", "Reason"}
index 7b0934fcf65afe25f42213f9234303b9c63cb61c..fdc39c0de796829b1ad8f4c75fab10ba00de8f82 100644 (file)
@@ -34,7 +34,7 @@ To add configuration to your config file, you can copy it from the base config.
 * `federation_reachability_timeout_days`: Timeout (in days) of each external federation target being unreachable prior to pausing federating to it.
 * `allow_relay`: Permits remote instances to subscribe to all public posts of your instance. This may increase the visibility of your instance.
 * `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note that there is a dependent setting restricting or allowing unauthenticated access to specific resources, see `restrict_unauthenticated` for more details.
-* `quarantined_instances`: ActivityPub instances where private (DMs, followers-only) activities will not be send.
+* `quarantined_instances`: ActivityPub instances where activities will not be sent. They can still reach there via other means, we just won't send them.
 * `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML).
 * `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with
     older software for theses nicknames.
index ed99079e2f7c9dd0ffce56c70ee532024074f350..cd820fa3dcdb20241f92e45fb597fb92ad052f2f 100644 (file)
@@ -103,19 +103,15 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
     end
   end
 
-  defp should_federate?(inbox, public) do
-    if public do
-      true
-    else
-      %{host: host} = URI.parse(inbox)
+  defp should_federate?(inbox) do
+    %{host: host} = URI.parse(inbox)
 
-      quarantined_instances =
-        Config.get([:instance, :quarantined_instances], [])
-        |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
-        |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
+    quarantined_instances =
+      Config.get([:instance, :quarantined_instances], [])
+      |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
+      |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
 
-      !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
-    end
+    !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
   end
 
   @spec recipients(User.t(), Activity.t()) :: list(User.t()) | []
@@ -192,7 +188,6 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
 
   def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity)
       when is_list(bcc) and bcc != [] do
-    public = is_public?(activity)
     {:ok, data} = Transmogrifier.prepare_outgoing(activity.data)
 
     recipients = recipients(actor, activity)
@@ -201,7 +196,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
       recipients
       |> Enum.filter(&User.ap_enabled?/1)
       |> Enum.map(fn actor -> actor.inbox end)
-      |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+      |> Enum.filter(fn inbox -> should_federate?(inbox) end)
       |> Instances.filter_reachable()
 
     Repo.checkout(fn ->
@@ -246,7 +241,7 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
       determine_inbox(activity, user)
     end)
     |> Enum.uniq()
-    |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+    |> Enum.filter(fn inbox -> should_federate?(inbox) end)
     |> Instances.filter_reachable()
     |> Enum.each(fn {inbox, unreachable_since} ->
       Pleroma.Web.Federator.Publisher.enqueue_one(
index b50e22bbe794ccf24733b5ab404849ae3793b1e9..95f12de2d869ffbe84f07f2f5f718fd6db4dfae8 100644 (file)
@@ -23,7 +23,10 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
     :ok
   end
 
-  setup_all do: clear_config([:instance, :federating], true)
+  setup_all do
+    clear_config([:instance, :federating], true)
+    clear_config([:instance, :quarantined_instances], [])
+  end
 
   describe "gather_webfinger_links/1" do
     test "it returns links" do
@@ -267,7 +270,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
   end
 
   describe "publish/2" do
-    test_with_mock "doesn't publish a non-public activity to quarantined instances.",
+    test_with_mock "doesn't publish any activity to quarantined instances.",
                    Pleroma.Web.Federator.Publisher,
                    [:passthrough],
                    [] do
@@ -291,10 +294,18 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
           recipients: [follower.ap_id]
         )
 
+      public_note_activity =
+        insert(:note_activity,
+          user: actor,
+          recipients: [follower.ap_id, @as_public]
+        )
+
       res = Publisher.publish(actor, note_activity)
 
       assert res == :ok
 
+      :ok = Publisher.publish(actor, public_note_activity)
+
       assert not called(
                Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
                  inbox: "https://domain.com/users/nick1/inbox",
@@ -302,6 +313,14 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
                  id: note_activity.data["id"]
                })
              )
+
+      assert not called(
+               Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+                 inbox: "https://domain.com/users/nick1/inbox",
+                 actor_id: actor.id,
+                 id: public_note_activity.data["id"]
+               })
+             )
     end
 
     test_with_mock "Publishes a non-public activity to non-quarantined instances.",
@@ -345,6 +364,8 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
                    Pleroma.Web.Federator.Publisher,
                    [:passthrough],
                    [] do
+      Config.put([:instance, :quarantined_instances], [])
+
       follower =
         insert(:user, %{
           local: false,
@@ -379,6 +400,8 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
                    Pleroma.Web.Federator.Publisher,
                    [:passthrough],
                    [] do
+      clear_config([:instance, :quarantined_instances], [])
+
       fetcher =
         insert(:user,
           local: false,