]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/channel.c
Make the maximum /list reply length a configurable limit.
[ngircd-alex.git] / src / ngircd / channel.c
index 8d001a825c013e8c77e339f5915a54eac792b6fa..00aafe05a170102a3e22053af73861b50b14e112 100644 (file)
@@ -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));
        }