Browse Source

Merge pull request #444 from slingamn/issue300.1

fix #300
tags/v1.1.0-rc1
Daniel Oaks 5 years ago
parent
commit
64bf4a10c6
No account linked to committer's email address
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
 	errCallbackFailed                 = errors.New("Account verification could not be sent")
28
 	errCallbackFailed                 = errors.New("Account verification could not be sent")
29
 	errCertfpAlreadyExists            = errors.New(`An account already exists for your certificate fingerprint`)
29
 	errCertfpAlreadyExists            = errors.New(`An account already exists for your certificate fingerprint`)
30
 	errChannelAlreadyRegistered       = errors.New("Channel is already registered")
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
 	errMonitorLimitExceeded           = errors.New("Monitor limit exceeded")
33
 	errMonitorLimitExceeded           = errors.New("Monitor limit exceeded")
34
 	errNickMissing                    = errors.New("nick missing")
34
 	errNickMissing                    = errors.New("nick missing")
35
 	errNicknameInUse                  = errors.New("nickname in use")
35
 	errNicknameInUse                  = errors.New("nickname in use")
36
 	errNicknameReserved               = errors.New("nickname is reserved")
36
 	errNicknameReserved               = errors.New("nickname is reserved")
37
 	errNoExistingBan                  = errors.New("Ban does not exist")
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
 	errInsufficientPrivs              = errors.New("Insufficient privileges")
40
 	errInsufficientPrivs              = errors.New("Insufficient privileges")
41
 	errSaslFail                       = errors.New("SASL failed")
41
 	errSaslFail                       = errors.New("SASL failed")
42
 	errResumeTokenAlreadySet          = errors.New("Client was already assigned a resume token")
42
 	errResumeTokenAlreadySet          = errors.New("Client was already assigned a resume token")

+ 42
- 46
irc/handlers.go View File

2208
 // RENAME <oldchan> <newchan> [<reason>]
2208
 // RENAME <oldchan> <newchan> [<reason>]
2209
 func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) (result bool) {
2209
 func renameHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) (result bool) {
2210
 	result = false
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
 	if 2 < len(msg.Params) {
2216
 	if 2 < len(msg.Params) {
2244
 		reason = msg.Params[2]
2217
 		reason = msg.Params[2]
2245
 	}
2218
 	}
2246
 
2219
 
2247
 	channel := server.channels.Get(oldName)
2220
 	channel := server.channels.Get(oldName)
2248
 	if channel == nil {
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
 	founder := channel.Founder()
2231
 	founder := channel.Founder()
2259
 	if founder != "" && founder != client.Account() {
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
 		return false
2234
 		return false
2263
 	}
2235
 	}
2264
 
2236
 
2265
 	// perform the channel rename
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
 	if err != nil {
2246
 	if err != nil {
2268
-		errorResponse(err, newName)
2269
-		return
2247
+		return false
2270
 	}
2248
 	}
2271
 
2249
 
2272
 	// rename succeeded, persist it
2250
 	// rename succeeded, persist it
2274
 
2252
 
2275
 	// send RENAME messages
2253
 	// send RENAME messages
2276
 	for _, mcl := range channel.Members() {
2254
 	for _, mcl := range channel.Members() {
2255
+		targetRb := rb
2256
+		if mcl != client {
2257
+			targetRb = NewResponseBuffer(mcl)
2258
+		}
2259
+		prefix := mcl.NickMaskString()
2277
 		if mcl.capabilities.Has(caps.Rename) {
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
 		} else {
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
 			if mcl.capabilities.Has(caps.ExtendedJoin) {
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
 			} else {
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
 	RPL_WHOISSECURE                 = "671"
165
 	RPL_WHOISSECURE                 = "671"
166
 	RPL_YOURLANGUAGESARE            = "687"
166
 	RPL_YOURLANGUAGESARE            = "687"
167
 	RPL_WHOISLANGUAGE               = "690"
167
 	RPL_WHOISLANGUAGE               = "690"
168
+	ERR_CHANNAMEINUSE               = "692"
169
+	ERR_CANNOTRENAME                = "693"
168
 	RPL_HELPSTART                   = "704"
170
 	RPL_HELPSTART                   = "704"
169
 	RPL_HELPTXT                     = "705"
171
 	RPL_HELPTXT                     = "705"
170
 	RPL_ENDOFHELP                   = "706"
172
 	RPL_ENDOFHELP                   = "706"

Loading…
Cancel
Save