From 2b240faa9090db71419b6e9f30a64d8fb7cc0265 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Sat, 14 Jan 2017 02:32:15 +1000 Subject: [PATCH] strings: Fix nick bugs, use UsernameCaseMapped --- irc/client.go | 2 +- irc/client_lookup_set.go | 9 ++++----- irc/server.go | 2 +- irc/strings.go | 10 +++++++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/irc/client.go b/irc/client.go index dd30f8ce..0f457b08 100644 --- a/irc/client.go +++ b/irc/client.go @@ -397,11 +397,11 @@ func (client *Client) SetNickname(nickname string) error { // ChangeNickname changes the existing nickname of the client. func (client *Client) ChangeNickname(nickname string) error { origNickMask := client.nickMaskString - client.updateNickMask() err := client.server.clients.Replace(client.nick, nickname, client) if err == nil { client.server.whoWas.Append(client) client.nick = nickname + client.updateNickMask() for friend := range client.Friends() { friend.Send(nil, origNickMask, "NICK", nickname) } diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index 1437624f..d2f97ced 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -128,13 +128,12 @@ func (clients *ClientLookupSet) Replace(oldNick, newNick string, client *Client) clients.ByNickMutex.Lock() defer clients.ByNickMutex.Unlock() - oldClient := clients.getNoMutex(newNick) - if oldClient != nil { + oldClient := clients.ByNick[newNick] + if oldClient == nil || oldClient == client { + // whoo + } else { return ErrNicknameInUse } - if oldClient != client { - return ErrNicknameMismatch - } if oldNick == newNick { // if they're only changing case, don't need to remove+re-add them diff --git a/irc/server.go b/irc/server.go index 37bdffe3..08b4bc9e 100644 --- a/irc/server.go +++ b/irc/server.go @@ -305,7 +305,7 @@ func (server *Server) setISupport() { // add RPL_ISUPPORT tokens server.isupport = NewISupportList() server.isupport.Add("AWAYLEN", strconv.Itoa(server.limits.AwayLen)) - server.isupport.Add("CASEMAPPING", "rfc7700") + server.isupport.Add("CASEMAPPING", casemappingName) server.isupport.Add("CHANMODES", strings.Join([]string{ChannelModes{BanMask, ExceptMask, InviteMask}.String(), "", ChannelModes{UserLimit, Key}.String(), ChannelModes{InviteOnly, Moderated, NoOutside, OpOnlyTopic, ChanRoleplaying, Secret}.String()}, ",")) server.isupport.Add("CHANNELLEN", strconv.Itoa(server.limits.ChannelLen)) server.isupport.Add("CHANTYPES", "#") diff --git a/irc/strings.go b/irc/strings.go index 072bac18..ed37333d 100644 --- a/irc/strings.go +++ b/irc/strings.go @@ -12,18 +12,22 @@ import ( "golang.org/x/text/secure/precis" ) +const ( + casemappingName = "rfc7613" +) + var ( errInvalidCharacter = errors.New("Invalid character") ) // Casefold returns a casefolded string, without doing any name or channel character checks. func Casefold(str string) (string, error) { - return precis.Nickname.CompareKey(str) + return precis.UsernameCaseMapped.CompareKey(str) } // CasefoldChannel returns a casefolded version of a channel name. func CasefoldChannel(name string) (string, error) { - lowered, err := precis.Nickname.CompareKey(name) + lowered, err := Casefold(name) if err != nil { return "", err @@ -47,7 +51,7 @@ func CasefoldChannel(name string) (string, error) { // CasefoldName returns a casefolded version of a nick/user name. func CasefoldName(name string) (string, error) { - lowered, err := precis.Nickname.CompareKey(name) + lowered, err := Casefold(name) if err != nil { return "", err