From 892628d16d83450c3efc6224ec6bdbddca37d622 Mon Sep 17 00:00:00 2001 From: Oneric Date: Mon, 2 Mar 2026 00:00:00 +0000 Subject: [PATCH] user/fetcher: always detect nickname changes on Update activities Even when the "always force revalidation" option is not enabled while avoiding unnecessary revalidations if nothing changed. With this heuristic we should be able to change the default to "false" soon, but for now keep it enabled to help amend recent bugs. --- config/config.exs | 6 +++++- lib/pleroma/user/fetcher.ex | 29 ++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/config/config.exs b/config/config.exs index 33c446fc2..fea7aa507 100644 --- a/config/config.exs +++ b/config/config.exs @@ -904,7 +904,11 @@ config :pleroma, ConcurrentLimiter, [ {Pleroma.Search, [max_running: 30, max_waiting: 50]} ] -config :pleroma, Pleroma.Web.WebFinger, domain: nil, update_nickname_on_user_fetch: true +config :pleroma, Pleroma.Web.WebFinger, + domain: nil, + # this _forces_ a nickname rediscovery and validation, otherwise only updates when detecting a change + # TODO: default this to false after the fallout from recent WebFinger bugs is healed + update_nickname_on_user_fetch: true config :pleroma, Pleroma.Search, module: Pleroma.Search.DatabaseSearch diff --git a/lib/pleroma/user/fetcher.ex b/lib/pleroma/user/fetcher.ex index e1598510f..4cbf5cdde 100644 --- a/lib/pleroma/user/fetcher.ex +++ b/lib/pleroma/user/fetcher.ex @@ -361,6 +361,27 @@ condition? Not changing anything." end end + defp needs_nick_update(%{"webfinger" => "acct:" <> nick}, nick), do: false + defp needs_nick_update(%{"webfinger" => nick}, nick), do: false + + defp needs_nick_update(%{"preferredUsername" => name}, oldnick) when is_binary(name) do + String.starts_with(oldnick, name <> "@") + end + + defp needs_nick_update(ap_data, oldnick) do + ap_nick = ap_data["webfinger"] || ap_data["preferredUsername"] + (!oldnick && ap_nick) || (oldnick && !ap_nick) + end + + defp refreshed_nick(ap_data, olduser) do + if Config.get!([Pleroma.Web.WebFinger, :update_nickname_on_user_fetch]) || + !olduser || needs_nick_update(ap_data, olduser.nickname) do + discover_nick_from_actor_data(ap_data) + else + olduser.nickname + end + end + def make_user_from_ap_id(ap_id) do with {:ok, data} <- APFetcher.fetch_and_contain_remote_object_from_id(ap_id), verified_nick <- discover_nick_from_actor_data(data) do @@ -391,13 +412,7 @@ condition? Not changing anything." def update_user_with_apdata(%{"id" => ap_id} = new_ap_data) do with %User{} = old_user <- User.get_cached_by_ap_id(ap_id) do - new_nick = - if Config.get!([Pleroma.Web.WebFinger, :update_nickname_on_user_fetch]) do - discover_nick_from_actor_data(new_ap_data) - else - old_user.nickname - end - + new_nick = refreshed_nick(new_ap_data, old_user) make_user_from_apdata_and_nick(new_ap_data, new_nick, old_user) else nil ->