Browse Source

fix #1277

tags/v2.4.0-rc1
Shivaram Lingamneni 3 years ago
parent
commit
7d5a071a34
2 changed files with 39 additions and 10 deletions
  1. 2
    2
      irc/handlers.go
  2. 37
    8
      irc/nickname.go

+ 2
- 2
irc/handlers.go View File

2594
 
2594
 
2595
 // SANICK <oldnick> <nickname>
2595
 // SANICK <oldnick> <nickname>
2596
 func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2596
 func sanickHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2597
-	targetNick := strings.TrimSpace(msg.Params[0])
2597
+	targetNick := msg.Params[0]
2598
 	target := server.clients.Get(targetNick)
2598
 	target := server.clients.Get(targetNick)
2599
 	if target == nil {
2599
 	if target == nil {
2600
-		rb.Add(nil, server.name, ERR_NOSUCHNICK, client.nick, msg.Params[0], client.t("No such nick"))
2600
+		rb.Add(nil, server.name, "FAIL", "SANICK", "NO_SUCH_NICKNAME", utils.SafeErrorParam(targetNick), client.t("No such nick"))
2601
 		return false
2601
 		return false
2602
 	}
2602
 	}
2603
 	performNickChange(server, client, target, nil, msg.Params[1], rb)
2603
 	performNickChange(server, client, target, nil, msg.Params[1], rb)

+ 37
- 8
irc/nickname.go View File

28
 )
28
 )
29
 
29
 
30
 func performNickChange(server *Server, client *Client, target *Client, session *Session, nickname string, rb *ResponseBuffer) error {
30
 func performNickChange(server *Server, client *Client, target *Client, session *Session, nickname string, rb *ResponseBuffer) error {
31
-	currentNick := client.Nick()
32
 	details := target.Details()
31
 	details := target.Details()
33
 	hadNick := details.nick != "*"
32
 	hadNick := details.nick != "*"
34
 	origNickMask := details.nickMask
33
 	origNickMask := details.nickMask
34
+	isSanick := client != target
35
 
35
 
36
 	assignedNickname, err, back := client.server.clients.SetNick(target, session, nickname)
36
 	assignedNickname, err, back := client.server.clients.SetNick(target, session, nickname)
37
 	if err == errNicknameInUse {
37
 	if err == errNicknameInUse {
38
-		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, utils.SafeErrorParam(nickname), client.t("Nickname is already in use"))
38
+		if !isSanick {
39
+			rb.Add(nil, server.name, ERR_NICKNAMEINUSE, details.nick, utils.SafeErrorParam(nickname), client.t("Nickname is already in use"))
40
+		} else {
41
+			rb.Add(nil, server.name, "FAIL", "SANICK", "NICKNAME_IN_USE", utils.SafeErrorParam(nickname), client.t("Nickname is already in use"))
42
+		}
39
 	} else if err == errNicknameReserved {
43
 	} else if err == errNicknameReserved {
40
-		rb.Add(nil, server.name, ERR_NICKNAMEINUSE, currentNick, utils.SafeErrorParam(nickname), client.t("Nickname is reserved by a different account"))
44
+		if !isSanick {
45
+			rb.Add(nil, server.name, ERR_NICKNAMEINUSE, details.nick, utils.SafeErrorParam(nickname), client.t("Nickname is reserved by a different account"))
46
+		} else {
47
+			rb.Add(nil, server.name, "FAIL", "SANICK", "NICKNAME_RESERVED", utils.SafeErrorParam(nickname), client.t("Nickname is reserved by a different account"))
48
+		}
41
 	} else if err == errNicknameInvalid {
49
 	} else if err == errNicknameInvalid {
42
-		rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, currentNick, utils.SafeErrorParam(nickname), client.t("Erroneous nickname"))
50
+		if !isSanick {
51
+			rb.Add(nil, server.name, ERR_ERRONEUSNICKNAME, details.nick, utils.SafeErrorParam(nickname), client.t("Erroneous nickname"))
52
+		} else {
53
+			rb.Add(nil, server.name, "FAIL", "SANICK", "NICKNAME_INVALID", utils.SafeErrorParam(nickname), client.t("Erroneous nickname"))
54
+		}
43
 	} else if err == errNickAccountMismatch {
55
 	} else if err == errNickAccountMismatch {
44
 		// this used to use ERR_NICKNAMEINUSE, but it displayed poorly in some clients;
56
 		// this used to use ERR_NICKNAMEINUSE, but it displayed poorly in some clients;
45
 		// ERR_UNKNOWNERROR at least has a better chance of displaying our error text
57
 		// ERR_UNKNOWNERROR at least has a better chance of displaying our error text
46
-		rb.Add(nil, server.name, ERR_UNKNOWNERROR, currentNick, "NICK", client.t("You must use your account name as your nickname"))
58
+		if !isSanick {
59
+			rb.Add(nil, server.name, ERR_UNKNOWNERROR, details.nick, "NICK", client.t("You must use your account name as your nickname"))
60
+		} else {
61
+			rb.Add(nil, server.name, "FAIL", "SANICK", "UNKNOWN_ERROR", utils.SafeErrorParam(nickname), client.t("This user's nickname and account name need to be equal"))
62
+		}
47
 	} else if err == errNickMissing {
63
 	} else if err == errNickMissing {
48
-		rb.Add(nil, server.name, ERR_NONICKNAMEGIVEN, currentNick, client.t("No nickname given"))
64
+		if !isSanick {
65
+			rb.Add(nil, server.name, ERR_NONICKNAMEGIVEN, details.nick, client.t("No nickname given"))
66
+		} else {
67
+			rb.Add(nil, server.name, "FAIL", "SANICK", "NICKNAME_INVALID", utils.SafeErrorParam(nickname), client.t("No nickname given"))
68
+		}
49
 	} else if err == errNoop {
69
 	} else if err == errNoop {
50
-		// no message
70
+		if !isSanick {
71
+			// no message
72
+		} else {
73
+			rb.Add(nil, server.name, "NOTE", "SANICK", "NOOP", utils.SafeErrorParam(nickname), client.t("Client already had the desired nickname"))
74
+		}
51
 	} else if err != nil {
75
 	} else if err != nil {
52
-		rb.Add(nil, server.name, ERR_UNKNOWNERROR, currentNick, "NICK", fmt.Sprintf(client.t("Could not set or change nickname: %s"), err.Error()))
76
+		client.server.logger.Error("internal", "couldn't change nick", nickname, err.Error())
77
+		if !isSanick {
78
+			rb.Add(nil, server.name, ERR_UNKNOWNERROR, details.nick, "NICK", client.t("Could not set or change nickname"))
79
+		} else {
80
+			rb.Add(nil, server.name, "FAIL", "SANICK", "UNKNOWN_ERROR", utils.SafeErrorParam(nickname), client.t("Could not set or change nickname"))
81
+		}
53
 	}
82
 	}
54
 	if err != nil {
83
 	if err != nil {
55
 		return err
84
 		return err

Loading…
Cancel
Save