commit de453d71cb1bcd78b365f16e994003e913a03148 from: DNS777 via: Alexander Barton date: Sat Oct 06 18:49:35 2012 UTC Implement channel mode 'V' (invite disallow) If the new channel mode "V" is set, the INVITE command becomes invalid and all clients get the new ERR_NOINVITE_MSG(518) reply. Unreal and InspIRCd uses this mode, too. This closes bug #143. commit - 23b07bdf50ef5cc7b57c057b6088e4f5e4d7d6da commit + de453d71cb1bcd78b365f16e994003e913a03148 blob - e3b754d69815c1aaa0729177b25a80b35986d447 blob + 48ec5d95e98cbdc30e80f4aeb939b0955f680b02 --- doc/Modes.txt +++ doc/Modes.txt @@ -58,6 +58,7 @@ users to lists (e.g. "invite list", "ban list"), other R 19 Only registered users are allowed to join this channel. s 0.9.0 Channel is "secret". t 0.3.0 Only ChanOps are allowed to modify the channel topic. + V 20 Channel doesn't allow invites. z 16 Only users connected via SSL are allowed to join the channel. III. Channel User Modes blob - ba7adf17adb204840418b7482b75fef975844138 blob + 1eb3337dfca4e65d09830befd58d9f55984744c3 --- src/ngircd/defines.h +++ src/ngircd/defines.h @@ -164,7 +164,7 @@ #define USERMODES "aBcCiorRswx" /** Supported channel modes. */ -#define CHANMODES "abehiIklmMnoOPqrRstvz" +#define CHANMODES "abehiIklmMnoOPqrRstvVz" /** Away message for users connected to linked servers. */ #define DEFAULT_AWAY_MSG "Away" blob - 04f50d77f8d3f5f832912f62dbd1b33211652ab5 blob + a08d4d92b413ef05acc11ac1380c70197b67a497 --- src/ngircd/irc-mode.c +++ src/ngircd/irc-mode.c @@ -566,6 +566,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Ori goto chan_exit; } case 'i': /* Invite only */ + case 'V': /* Invite disallow */ case 'M': /* Only identified nicks can write */ case 'm': /* Moderated */ case 'n': /* Only members can write */ blob - 08495475f60520c7dd899d7cef9e10b4f4852550 blob + 5c12faf78022ac8929d239029a4e7d2e8ff2fe47 --- src/ngircd/irc-op.c +++ src/ngircd/irc-op.c @@ -164,6 +164,11 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req) if (!Channel_IsMemberOf(chan, from)) return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Req->argv[1]); + /* Is the channel "invite-disallow"? */ + if (strchr(Channel_Modes(chan), 'V')) + return IRC_WriteStrClient(from, ERR_NOINVITE_MSG, + Client_ID(from), Channel_Name(chan)); + /* Is the channel "invite-only"? */ if (strchr(Channel_Modes(chan), 'i')) { /* Yes. The user must be channel owner/admin/operator/halfop! */ blob - 35d621a6e685f988007325f54974623093b54215 blob + 5c83c5cc7b4c77ee51139b0c6c2c7237d91c4ca1 --- src/ngircd/messages.h +++ src/ngircd/messages.h @@ -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,imMnOPRstz 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,imMnOPRstVz 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" @@ -148,6 +148,7 @@ #define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode" #define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\"" #define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users" +#define ERR_NOINVITE_MSG "518 %s :Cannot invite to %s (+V)" #ifdef ZLIB # define RPL_STATSLINKINFOZIP_MSG "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"