diff options
| author | Alexander Barton <alex@barton.de> | 2013-01-13 16:52:00 +0100 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2013-01-13 17:18:04 +0100 |
| commit | d8f2964710985597281de73aecd0a1ece30ecb03 (patch) | |
| tree | 5262ce4c79ee759af4ae93b127e991f2438d97f2 | |
| parent | ab009976984ede815c31c9a6b318c80006823b81 (diff) | |
| download | ngircd-d8f2964710985597281de73aecd0a1ece30ecb03.tar.gz ngircd-d8f2964710985597281de73aecd0a1ece30ecb03.zip | |
MODE: don't report error on "more modes than parameters"
Don't report ERR_NEEDMOREPARAMS(461) when a MDOE command with more modes than nicknames is handled, as well as for channel limit and key changes without specifying the limit or key parameters. This is how a lot (all?) other IRC servers behave, including ircd2.11, InspIRCd, and ircd-seven. And because of clients (tested with Textual and mIRC) sending bogus MODE commands like "MODE -ooo nick", end-users got the expected result as well as correct but misleading error messages ... If ngIRCd is compiled using "strict mode", these errors are still reported. Reported-by: Tim <tim@stackwatch.net>
| -rw-r--r-- | src/ngircd/irc-mode.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index a63a0f41..b5f28fa3 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -628,9 +628,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Only send error message in "strict" mode, + * this is how ircd2.11 and others behave ... */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; @@ -668,9 +672,13 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Only send error message in "strict" mode, + * this is how ircd2.11 and others behave ... */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; @@ -761,9 +769,17 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { +#ifdef STRICT_RFC + /* Report an error to the client, when a user + * mode should be changed but no nickname is + * given. But don't do it when not in "strict" + * mode, because most other servers don't do + * it as well and some clients send "wired" + * MODE commands like "MODE #chan -ooo nick". */ connected = IRC_WriteStrClient(Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID(Origin), Req->command); +#endif goto chan_exit; } break; |