Commit Diff
Diff:
360a254be0e55e975998d0f3a5ff301ac3346f72
1aaf54ac24e8e24d5a3ce5b7b00a775f5237d7a9
Commit:
1aaf54ac24e8e24d5a3ce5b7b00a775f5237d7a9
Tree:
57bfc49d2e4c8632321fc854a7f61bfa81fc7201
Author:
DNS777 <dns@rbose.org>
Committer:
DNS777 <dns@rbose.org>
Date:
Sun Aug 26 14:40:49 2012 UTC
Message:
Implement channel mode "M" Only the server, identified users and IRC operators are able to talk.
blob - ff470246fec79e09d67ab764c6bca583138e2a00
blob + 1d1645f2e342e4ee9f01de8ea478ab2fc5eaea93
--- src/ngircd/channel.c
+++ src/ngircd/channel.c
@@ -845,6 +845,22 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
}
+static bool
+Can_Send_To_Channel_Identified(CHANNEL *Chan, CLIENT *From)
+{
+ if ((Client_ThisServer() == From) || Client_HasMode(From, 'o'))
+ return true;
+
+ if (strchr(Channel_Modes(Chan), 'M') && !Client_HasMode(From, 'R'))
+ return false;
+
+ if (Lists_Check(&Chan->list_excepts, From))
+ return true;
+
+ return !Lists_Check(&Chan->list_bans, From);
+}
+
+
GLOBAL bool
Channel_Write(CHANNEL *Chan, CLIENT *From, CLIENT *Client, const char *Command,
bool SendErrors, const char *Text)
@@ -856,6 +872,13 @@ Channel_Write(CHANNEL *Chan, CLIENT *From, CLIENT *Cli
Client_ID(From), Channel_Name(Chan));
}
+ if (!Can_Send_To_Channel_Identified(Chan, From)) {
+ if (! SendErrors)
+ return CONNECTED;
+ return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG,
+ Client_ID(From), Channel_Name(Chan));
+ }
+
if (Client_Conn(From) > NONE)
Conn_UpdateIdle(Client_Conn(From));
blob - cd0a1666ae58a7696c27f7c5aeac40fcfeea565b
blob + 310e0699857b2327cee44b440a44061386133805
--- src/ngircd/defines.h
+++ src/ngircd/defines.h
@@ -164,7 +164,7 @@
#define USERMODES "acCiorRswx"
/** Supported channel modes. */
-#define CHANMODES "beiIklmnoOPrRstvz"
+#define CHANMODES "beiIklmMnoOPrRstvz"
/** Away message for users connected to linked servers. */
#define DEFAULT_AWAY_MSG "Away"
blob - fa35cdd0f29d7742d92c169f6ce992a56eaa1ca5
blob + f91a28c6aca634591e785a41b2f159d6b4629e52
--- src/ngircd/irc-mode.c
+++ src/ngircd/irc-mode.c
@@ -500,6 +500,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Ori
switch (*mode_ptr) {
/* --- Channel modes --- */
case 'i': /* Invite only */
+ case 'M': /* Only identified nicks can write */
case 'm': /* Moderated */
case 'n': /* Only members can write */
case 'R': /* Registered users only */
blob - 9ad6be1763d569f7af3b486e3620930f15127516
blob + 0c36f60a26ba71bdc35fc284d956e92cec854da4
--- 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 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=beI,k,l,imnOPRstz CHANLIMIT=#&+:%d :are supported on this server"
+#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstz 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"
IRCNow