X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;h=00aafe05a170102a3e22053af73861b50b14e112;hp=8d001a825c013e8c77e339f5915a54eac792b6fa;hb=32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc;hpb=f37600ee01f6cfd86e8fa80f77ee26ebaf3012b2 diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 8d001a82..00aafe05 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -327,6 +327,18 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name, } if(Client_Type(Peer) == CLIENT_USER) { + /* Channel mode 'Q' and user mode 'q' on target: nobody but + * IRC Operators and servers can kick the target user */ + if ((strchr(Channel_Modes(chan), 'Q') + || Client_HasMode(Target, 'q') + || Client_Type(Target) == CLIENT_SERVICE) + && !Client_HasMode(Origin, 'o')) { + IRC_WriteStrClient(Origin, ERR_KICKDENY_MSG, + Client_ID(Origin), Name, + Client_ID(Target)); + return; + } + /* Check if client has the rights to kick target */ ptr = Channel_UserModes(chan, Peer); target_modes = Channel_UserModes(chan, Target); @@ -362,9 +374,9 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name, } ptr++; } - + if(!can_kick) { - IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOLOW_MSG, + IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG, Client_ID(Origin), Name); return; } @@ -906,7 +918,11 @@ Channel_Write(CHANNEL *Chan, CLIENT *From, CLIENT *Client, const char *Command, if (!Can_Send_To_Channel(Chan, From)) { if (! SendErrors) return CONNECTED; /* no error, see RFC 2812 */ - return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG, + if (strchr(Channel_Modes(Chan), 'M')) + return IRC_WriteStrClient(From, ERR_NEEDREGGEDNICK_MSG, + Client_ID(From), Channel_Name(Chan)); + else + return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID(From), Channel_Name(Chan)); }