Browse Source

fix #300

Also upgrade RENAME to latest draft specification
tags/v1.1.0-rc1
Shivaram Lingamneni 5 years ago
parent
commit
713df3a34d
3 changed files with 48 additions and 50 deletions
  1. 4
    4
      irc/errors.go
  2. 42
    46
      irc/handlers.go
  3. 2
    0
      irc/numerics.go

+ 4
- 4
irc/errors.go View File

@@ -28,15 +28,15 @@ var (
28 28
 	errCallbackFailed                 = errors.New("Account verification could not be sent")
29 29
 	errCertfpAlreadyExists            = errors.New(`An account already exists for your certificate fingerprint`)
30 30
 	errChannelAlreadyRegistered       = errors.New("Channel is already registered")
31
-	errChannelNameInUse               = errors.New("Channel name in use")
32
-	errInvalidChannelName             = errors.New("Invalid channel name")
31
+	errChannelNameInUse               = errors.New(`Channel name in use`)
32
+	errInvalidChannelName             = errors.New(`Invalid channel name`)
33 33
 	errMonitorLimitExceeded           = errors.New("Monitor limit exceeded")
34 34
 	errNickMissing                    = errors.New("nick missing")
35 35
 	errNicknameInUse                  = errors.New("nickname in use")
36 36
 	errNicknameReserved               = errors.New("nickname is reserved")
37 37
 	errNoExistingBan                  = errors.New("Ban does not exist")
38
-	errNoSuchChannel                  = errors.New("No such channel")
39
-	errRenamePrivsNeeded              = errors.New("Only chanops can rename channels")
38
+	errNoSuchChannel                  = errors.New(`No such channel`)
39
+	errRenamePrivsNeeded              = errors.New(`Only chanops can rename channels`)
40 40
 	errInsufficientPrivs              = errors.New("Insufficient privileges")
41 41
 	errSaslFail                       = errors.New("SASL failed")
42 42
 	errResumeTokenAlreadySet          = errors.New("Client was already assigned a resume token")

+ 42
- 46
irc/handlers.go View File

@@ -2208,65 +2208,43 @@ func rehashHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
2208 2208
 // RENAME <oldchan> <newchan> [<reason>]
2209 2209
 func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) (result bool) {
2210 2210
 	result = false
2211
-
2212
-	errorResponse := func(err error, name string) {
2213
-		// TODO: send correct error codes, e.g., ERR_CANNOTRENAME, ERR_CHANNAMEINUSE
2214
-		var code string
2215
-		switch err {
2216
-		case errNoSuchChannel:
2217
-			code = ERR_NOSUCHCHANNEL
2218
-		case errRenamePrivsNeeded:
2219
-			code = ERR_CHANOPRIVSNEEDED
2220
-		case errInvalidChannelName:
2221
-			code = ERR_UNKNOWNERROR
2222
-		case errChannelNameInUse:
2223
-			code = ERR_UNKNOWNERROR
2224
-		default:
2225
-			code = ERR_UNKNOWNERROR
2226
-		}
2227
-		rb.Add(nil, server.name, code, client.Nick(), "RENAME", name, err.Error())
2228
-	}
2229
-
2230
-	oldName := strings.TrimSpace(msg.Params[0])
2231
-	newName := strings.TrimSpace(msg.Params[1])
2232
-	if oldName == "" || newName == "" {
2233
-		errorResponse(errInvalidChannelName, "<empty>")
2234
-		return
2235
-	}
2236
-	casefoldedOldName, err := CasefoldChannel(oldName)
2237
-	if err != nil {
2238
-		errorResponse(errInvalidChannelName, oldName)
2239
-		return
2211
+	oldName, newName := msg.Params[0], msg.Params[1]
2212
+	if newName == "" {
2213
+		newName = "<empty>" // intentionally invalid channel name, will error as expected
2240 2214
 	}
2241
-
2242
-	reason := "No reason"
2215
+	var reason string
2243 2216
 	if 2 < len(msg.Params) {
2244 2217
 		reason = msg.Params[2]
2245 2218
 	}
2246 2219
 
2247 2220
 	channel := server.channels.Get(oldName)
2248 2221
 	if channel == nil {
2249
-		errorResponse(errNoSuchChannel, oldName)
2250
-		return
2222
+		rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), oldName, client.t("No such channel"))
2223
+		return false
2251 2224
 	}
