]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Merge branch 'bug141-ModesQq'
authorAlexander Barton <alex@barton.de>
Sat, 6 Oct 2012 20:37:57 +0000 (22:37 +0200)
committerAlexander Barton <alex@barton.de>
Sat, 6 Oct 2012 20:37:57 +0000 (22:37 +0200)
This closes bug #141.

* bug141-ModesQq:
  KICK-protect IRC services
  Implement channel mode "Q" and user mode "q"

Conflicts:
src/ngircd/defines.h
src/ngircd/messages.h

doc/Modes.txt
src/ngircd/channel.c
src/ngircd/defines.h
src/ngircd/irc-mode.c
src/ngircd/messages.h

index 48ec5d95e98cbdc30e80f4aeb939b0955f680b02..8d7cdd70714d62d85844c68c28539615da33baef 100644 (file)
@@ -27,6 +27,7 @@ channels he is using at the moment.
   C    19      Only users that share a channel are allowed to send messages.
   i    0.0.1   User is "invisible".
   o    0.0.1   User is IRC operator.
+  q    20      User is protected, can not be kicked from a channel.
   r    0.0.1   User is restricted.
   R (1)        19      User is registered (e.g. by NickServ).
   s    0.4.0   User wants to receive server notices.
@@ -54,6 +55,7 @@ users to lists (e.g. "invite list", "ban list"), others have parameters
   n    0.3.0   Channel doesn't allow messages of users not being members.
   O    18      Only IRC operators are allowed to join this channel.
   P    0.5.0   Channel is "persistent".
+  Q    20      Nobody can be kicked from the channel.
   r (1)        19      Channel is "registered" (e.g. by ChanServ).
   R    19      Only registered users are allowed to join this channel.
   s    0.9.0   Channel is "secret".
index 10b05405b5ad50b0ebb464d1c9ce5139fc4d12ae..f3c74dc651f10abf72aab2d0ce5856da8a5e6c5e 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);
index 1eb3337dfca4e65d09830befd58d9f55984744c3..37ca67640331d1aaef54181a7038e8f7b4cfa2ca 100644 (file)
 #endif
 
 /** Supported user modes. */
-#define USERMODES "aBcCiorRswx"
+#define USERMODES "aBcCioqrRswx"
 
 /** Supported channel modes. */
-#define CHANMODES "abehiIklmMnoOPqrRstvVz"
+#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
 
 /** Away message for users connected to linked servers. */
 #define DEFAULT_AWAY_MSG "Away"
index a08d4d92b413ef05acc11ac1380c70197b67a497..c7d02c9101e224fe14d787ff2938e4cf165c0853 100644 (file)
@@ -257,6 +257,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                        ERR_NOPRIVILEGES_MSG,
                                                        Client_ID(Origin));
                        break;
+               case 'q': /* KICK-protected user */
+                       if (!set || Client_Type(Client) == CLIENT_SERVER
+                           || Client_OperByMe(Origin))
+                               x[0] = 'q';
+                       else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
+                       break;
                case 'r': /* Restricted (only settable) */
                        if (set || Client_Type(Client) == CLIENT_SERVER)
                                x[0] = 'r';
@@ -570,6 +579,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                case 'M': /* Only identified nicks can write */
                case 'm': /* Moderated */
                case 'n': /* Only members can write */
+               case 'Q': /* No kicks */
                case 't': /* Topic locked */
                        if(is_oper || is_machine || is_owner ||
                           is_admin || is_op || is_halfop)
index ac75daf9f09cc5d625c44702c592ea22f29fd6e8..b94a999a1575102685fbd55373fe76e78434d17d 100644 (file)
@@ -21,7 +21,7 @@
 #define RPL_YOURHOST_MSG               "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 #define RPL_CREATED_MSG                        "003 %s :This server has been started %s"
 #define RPL_MYINFO_MSG                 "004 %s %s ngircd-%s %s %s"
-#define RPL_ISUPPORT1_MSG              "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstVz CHANLIMIT=#&+:%d :are supported on this server"
+#define RPL_ISUPPORT1_MSG              "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=#&+:%d :are supported on this server"
 #define RPL_ISUPPORT2_MSG              "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
 
 #define RPL_TRACELINK_MSG              "200 %s Link %s-%s %s %s V%s %ld %d %d"
 #define ERR_NOPRIVILEGES_MSG           "481 %s :Permission denied"
 #define ERR_CHANOPRIVSNEEDED_MSG       "482 %s %s :You are not channel operator"
 #define ERR_CHANOPPRIVTOOLOW_MSG       "482 %s %s :Your privileges are too low"
+#define ERR_KICKDENY_MSG               "482 %s %s :Cannot kick, %s is protected"
 #define ERR_CANTKILLSERVER_MSG         "483 %s :You can't kill a server!"
 #define ERR_RESTRICTED_MSG             "484 %s :Your connection is restricted"
 #define ERR_NICKREGISTER_MSG           "484 %s :Cannot modify user mode (+R) -- Use IRC services"