Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
2 KB
Referenced Files
None
Subscribers
None
diff --git a/changelog.d/user-fetch-display-url.fix b/changelog.d/user-fetch-display-url.fix
new file mode 100644
index 000000000..fcde4ecf4
--- /dev/null
+++ b/changelog.d/user-fetch-display-url.fix
@@ -0,0 +1 @@
+Update the known user instead of failing when an actor is fetched from a display URL
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 18cb2cadc..b997e7831 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -2055,11 +2055,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
def enqueue_pin_fetches(_), do: nil
def make_user_from_ap_id(ap_id, additional \\ []) do
- user = User.get_cached_by_ap_id(ap_id)
-
with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id, additional) do
enqueue_pin_fetches(data)
+ # the fetched actor's id differs from ap_id when it was fetched from a display URL
+ user = User.get_cached_by_ap_id(data.ap_id)
+
if user do
user
|> User.remote_user_changeset(data)
diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs
index 7294119b8..c118cd8f1 100644
--- a/test/pleroma/web/activity_pub/activity_pub_test.exs
+++ b/test/pleroma/web/activity_pub/activity_pub_test.exs
@@ -269,6 +269,33 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
refute User.get_by_ap_id(ap_id)
end
+ test "updates the known user when fetched from a display URL" do
+ ap_id = "https://example.com/users/lain"
+ display_url = "https://example.com/@lain"
+ user = insert(:user, local: false, ap_id: ap_id, nickname: "lain@example.com")
+
+ user_data =
+ "test/fixtures/users_mock/user.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "lain")
+ |> Jason.decode!()
+ |> Map.merge(%{"featured" => nil, "name" => "new name"})
+ |> Jason.encode!()
+
+ Tesla.Mock.mock(fn %{method: :get, url: url} when url in [ap_id, display_url] ->
+ %Tesla.Env{
+ status: 200,
+ body: user_data,
+ headers: [{"content-type", "application/activity+json"}]
+ }
+ end)
+
+ assert {:ok, %User{id: id, name: "new name"}} =
+ ActivityPub.make_user_from_ap_id(display_url)
+
+ assert id == user.id
+ end
+
test "fetches user featured collection" do
ap_id = "https://example.com/users/lain"

File Metadata

Mime Type
text/x-diff
Expires
Fri, Oct 30, 12:19 AM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1798974
Default Alt Text
(2 KB)

Event Timeline