summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2010-05-14 20:07:34 +0200
committerAlexander Barton <alex@barton.de>2010-07-25 16:18:25 +0200
commitacb66d64637d33661ff4345e9bb37444109e9d11 (patch)
treeaeeb1ce10870b6a5bc2b989dd7a715754ffc162f /src
parent63a304755acc107287ac6fd86d6aca6f7b6e004b (diff)
downloadngircd-acb66d64637d33661ff4345e9bb37444109e9d11.tar.gz
ngircd-acb66d64637d33661ff4345e9bb37444109e9d11.zip
Allow IRC operators to use MODE command on any channel (closes: #100)
This allows IRC operators to change channel modes of ANY channel,
even without joining these channels first.
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/irc-mode.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index 80a6003f..86a509da 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -297,7 +297,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 {
 	char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
 	    argadd[CLIENT_PASS_LEN], *mode_ptr;
-	bool connected, set, modeok = true, skiponce, use_servermode = false, retval;
+	bool connected, set, skiponce, retval, onchannel;
+	bool modeok = true, use_servermode = false;
 	int mode_arg, arg_arg;
 	CLIENT *client;
 	long l;
@@ -314,14 +315,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 	/* Is the user allowed to change modes? */
 	if (Client_Type(Client) == CLIENT_USER) {
 		/* Is the originating user on that channel? */
-		if (!Channel_IsMemberOf(Channel, Origin))
-			return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
-				Client_ID(Origin), Channel_Name(Channel));
+		onchannel = Channel_IsMemberOf(Channel, Origin);
 		modeok = false;
 		/* channel operator? */
-		if (strchr(Channel_UserModes(Channel, Origin), 'o'))
+		if (onchannel &&
+		    strchr(Channel_UserModes(Channel, Origin), 'o')) {
 			modeok = true;
-		else if (Conf_OperCanMode) {
+		} else if (Conf_OperCanMode) {
 			/* IRC-Operators can use MODE as well */
 			if (Client_OperByMe(Origin)) {
 				modeok = true;
@@ -329,6 +329,10 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 					use_servermode = true; /* Change Origin to Server */
 			}
 		}
+
+		if (!onchannel && !use_servermode)
+			return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
+				Client_ID(Origin), Channel_Name(Channel));
 	}
 
 	mode_arg = 1;