summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2012-10-06 22:37:57 +0200
committerAlexander Barton <alex@barton.de>2012-10-06 22:37:57 +0200
commitc9d166747d4ea161c55c765edc23e2cd3bd7dec4 (patch)
tree1062a7610d311b8297fff9dce9676d3c22e5aeef /src
parent56cdc2175c4cbe6abdf45f2d32016c260f3728f7 (diff)
parent9ac94339dca746d830a877944e30d1cc9c45c47f (diff)
downloadngircd-c9d166747d4ea161c55c765edc23e2cd3bd7dec4.tar.gz
ngircd-c9d166747d4ea161c55c765edc23e2cd3bd7dec4.zip
Merge branch 'bug141-ModesQq'
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
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/channel.c12
-rw-r--r--src/ngircd/defines.h4
-rw-r--r--src/ngircd/irc-mode.c10
-rw-r--r--src/ngircd/messages.h3
4 files changed, 26 insertions, 3 deletions
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c
index 10b05405..f3c74dc6 100644
--- a/src/ngircd/channel.c
+++ b/src/ngircd/channel.c
@@ -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);
diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
index 1eb3337d..37ca6764 100644
--- a/src/ngircd/defines.h
+++ b/src/ngircd/defines.h
@@ -161,10 +161,10 @@
 #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"
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index a08d4d92..c7d02c91 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -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)
diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h
index ac75daf9..b94a999a 100644
--- a/src/ngircd/messages.h
+++ b/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,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"
@@ -140,6 +140,7 @@
 #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"