commit - 95e8320ca99eb9546102d10a329d708458257c56
commit + 5a3128243f4b609b79a2b97ed8cef780198338bb
blob - e5f5bbd5ddeab864b153533fa36336f5cb5d009d
blob + a0dc0ea9b8ed2b3722b736af9cf80575eab85627
--- src/ngircd/irc.c
+++ src/ngircd/irc.c
return DISCONNECTED;
} else if (ForceType != CLIENT_SERVICE
&& (chan = Channel_Search(currentTarget))) {
- /* channel */
if (!Channel_Write(chan, from, Client, Req->command,
SendErrors, Req->argv[1]))
return DISCONNECTED;
} else if (ForceType != CLIENT_SERVICE
+ /* $#: server/target mask, RFC 2812, sec. 3.3.1 */
&& strchr("$#", currentTarget[0])
&& strchr(currentTarget, '.')) {
/* targetmask */
CLIENT *cl;
bool client_match;
char *mask = targetMask + 1;
+ const char *check_wildcards;
cl = NULL;
Client_ID(from));
}
+ /*
+ * RFC 2812, sec. 3.3.1 requires that targetMask have at least one
+ * dot (".") and no wildcards ("*", "?") following the last one.
+ */
+ check_wildcards = strchr(targetMask, '.');
+ assert(check_wildcards != NULL);
+ if (check_wildcards &&
+ check_wildcards[strcspn(check_wildcards, "*?")])
+ {
+ if (!SendErrors)
+ return true;
+ return IRC_WriteStrClient(from, ERR_WILDTOPLEVEL, targetMask);
+ }
+
+ /* #: hostmask, see RFC 2812, sec. 3.3.1 */
if (targetMask[0] == '#') {
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
if (Client_Type(cl) != CLIENT_USER)
return false;
}
} else {
+ assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
if (Client_Type(cl) != CLIENT_USER)
continue;
blob - 562f778de1c8a86810231bb23826ca9e6b2446ea
blob + 209485a828245d443fc85cfceef6826da4a31f30
--- src/ngircd/messages.h
+++ src/ngircd/messages.h
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
+#define ERR_WILDTOPLEVEL "414 %s :Wildcard in toplevel domain"
#define ERR_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"