Browse Source

be more pedantic about distinguishing skeletons and casefolds

tags/v1.1.0-rc1
Shivaram Lingamneni 5 years ago
parent
commit
8794740f89
5 changed files with 37 additions and 18 deletions
  1. 1
    1
      irc/accounts.go
  2. 9
    2
      irc/client_lookup_set.go
  3. 1
    0
      irc/errors.go
  4. 12
    14
      irc/nickname.go
  5. 14
    1
      irc/services.go

+ 1
- 1
irc/accounts.go View File

@@ -293,7 +293,7 @@ func (am *AccountManager) Register(client *Client, account string, callbackNames
293 293
 		return errAccountCreation
294 294
 	}
295 295
 
296
-	if restrictedNicknames[casefoldedAccount] || restrictedNicknames[skeleton] {
296
+	if restrictedCasefoldedNicks[casefoldedAccount] || restrictedSkeletons[skeleton] {
297 297
 		return errAccountAlreadyRegistered
298 298
 	}
299 299
 

+ 9
- 2
irc/client_lookup_set.go View File

@@ -129,13 +129,20 @@ func (clients *ClientManager) Resume(oldClient *Client, session *Session) (err e
129 129
 
130 130
 // SetNick sets a client's nickname, validating it against nicknames in use
131 131
 func (clients *ClientManager) SetNick(client *Client, session *Session, newNick string) error {
132
+	if len(newNick) > client.server.Config().Limits.NickLen {
133
+		return errNicknameInvalid
134
+	}
132 135
 	newcfnick, err := CasefoldName(newNick)
133 136
 	if err != nil {
134
-		return err
137
+		return errNicknameInvalid
135 138
 	}
136 139
 	newSkeleton, err := Skeleton(newNick)
137 140
 	if err != nil {
138
-		return err
141
+		return errNicknameInvalid
142
+	}
143
+
144
+	if restrictedCasefoldedNicks[newcfnick] || restrictedSkeletons[newSkeleton] {
145
+		return errNicknameInvalid
139 146
 	}
140 147
 
141 148
 	reservedAccount, method := client.server.accounts.EnforcementStatus(newcfnick, newSkeleton)

+ 1
- 0
irc/errors.go View File

@@ -35,6 +35,7 @@ var (
35 35
 	errInvalidChannelName             = errors.New(`Invalid channel name`)
36 36
 	errMonitorLimitExceeded           = errors.New("Monitor limit exceeded")
37 37
 	errNickMissing                    = errors.New("nick missing")
38
+	errNicknameInvalid                = errors.New("invalid nickname")
38 39
 	errNicknameInUse                  = errors.New("nickname in use")
39 40
 	errNicknameReserved               = errors.New("nickname is reserved")
40 41
 	errNoExistingBan                  = errors.New("Ban does not exist")

+ 12
- 14
irc/nickname.go View File

@@ -17,17 +17,18 @@ import (
17 17
 )
18 18
 
19 19
 var (
20
-	// anything added here MUST be skeleton'd:
21
-	restrictedNicknames = map[string]bool{
22
-		"=scene=":  true, // used for rp commands
23
-		"histserv": true, // TODO(slingamn) this should become a real service
20
+	restrictedNicknames = []string{
21
+		"=scene=",  // used for rp commands
22
+		"HistServ", // used to play back JOIN, PART, etc. to legacy clients
24 23
 	}
24
+
25
+	restrictedCasefoldedNicks = make(map[string]bool)
26
+	restrictedSkeletons       = make(map[string]bool)
25 27
 )
26 28
 
27 29
 // returns whether the change succeeded or failed
28 30
 func performNickChange(server *Server, client *Client, target *Client, session *Session, newnick string, rb *ResponseBuffer) bool {
29 31
 	nickname := strings.TrimSpace(newnick)
30
-	skeleton, err := Skeleton(nickname)
31 32
 	currentNick := client.Nick()
32 33
 
33 34
 	if len(nickname) < 1 {
@@ -35,11 +36,6 @@ func performNickChange(server *Server, client *Client, target *Client, session *
35 36
 		return false
36 37
 	}
37 38
 
38
-	if err != nil || len(nickname) > server.Config().Limits.NickLen || restrictedNicknames[skeleton] {
39
-		rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, currentNick, nickname, client.t("Erroneous nickname"))
40
-		return false
41
-	}
42
-
43 39
 	if target.Nick() == nickname {
44 40
 		return true
45 41
 	}
@@ -47,15 +43,17 @@ func performNickChange(server *Server, client *Client, target *Client, session *
47 43
 	hadNick := target.HasNick()
48 44
 	origNickMask := target.NickMaskString()
49 45
 	details := target.Details()
50
-	err = client.server.clients.SetNick(target, session, nickname)
46
+	err := client.server.clients.SetNick(target, session, nickname)
51 47
 	if err == errNicknameInUse {
52 48
 		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, nickname, client.t("Nickname is already in use"))
53
-		return false
54 49
 	} else if err == errNicknameReserved {
55 50
 		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, nickname, client.t("Nickname is reserved by a different account"))
56
-		return false
51
+	} else if err == errNicknameInvalid {
52
+		rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, currentNick, nickname, client.t("Erroneous nickname"))
57 53
 	} else if err != nil {
58 54
 		rb.Add(nil, server.name, ERR_UNKNOWNERROR, currentNick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
55
+	}
56
+	if err != nil {
59 57
 		return false
60 58
 	}
61 59
 
@@ -68,7 +66,7 @@ func performNickChange(server *Server, client *Client, target *Client, session *
68 66
 	}
69 67
 	histItem.Params[0] = nickname
70 68
 
71
-	client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s [%s]", origNickMask, nickname, skeleton))
69
+	client.server.logger.Debug("nick", fmt.Sprintf("%s changed nickname to %s [%s]", origNickMask, nickname, client.NickCasefolded()))
72 70
 	if hadNick {
73 71
 		if client == target {
74 72
 			target.server.snomasks.Send(sno.LocalNicks, fmt.Sprintf(ircfmt.Unescape("$%s$r changed nickname to %s"), details.nick, nickname))

+ 14
- 1
irc/services.go View File

@@ -260,7 +260,7 @@ func initializeServices() {
260 260
 		service.Commands["help"] = &servHelpCmd
261 261
 
262 262
 		// reserve the nickname
263
-		restrictedNicknames[serviceName] = true
263
+		restrictedNicknames = append(restrictedNicknames, service.Name)
264 264
 
265 265
 		// register the protocol-level commands (NICKSERV, NS) that talk to the service
266 266
 		var ircCmdDef Command
@@ -279,4 +279,17 @@ func initializeServices() {
279 279
 			}
280 280
 		}
281 281
 	}
282
+
283
+	for _, restrictedNickname := range restrictedNicknames {
284
+		cfName, err := CasefoldName(restrictedNickname)
285
+		if err != nil {
286
+			panic(err)
287
+		}
288
+		restrictedCasefoldedNicks[cfName] = true
289
+		skeleton, err := Skeleton(restrictedNickname)
290
+		if err != nil {
291
+			panic(err)
292
+		}
293
+		restrictedSkeletons[skeleton] = true
294
+	}
282 295
 }

Loading…
Cancel
Save