From 54c5d35193b683df0995e625b13221b737541978 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Sat, 10 Jul 2021 11:11:02 +0200 Subject: [PATCH 1/2] Add support for KICK #chan user1,user2 This is one of the two cases of [RFC 2812 kicks](https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.8): even when there are multiple user targets, the RFC (and Unreal and Inspircd and probably others) allows a single channel name. --- irc/handlers.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index 47f16652..697282e2 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -1273,11 +1273,12 @@ func sajoinHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo } // KICK {,} {,} [] +// The number of channels must be either 1 or equal to the number of users func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { hasPrivs := client.HasRoleCapabs("samode") channels := strings.Split(msg.Params[0], ",") users := strings.Split(msg.Params[1], ",") - if (len(channels) != len(users)) && (len(users) != 1) { + if (len(channels) != len(users)) && (len(users) != 1) && (len(channels) != 1) { rb.Add(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, "KICK", client.t("Not enough parameters")) return false } @@ -1286,16 +1287,16 @@ func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respons channel string nick string } - kicks := make([]kickCmd, 0, len(channels)) - for index, channel := range channels { + kicks := make([]kickCmd, 0, len(users)) + channel := channels[0] + for index, user := range users { + if len(channels) > 1 { + channel = channels[index] + } if channel == "" { continue // #679 } - if len(users) == 1 { - kicks = append(kicks, kickCmd{channel, users[0]}) - } else { - kicks = append(kicks, kickCmd{channel, users[index]}) - } + kicks = append(kicks, kickCmd{channel, user}) } var comment string From f58f8531b2c171cc1fec04d7ffbfb7e2a312b79c Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 10 Jul 2021 17:36:39 +0200 Subject: [PATCH 2/2] Restore support for multiple channels + single user --- irc/handlers.go | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index 697282e2..b45cd80e 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -1273,7 +1273,9 @@ func sajoinHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo } // KICK {,} {,} [] -// The number of channels must be either 1 or equal to the number of users +// RFC 2812 requires the number of channels to be either 1 or equal to +// the number of users. +// Addditionally, we support multiple channels and a single user. func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { hasPrivs := client.HasRoleCapabs("samode") channels := strings.Split(msg.Params[0], ",") @@ -1287,16 +1289,31 @@ func kickHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respons channel string nick string } - kicks := make([]kickCmd, 0, len(users)) - channel := channels[0] - for index, user := range users { - if len(channels) > 1 { - channel = channels[index] + var kicks []kickCmd + if len(users) == 1 { + kicks = make([]kickCmd, 0, len(channels)) + // Single user, possibly multiple channels + user := users[0] + for _, channel := range channels { + if channel == "" { + continue // #679 + } + kicks = append(kicks, kickCmd{channel, user}) } - if channel == "" { - continue // #679 + } else { + // Multiple users, either a single channel or as many channels + // as users. + kicks = make([]kickCmd, 0, len(users)) + channel := channels[0] + for index, user := range users { + if len(channels) > 1 { + channel = channels[index] + } + if channel == "" { + continue // #679 + } + kicks = append(kicks, kickCmd{channel, user}) } - kicks = append(kicks, kickCmd{channel, user}) } var comment string