From f6d5fe812fa360e97c5098a114b926ec193529e2 Mon Sep 17 00:00:00 2001 From: Hubert Hirtz Date: Tue, 4 Aug 2020 16:13:29 +0200 Subject: [PATCH] Update draft/rename implementation Link to the new draft PR: Changes in the spec: - Use standard replies instead of numerics: - Allow RENAME to a different case: This commit makes oragono send the PART-JOIN fallback even on case-only changes. This is so that clients don't have to worry about oragono's UTF8 casefolding. See the following comments for further info: Misc fixes: - Remove unused variable, - Add missing calls to utils.SafeErrorParam, - Don't fill replies with the user-provided "oldName", for the same reason as sending the PART-JOIN fallback. --- irc/channelmanager.go | 8 ++++++++ irc/getters.go | 8 +++++--- irc/handlers.go | 13 +++++++------ irc/numerics.go | 2 -- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/irc/channelmanager.go b/irc/channelmanager.go index 19430d41..e619e1f1 100644 --- a/irc/channelmanager.go +++ b/irc/channelmanager.go @@ -287,6 +287,14 @@ func (cm *ChannelManager) Rename(name string, newName string) (err error) { cm.Lock() defer cm.Unlock() + if newCfname == cfname { + entry := cm.chans[cfname] + if entry == nil || !entry.channel.IsLoaded() { + return errNoSuchChannel + } + entry.channel.Rename(newName, cfname) + return nil + } if cm.chans[newCfname] != nil || cm.registeredChannels.Has(newCfname) { return errChannelNameInUse } diff --git a/irc/getters.go b/irc/getters.go index dd619a32..6658ff2d 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -453,9 +453,11 @@ func (channel *Channel) NameCasefolded() string { func (channel *Channel) Rename(name, nameCasefolded string) { channel.stateMutex.Lock() channel.name = name - channel.nameCasefolded = nameCasefolded - if channel.registeredFounder != "" { - channel.registeredTime = time.Now().UTC() + if channel.nameCasefolded != nameCasefolded { + channel.nameCasefolded = nameCasefolded + if channel.registeredFounder != "" { + channel.registeredTime = time.Now().UTC() + } } channel.stateMutex.Unlock() } diff --git a/irc/handlers.go b/irc/handlers.go index 5bcf027f..45160115 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2421,8 +2421,7 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re } // RENAME [] -func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) (result bool) { - result = false +func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool { oldName, newName := msg.Params[0], msg.Params[1] var reason string if 2 < len(msg.Params) { @@ -2434,6 +2433,8 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), utils.SafeErrorParam(oldName), client.t("No such channel")) return false } + oldName = channel.Name() + if !(channel.ClientIsAtLeast(client, modes.ChannelOperator) || client.HasRoleCapabs("chanreg")) { rb.Add(nil, server.name, ERR_CHANOPRIVSNEEDED, client.Nick(), oldName, client.t("You're not a channel operator")) return false @@ -2441,14 +2442,14 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re founder := channel.Founder() if founder != "" && founder != client.Account() { - rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Only channel founders can change registered channels")) + rb.Add(nil, server.name, "FAIL", "RENAME", "CANNOT_RENAME", oldName, utils.SafeErrorParam(newName), client.t("Only channel founders can change registered channels")) return false } config := server.Config() status, _ := channel.historyStatus(config) if status == HistoryPersistent { - rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Channels with persistent history cannot be renamed")) + rb.Add(nil, server.name, "FAIL", "RENAME", "CANNOT_RENAME", oldName, utils.SafeErrorParam(newName), client.t("Channels with persistent history cannot be renamed")) return false } @@ -2457,9 +2458,9 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re if err == errInvalidChannelName { rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), utils.SafeErrorParam(newName), client.t(err.Error())) } else if err == errChannelNameInUse { - rb.Add(nil, server.name, ERR_CHANNAMEINUSE, client.Nick(), utils.SafeErrorParam(newName), client.t(err.Error())) + rb.Add(nil, server.name, "FAIL", "RENAME", "CHANNEL_NAME_IN_USE", oldName, utils.SafeErrorParam(newName), client.t(err.Error())) } else if err != nil { - rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, utils.SafeErrorParam(newName), client.t("Cannot rename channel")) + rb.Add(nil, server.name, "FAIL", "RENAME", "CANNOT_RENAME", oldName, utils.SafeErrorParam(newName), client.t("Cannot rename channel")) } if err != nil { return false diff --git a/irc/numerics.go b/irc/numerics.go index 76ad9397..951653df 100644 --- a/irc/numerics.go +++ b/irc/numerics.go @@ -168,8 +168,6 @@ const ( ERR_CANNOTSENDRP = "573" RPL_WHOISSECURE = "671" RPL_YOURLANGUAGESARE = "687" - ERR_CHANNAMEINUSE = "692" - ERR_CANNOTRENAME = "693" ERR_INVALIDMODEPARAM = "696" ERR_LISTMODEALREADYSET = "697" ERR_LISTMODENOTSET = "698"