From 06612c802b561014ed955c8e6999e457e719fa0d Mon Sep 17 00:00:00 2001 From: Floatingghost Date: Sat, 2 Aug 2025 09:47:32 +0100 Subject: [PATCH] Do not federate undo->block activities the :do_not_federate checks were omitted from the undo pipeline, which could lead to them federating. this commit enforces :outgoing_blocks on undos as well - and any existing value of :do_not_federate is preserved, if one exists Akkoma issue 957. [Pleroma: block/unblock test calls use the Pleroma (blocked, blocker) argument order.] (cherry picked from commit eca7ed572b8a10a0235fb1a381eac4803614dee4) --- .../web/activity_pub/object_validator.ex | 6 ++++++ test/pleroma/web/common_api_test.exs | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 468298a4d..a89ad94f8 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -78,10 +78,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) undone_object = Activity.get_by_ap_id(object["object"]) + outgoing_blocks = Pleroma.Config.get([:activitypub, :outgoing_blocks]) + # if we're undoing a block, and do not permit federating that: + do_not_federate = + Keyword.get(meta, :do_not_federate) || + (Map.get(undone_object.data, "type") == "Block" && !outgoing_blocks) meta = meta |> Keyword.put(:object_data, undone_object.data) + |> Keyword.put(:do_not_federate, do_not_federate) {:ok, object, meta} end diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index 5d0ad4572..6c2b5ec91 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -338,6 +338,26 @@ defmodule Pleroma.Web.CommonAPITest do assert {:ok, :no_activity} == CommonAPI.unblock(blocked, blocker) refute User.blocks?(blocker, blocked) end + + test "it unblocks and does not federate if outgoing blocks are disabled" do + clear_config([:instance, :federating], true) + clear_config([:activitypub, :outgoing_blocks], false) + + blocked = insert(:user) + blocker = insert(:user) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, block} = CommonAPI.block(blocked, blocker) + assert block.local + assert User.blocks?(blocker, blocked) + + assert {:ok, unblock} = CommonAPI.unblock(blocked, blocker) + assert unblock.local + refute User.blocks?(blocker, blocked) + assert_not_called(Pleroma.Web.Federator.publish(:_)) + end + end end describe "deletion" do