Browse Source

fix analogous invalid parameters for ERR_NOSUCHNICK

tags/v2.0.0-rc1
Shivaram Lingamneni 4 years ago
parent
commit
0880f20f4b
4 changed files with 28 additions and 35 deletions
  1. 3
    4
      irc/channel.go
  2. 18
    27
      irc/handlers.go
  3. 1
    1
      irc/nickname.go
  4. 6
    3
      irc/types.go

+ 3
- 4
irc/channel.go View File

1048
 }
1048
 }
1049
 
1049
 
1050
 func (channel *Channel) applyModeToMember(client *Client, mode modes.Mode, op modes.ModeOp, nick string, rb *ResponseBuffer) (result *modes.ModeChange) {
1050
 func (channel *Channel) applyModeToMember(client *Client, mode modes.Mode, op modes.ModeOp, nick string, rb *ResponseBuffer) (result *modes.ModeChange) {
1051
-	casefoldedName, err := CasefoldName(nick)
1052
-	target := channel.server.clients.Get(casefoldedName)
1053
-	if err != nil || target == nil {
1054
-		rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.Nick(), nick, client.t("No such nick"))
1051
+	target := channel.server.clients.Get(nick)
1052
+	if target == nil {
1053
+		rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.Nick(), utils.SafeErrorParam(nick), client.t("No such nick"))
1055
 		return nil
1054
 		return nil
1056
 	}
1055
 	}
1057
 
1056
 

+ 18
- 27
irc/handlers.go View File

1228
 	nickname := msg.Params[0]
1228
 	nickname := msg.Params[0]
1229
 	channelName := msg.Params[1]
1229
 	channelName := msg.Params[1]
1230
 
1230
 
1231
-	casefoldedNickname, err := CasefoldName(nickname)
1232
-	target := server.clients.Get(casefoldedNickname)
1233
-	if err != nil || target == nil {
1234
-		rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick"))
1231
+	target := server.clients.Get(nickname)
1232
+	if target == nil {
1233
+		rb.Add(nil, server.name, ERR_NOSUCHNICK, client.Nick(), utils.SafeErrorParam(nickname), client.t("No such nick"))
1235
 		return false
1234
 		return false
1236
 	}
1235
 	}
1237
 
1236
 
1313
 		} else {
1312
 		} else {
1314
 			target = server.clients.Get(msg.Params[0])
1313
 			target = server.clients.Get(msg.Params[0])
1315
 			if target == nil {
1314
 			if target == nil {
1316
-				rb.Add(nil, server.name, ERR_NOSUCHNICK, client.Nick(), msg.Params[0], "No such nick")
1315
+				rb.Add(nil, server.name, ERR_NOSUCHNICK, client.Nick(), utils.SafeErrorParam(msg.Params[0]), "No such nick")
1317
 				return false
1316
 				return false
1318
 			}
1317
 			}
1319
 			channelString = msg.Params[1]
1318
 			channelString = msg.Params[1]
1385
 		comment = msg.Params[1]
1384
 		comment = msg.Params[1]
1386
 	}
1385
 	}
1387
 
1386
 
1388
-	casefoldedNickname, err := CasefoldName(nickname)
1389
-	target := server.clients.Get(casefoldedNickname)
1390
-	if err != nil || target == nil {
1391
-		rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick"))
1387
+	target := server.clients.Get(nickname)
1388
+	if target == nil {
1389
+		rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, utils.SafeErrorParam(nickname), client.t("No such nick"))
1392
 		return false
1390
 		return false
1393
 	}
1391
 	}
1394
 
1392
 
2564
 
2562
 
2565
 // USERHOST <nickname>{ <nickname>}
2563
 // USERHOST <nickname>{ <nickname>}
2566
 func userhostHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2564
 func userhostHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2567
-	returnedNicks := make(map[string]bool)
2565
+	returnedClients := make(ClientSet)
2568
 
2566
 
2569
 	for i, nickname := range msg.Params {
2567
 	for i, nickname := range msg.Params {
2570
 		if i >= 10 {
2568
 		if i >= 10 {
2571
 			break
2569
 			break
2572
 		}
2570
 		}
2573
 
2571
 
2574
-		casefoldedNickname, err := CasefoldName(nickname)
2575
-		target := server.clients.Get(casefoldedNickname)
2576
-		if err != nil || target == nil {
2577
-			rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, nickname, client.t("No such nick"))
2578
-			return false
2579
-		}
2580
-		if returnedNicks[casefoldedNickname] {
2572
+		target := server.clients.Get(nickname)
2573
+		if target == nil {
2574
+			rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, utils.SafeErrorParam(nickname), client.t("No such nick"))
2581
 			continue
2575
 			continue
2582
 		}
2576
 		}
2583
-
2584
 		// to prevent returning multiple results for a single nick
2577
 		// to prevent returning multiple results for a single nick
