3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-15 00:19:29 +01:00

Merge pull request #2136 from slingamn/issue2135_nicknameinuse

fix #2135
This commit is contained in:
Shivaram Lingamneni 2024-03-20 10:48:27 -04:00 committed by GitHub
commit d56e4ea301
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 1 deletions

View File

@ -116,6 +116,8 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
useAccountName = alwaysOn || config.Accounts.NickReservation.ForceNickEqualsAccount useAccountName = alwaysOn || config.Accounts.NickReservation.ForceNickEqualsAccount
} }
nickIsReserved := false
if useAccountName { if useAccountName {
if registered && newNick != accountName { if registered && newNick != accountName {
return "", errNickAccountMismatch, false return "", errNickAccountMismatch, false
@ -167,7 +169,9 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
reservedAccount, method := client.server.accounts.EnforcementStatus(newCfNick, newSkeleton) reservedAccount, method := client.server.accounts.EnforcementStatus(newCfNick, newSkeleton)
if method == NickEnforcementStrict && reservedAccount != "" && reservedAccount != account { if method == NickEnforcementStrict && reservedAccount != "" && reservedAccount != account {
return "", errNicknameReserved, false // see #2135: we want to enter the critical section, see if the nick is actually in use,
// and return errNicknameInUse in that case
nickIsReserved = true
} }
} }
@ -219,6 +223,9 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
if skeletonHolder != nil && skeletonHolder != client { if skeletonHolder != nil && skeletonHolder != client {
return "", errNicknameInUse, false return "", errNicknameInUse, false
} }
if nickIsReserved {
return "", errNicknameReserved, false
}
if dryRun { if dryRun {
return "", nil, false return "", nil, false

View File

@ -43,6 +43,8 @@ func performNickChange(server *Server, client *Client, target *Client, session *
} }
} else if err == errNicknameReserved { } else if err == errNicknameReserved {
if !isSanick { if !isSanick {
// see #1594 for context: ERR_NICKNAMEINUSE can confuse clients if the nickname is not
// literally in use:
if !client.registered { if !client.registered {
rb.Add(nil, server.name, ERR_NICKNAMEINUSE, details.nick, utils.SafeErrorParam(nickname), client.t("Nickname is reserved by a different account")) rb.Add(nil, server.name, ERR_NICKNAMEINUSE, details.nick, utils.SafeErrorParam(nickname), client.t("Nickname is reserved by a different account"))
} }