logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: 58afb15eab26deba823c0a5de499f4695be900a3
parent b5c97e9ee07545486afb5d5bba3081b427a65334
Author: tusooa <tusooa@kazv.moe>
Date:   Wed,  1 Mar 2023 22:42:51 -0500

Make ActivityPub.Publisher aware of the actor change by Transmogrifier

Diffstat:

Mlib/pleroma/web/activity_pub/publisher.ex13+++++++++++++
Mtest/pleroma/web/activity_pub/publisher_test.exs44++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex @@ -92,6 +92,19 @@ defmodule Pleroma.Web.ActivityPub.Publisher do uri = %{path: path} = URI.parse(inbox) {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) + {actor, activity, data} = + with {_, false} <- {:actor_changed?, data["actor"] != activity.data["actor"]} do + {orig_actor, activity, data} + else + {:actor_changed?, true} -> + # If prepare_outgoing changes the actor, re-get it from the db + actor = User.get_cached_by_ap_id(data["actor"]) + + activity = %Activity{activity | actor: actor.ap_id} + + {actor, activity, data} + end + param_cc = Map.get(params, :cc, []) diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs @@ -379,6 +379,50 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do ) end + test_with_mock "Publishes with the new actor if prepare_outgoing changes the actor.", + Pleroma.Web.Federator.Publisher, + [:passthrough], + [] do + other_user = + insert(:user, %{ + local: false, + inbox: "https://domain.com/users/nick1/inbox", + ap_enabled: true + }) + + actor = insert(:user) + replaced_actor = insert(:user) + + note_activity = + insert(:note_activity, + user: actor, + data_attrs: %{"to" => [other_user.ap_id]} + ) + + with_mock Pleroma.Web.ActivityPub.Transmogrifier, + prepare_outgoing: fn data -> {:ok, Map.put(data, "actor", replaced_actor.ap_id)} end do + res = Publisher.publish(actor, note_activity) + + assert res == :ok + + refute called( + Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{ + inbox: "https://domain.com/users/nick1/inbox", + actor_id: actor.id, + id: note_activity.data["id"] + }) + ) + + assert called( + Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{ + inbox: "https://domain.com/users/nick1/inbox", + actor_id: replaced_actor.id, + id: note_activity.data["id"] + }) + ) + end + end + test_with_mock "publishes an activity with BCC to all relevant peers.", Pleroma.Web.ActivityPub.Publisher, [:passthrough],