2252
-	//TODO(dan): allow IRCops to do this?
2253
-	if !channel.ClientIsAtLeast(client, modes.Operator) {
2254
-		errorResponse(errRenamePrivsNeeded, oldName)
2255
-		return
2225
+	casefoldedOldName := channel.NameCasefolded()
2226
+	if !(channel.ClientIsAtLeast(client, modes.Operator) || client.HasRoleCapabs("chanreg")) {
2227
+		rb.Add(nil, server.name, ERR_CHANOPRIVSNEEDED, client.Nick(), oldName, client.t("You're not a channel operator"))
2228
+		return false
2256 2229
 	}
2257 2230
 
2258 2231
 	founder := channel.Founder()
2259 2232
 	if founder != "" && founder != client.Account() {
2260
-		//TODO(dan): Change this to ERR_CANNOTRENAME
2261
-		rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.nick, "RENAME", oldName, client.t("Only channel founders can change registered channels"))
2233
+		rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Only channel founders can change registered channels"))
2262 2234
 		return false
2263 2235
 	}
2264 2236
 
2265 2237
 	// perform the channel rename
2266
-	err = server.channels.Rename(oldName, newName)
2238
+	err := server.channels.Rename(oldName, newName)
2239
+	if err == errInvalidChannelName {
2240
+		rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), newName, client.t(err.Error()))
2241
+	} else if err == errChannelNameInUse {
2242
+		rb.Add(nil, server.name, ERR_CHANNAMEINUSE, client.Nick(), newName, client.t(err.Error()))
2243
+	} else if err != nil {
2244
+		rb.Add(nil, server.name, ERR_CANNOTRENAME, client.Nick(), oldName, newName, client.t("Cannot rename channel"))
2245
+	}
2267 2246
 	if err != nil {
2268
-		errorResponse(err, newName)
2269
-		return
2247
+		return false
2270 2248
 	}
2271 2249
 
2272 2250
 	// rename succeeded, persist it
@@ -2274,15 +2252,33 @@ func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
2274 2252
 
2275 2253
 	// send RENAME messages
2276 2254
 	for _, mcl := range channel.Members() {
2255
+		targetRb := rb
2256
+		if mcl != client {
2257
+			targetRb = NewResponseBuffer(mcl)
2258
+		}
2259
+		prefix := mcl.NickMaskString()
2277 2260
 		if mcl.capabilities.Has(caps.Rename) {
2278
-			mcl.Send(nil, client.nickMaskString, "RENAME", oldName, newName, reason)
2261
+			if reason != "" {
2262
+				targetRb.Add(nil, prefix, "RENAME", oldName, newName, reason)
2263
+			} else {
2264
+				targetRb.Add(nil, prefix, "RENAME", oldName, newName)
2265
+			}
2279 2266
 		} else {
2280
-			mcl.Send(nil, mcl.nickMaskString, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed: %s"), reason))
2267
+			if reason != "" {
2268
+				targetRb.Add(nil, prefix, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed: %s"), reason))
2269
+			} else {
2270
+				targetRb.Add(nil, prefix, "PART", oldName, fmt.Sprintf(mcl.t("Channel renamed")))
2271
+			}
2281 2272
 			if mcl.capabilities.Has(caps.ExtendedJoin) {
2282
-				mcl.Send(nil, mcl.nickMaskString, "JOIN", newName, mcl.AccountName(), mcl.realname)
2273
+				targetRb.Add(nil, prefix, "JOIN", newName, mcl.AccountName(), mcl.Realname())
2283 2274
 			} else {
2284
-				mcl.Send(nil, mcl.nickMaskString, "JOIN", newName)
2275
+				targetRb.Add(nil, prefix, "JOIN", newName)
2285 2276
 			}
2277
+			channel.SendTopic(mcl, targetRb, false)
2278
+			channel.Names(mcl, targetRb)
2279
+		}
2280
+		if mcl != client {
2281
+			targetRb.Send(false)
2286 2282
 		}
2287 2283
 	}
2288 2284
 

+ 2
- 0
irc/numerics.go View File

@@ -165,6 +165,8 @@ const (
165 165
 	RPL_WHOISSECURE                 = "671"
166 166
 	RPL_YOURLANGUAGESARE            = "687"
167 167
 	RPL_WHOISLANGUAGE               = "690"
168
+	ERR_CHANNAMEINUSE               = "692"
169
+	ERR_CANNOTRENAME                = "693"
168 170
 	RPL_HELPSTART                   = "704"
169 171
 	RPL_HELPTXT                     = "705"
170 172
 	RPL_ENDOFHELP                   = "706"

Loading…
Cancel
Save