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:
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,