logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: 606c9ae4b1ae6456fe4a17a9328c35ba87bbd652
parent 9eb923bd436c21d43e4b33e62e70f3b3d0240434
Author: nicole mikołajczyk <me@mkljczk.pl>
Date:   Tue, 21 Oct 2025 21:56:26 +0200

Merge branch 'fix-lists-bcc' into 'develop'

Fix publisher when publishing to a list of users

See merge request pleroma/pleroma!4360

Diffstat:

Achangelog.d/fix-lists-bcc.fix1+
Mlib/pleroma/web/activity_pub/publisher.ex27+++++++++++++++++++++------
Mtest/pleroma/web/activity_pub/publisher_test.exs27+++++++++++++++++++++++++++
3 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/changelog.d/fix-lists-bcc.fix b/changelog.d/fix-lists-bcc.fix @@ -0,0 +1 @@ +Fix publisher when publishing to a list of users diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex @@ -331,17 +331,21 @@ defmodule Pleroma.Web.ActivityPub.Publisher do Repo.checkout(fn -> Enum.each([priority_inboxes, other_inboxes], fn inboxes -> Enum.each(inboxes, fn inbox -> - %User{ap_id: ap_id} = Enum.find(recipients, fn actor -> actor.inbox == inbox end) + {%User{ap_id: ap_id}, priority} = + get_user_with_priority(inbox, priority_recipients, recipients) # Get all the recipients on the same host and add them to cc. Otherwise, a remote # instance would only accept a first message for the first recipient and ignore the rest. cc = get_cc_ap_ids(ap_id, recipients) - __MODULE__.enqueue_one(%{ - inbox: inbox, - cc: cc, - activity_id: activity.id - }) + __MODULE__.enqueue_one( + %{ + inbox: inbox, + cc: cc, + activity_id: activity.id + }, + priority: priority + ) end) end) end) @@ -403,4 +407,15 @@ defmodule Pleroma.Web.ActivityPub.Publisher do end def gather_nodeinfo_protocol_names, do: ["activitypub"] + + defp get_user_with_priority(inbox, priority_recipients, recipients) do + [{priority_recipients, 0}, {recipients, 1}] + |> Enum.find_value(fn {recipients, priority} -> + with %User{} = user <- Enum.find(recipients, fn actor -> actor.inbox == inbox end) do + {user, priority} + else + _ -> nil + end + end) + end end diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs @@ -332,6 +332,33 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do ) end + test "activity with BCC is published to a list member." do + actor = insert(:user) + {:ok, list} = Pleroma.List.create("list", actor) + list_member = insert(:user, %{local: false}) + + Pleroma.List.follow(list, list_member) + + note_activity = + insert(:note_activity, + # recipients: [follower.ap_id], + data_attrs: %{"bcc" => [list.ap_id]} + ) + + res = Publisher.publish(actor, note_activity) + assert res == :ok + + assert_enqueued( + worker: "Pleroma.Workers.PublisherWorker", + args: %{ + "params" => %{ + inbox: list_member.inbox, + activity_id: note_activity.id + } + } + ) + end + test "publishes a delete activity to peers who signed fetch requests to the create acitvity/object." do fetcher = insert(:user,