commit - 56cdc2175c4cbe6abdf45f2d32016c260f3728f7
commit + c9d166747d4ea161c55c765edc23e2cd3bd7dec4
blob - 48ec5d95e98cbdc30e80f4aeb939b0955f680b02
blob + 8d7cdd70714d62d85844c68c28539615da33baef
--- doc/Modes.txt
+++ doc/Modes.txt
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.
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".
blob - 10b05405b5ad50b0ebb464d1c9ce5139fc4d12ae
blob + f3c74dc651f10abf72aab2d0ce5856da8a5e6c5e
--- src/ngircd/channel.c
+++ src/ngircd/channel.c
}
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);
blob - 1eb3337dfca4e65d09830befd58d9f55984744c3
blob + 37ca67640331d1aaef54181a7038e8f7b4cfa2ca
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
#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"
blob - a08d4d92b413ef05acc11ac1380c70197b67a497
blob + c7d02c9101e224fe14d787ff2938e4cf165c0853
--- src/ngircd/irc-mode.c
+++ src/ngircd/irc-mode.c
Client_SetOperByMe(Target, false);
x[0] = 'o';
} else
+ ok = IRC_WriteStrClient(Origin,
+ 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));
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)
blob - ac75daf9f09cc5d625c44702c592ea22f29fd6e8
blob + b94a999a1575102685fbd55373fe76e78434d17d
--- src/ngircd/messages.h
+++ src/ngircd/messages.h
#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"