Reject downstream NICK with illegal characters

This should avoid confusion when mixing up nickname and user name.
Also it avoid breaking downstreams (since '@' and '!' are used for host
masks).
This commit is contained in:
Hubert Hirtz 2020-08-20 10:00:58 +02:00 committed by Simon Ser
parent d957493348
commit e740d952ad
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48

View file

@ -57,6 +57,8 @@ var errAuthFailed = ircError{&irc.Message{
Params: []string{"*", "Invalid username or password"},
}}
const illegalNickChars = " :/@!*?"
// permanentDownstreamCaps is the list of always-supported downstream
// capabilities.
var permanentDownstreamCaps = map[string]string{
@ -330,6 +332,12 @@ func (dc *downstreamConn) handleMessageUnregistered(msg *irc.Message) error {
if err := parseMessageParams(msg, &nick); err != nil {
return err
}
if strings.ContainsAny(nick, illegalNickChars) {
return ircError{&irc.Message{
Command: irc.ERR_ERRONEUSNICKNAME,
Params: []string{dc.nick, nick, "contains illegal characters"},
}}
}
if nick == serviceNick {
return ircError{&irc.Message{
Command: irc.ERR_NICKNAMEINUSE,
@ -971,6 +979,13 @@ func (dc *downstreamConn) handleMessageRegistered(msg *irc.Message) error {
}
}
if strings.ContainsAny(nick, illegalNickChars) {
return ircError{&irc.Message{
Command: irc.ERR_ERRONEUSNICKNAME,
Params: []string{dc.nick, nick, "contains illegal characters"},
}}
}
var err error
dc.forEachNetwork(func(n *network) {
if err != nil || (upstream != nil && upstream.network != n) {