2585
-		returnedNicks[casefoldedNickname] = true
2578
+		if returnedClients.Has(target) {
2579
+			continue
2580
+		}
2581
+		returnedClients.Add(target)
2586
 
2582
 
2587
 		var isOper, isAway string
2583
 		var isOper, isAway string
2588
 
2584
 
2730
 		masksString = msg.Params[0]
2726
 		masksString = msg.Params[0]
2731
 	}
2727
 	}
2732
 
2728
 
2733
-	if len(strings.TrimSpace(masksString)) < 1 {
2734
-		rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.nick, msg.Command, client.t("No masks given"))
2735
-		return false
2736
-	}
2737
-
2738
 	handleService := func(nick string) bool {
2729
 	handleService := func(nick string) bool {
2739
 		cfnick, _ := CasefoldName(nick)
2730
 		cfnick, _ := CasefoldName(nick)
2740
 		service, ok := OragonoServices[cfnick]
2731
 		service, ok := OragonoServices[cfnick]
2754
 		for _, mask := range strings.Split(masksString, ",") {
2745
 		for _, mask := range strings.Split(masksString, ",") {
2755
 			matches := server.clients.FindAll(mask)
2746
 			matches := server.clients.FindAll(mask)
2756
 			if len(matches) == 0 && !handleService(mask) {
2747
 			if len(matches) == 0 && !handleService(mask) {
2757
-				rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, mask, client.t("No such nick"))
2748
+				rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.Nick(), utils.SafeErrorParam(mask), client.t("No such nick"))
2758
 				continue
2749
 				continue
2759
 			}
2750
 			}
2760
 			for mclient := range matches {
2751
 			for mclient := range matches {
2768
 		if mclient != nil {
2759
 		if mclient != nil {
2769
 			client.getWhoisOf(mclient, rb)
2760
 			client.getWhoisOf(mclient, rb)
2770
 		} else if !handleService(nick) {
2761
 		} else if !handleService(nick) {
2771
-			rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.nick, masksString, client.t("No such nick"))
2762
+			rb.Add(nil, client.server.name, ERR_NOSUCHNICK, client.Nick(), utils.SafeErrorParam(masksString), client.t("No such nick"))
2772
 		}
2763
 		}
2773
 		// fall through, ENDOFWHOIS is always sent
2764
 		// fall through, ENDOFWHOIS is always sent
2774
 	}
2765
 	}
2775
-	rb.Add(nil, server.name, RPL_ENDOFWHOIS, client.nick, masksString, client.t("End of /WHOIS list"))
2766
+	rb.Add(nil, server.name, RPL_ENDOFWHOIS, client.nick, utils.SafeErrorParam(masksString), client.t("End of /WHOIS list"))
2776
 	return false
2767
 	return false
2777
 }
2768
 }
2778
 
2769
 

+ 1
- 1
irc/nickname.go View File

49
 	} else if err == errNicknameReserved {
49
 	} else if err == errNicknameReserved {
50
 		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, nickname, client.t("Nickname is reserved by a different account"))
50
 		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, nickname, client.t("Nickname is reserved by a different account"))
51
 	} else if err == errNicknameInvalid {
51
 	} else if err == errNicknameInvalid {
52
-		rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, currentNick, nickname, client.t("Erroneous nickname"))
52
+		rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, currentNick, utils.SafeErrorParam(nickname), client.t("Erroneous nickname"))
53
 	} else if err != nil {
53
 	} else if err != nil {
54
 		rb.Add(nil, server.name, ERR_UNKNOWNERROR, currentNick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
54
 		rb.Add(nil, server.name, ERR_UNKNOWNERROR, currentNick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
55
 	}
55
 	}

+ 6
- 3
irc/types.go View File

7
 
7
 
8
 import "github.com/oragono/oragono/irc/modes"
8
 import "github.com/oragono/oragono/irc/modes"
9
 
9
 
10
+type empty struct{}
11
+
10
 // ClientSet is a set of clients.
12
 // ClientSet is a set of clients.
11
-type ClientSet map[*Client]bool
13
+type ClientSet map[*Client]empty
12
 
14
 
13
 // Add adds the given client to this set.
15
 // Add adds the given client to this set.
14
 func (clients ClientSet) Add(client *Client) {
16
 func (clients ClientSet) Add(client *Client) {
15
-	clients[client] = true
17
+	clients[client] = empty{}
16
 }
18
 }
17
 
19
 
18
 // Remove removes the given client from this set.
20
 // Remove removes the given client from this set.
22
 
24
 
23
 // Has returns true if the given client is in this set.
25
 // Has returns true if the given client is in this set.
24
 func (clients ClientSet) Has(client *Client) bool {
26
 func (clients ClientSet) Has(client *Client) bool {
25
-	return clients[client]
27
+	_, ok := clients[client]
28
+	return ok
26
 }
29
 }
27
 
30
 
28
 // MemberSet is a set of members with modes.
31
 // MemberSet is a set of members with modes.

Loading…
Cancel
Save