summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2014-01-08 14:18:09 +0100
committerAlexander Barton <alex@barton.de>2014-01-08 14:24:03 +0100
commit8ae2cdfce9f8ba75fe72d65603d4c05c87f6d9c2 (patch)
tree2a3fcf37d2d6d4ab8d44f0e705e8cfe8a7123642
parent6685ae063f4e7dd75346cf50cff84c8c109e2d6b (diff)
downloadngircd-8ae2cdfce9f8ba75fe72d65603d4c05c87f6d9c2.tar.gz
ngircd-8ae2cdfce9f8ba75fe72d65603d4c05c87f6d9c2.zip
Send "fake '*' key" in "MODE -k" replies
According to RFC 2812 3.2.3 "Channel mode message" and the examples
there, it looks like clients should use "MODE -k <key>" to unset channel
keys; and that's how other servers and services behave and do expect it.

(But please note that this is NOT the case for "MODE -l"!)

In the end, it doesn't make sense to specify a key when UNsetting it at
all, and different services behave diffrently when clients do not send
the currently set key to unset it - some ignore such calls, for example!

But this implementation is quite relaxed, it accepts any key when
unsetting channel mode "k" and even accepts no key at all. But the reply
will always include an "*" character for every "-k" parameter.
-rw-r--r--src/ngircd/irc-mode.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
index a29ed238..a59f085d 100644
--- a/src/ngircd/irc-mode.c
+++ b/src/ngircd/irc-mode.c
@@ -582,9 +582,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 				goto chan_exit;
 			if (!set) {
 				if (is_oper || is_machine || is_owner ||
-				    is_admin || is_op || is_halfop)
+				    is_admin || is_op || is_halfop) {
 					x[0] = *mode_ptr;
-				else
+					if (Channel_HasMode(Channel, 'k'))
+						strlcpy(argadd, "*", sizeof(argadd));
+					if (arg_arg > mode_arg)
+						arg_arg++;
+				} else
 					connected = IRC_WriteErrClient(Origin,
 						ERR_CHANOPRIVSNEEDED_MSG,
 						Client_ID(Origin),