diff options
author | lain <lain@soykaf.club> | 2020-07-01 12:26:07 +0200 |
---|---|---|
committer | lain <lain@soykaf.club> | 2020-07-01 12:26:07 +0200 |
commit | fedfe8f7d6f78d77e9cbaf70fa8a9e8df38463f7 (patch) | |
tree | 683387132a57d9c764f740a1d56c556a6ee7fede /lib/pleroma/web/activity_pub | |
parent | 9cf4bfcd818b9631e4352cc30236ef541662c86b (diff) | |
download | pleroma-fedfe8f7d6f78d77e9cbaf70fa8a9e8df38463f7.tar.gz |
ActivityPub: Handle clashing nicknames for the same ap id
If we get a new user (identified by ap_id) that would have the same
nickname as an existing user, give the existing user a nickname that
is prepended with the user id, as this will never clash.
This can happen when a user switches server software and that soft-
ware generates ap ids in a different way.
Diffstat (limited to 'lib/pleroma/web/activity_pub')
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 05bd824f5..94117202c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1371,6 +1371,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end + def maybe_handle_clashing_nickname(nickname) do + with %User{} = old_user <- User.get_by_nickname(nickname) do + Logger.info("Found an old user for #{nickname}, ap id is #{old_user.ap_id}, renaming.") + + old_user + |> User.remote_user_changeset(%{nickname: "#{old_user.id}.#{old_user.nickname}"}) + |> User.update_and_set_cache() + end + end + def make_user_from_ap_id(ap_id) do user = User.get_cached_by_ap_id(ap_id) @@ -1383,6 +1393,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> User.remote_user_changeset(data) |> User.update_and_set_cache() else + maybe_handle_clashing_nickname(data[:nickname]) + data |> User.remote_user_changeset() |> Repo.insert() |