irc.c: reject masks with wildcard after last dot
RFC 2812 says in section 3.3.1 ("Private Messages"): The mask MUST have at least 1 (one) "." in it and no wildcards following the last ".".
This commit is contained in:
parent
95e8320ca9
commit
5a3128243f
|
@ -468,11 +468,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} else if (ForceType != CLIENT_SERVICE
|
} else if (ForceType != CLIENT_SERVICE
|
||||||
&& (chan = Channel_Search(currentTarget))) {
|
&& (chan = Channel_Search(currentTarget))) {
|
||||||
/* channel */
|
|
||||||
if (!Channel_Write(chan, from, Client, Req->command,
|
if (!Channel_Write(chan, from, Client, Req->command,
|
||||||
SendErrors, Req->argv[1]))
|
SendErrors, Req->argv[1]))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} else if (ForceType != CLIENT_SERVICE
|
} else if (ForceType != CLIENT_SERVICE
|
||||||
|
/* $#: server/target mask, RFC 2812, sec. 3.3.1 */
|
||||||
&& strchr("$#", currentTarget[0])
|
&& strchr("$#", currentTarget[0])
|
||||||
&& strchr(currentTarget, '.')) {
|
&& strchr(currentTarget, '.')) {
|
||||||
/* targetmask */
|
/* targetmask */
|
||||||
|
@ -501,6 +501,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
|
||||||
CLIENT *cl;
|
CLIENT *cl;
|
||||||
bool client_match;
|
bool client_match;
|
||||||
char *mask = targetMask + 1;
|
char *mask = targetMask + 1;
|
||||||
|
const char *check_wildcards;
|
||||||
|
|
||||||
cl = NULL;
|
cl = NULL;
|
||||||
|
|
||||||
|
@ -511,6 +512,21 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
|
||||||
Client_ID(from));
|
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] == '#') {
|
if (targetMask[0] == '#') {
|
||||||
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
|
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
|
||||||
if (Client_Type(cl) != CLIENT_USER)
|
if (Client_Type(cl) != CLIENT_USER)
|
||||||
|
@ -522,6 +538,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
assert(targetMask[0] == '$'); /* $: server mask, see RFC 2812, sec. 3.3.1 */
|
||||||
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
|
for (cl = Client_First(); cl != NULL; cl = Client_Next(cl)) {
|
||||||
if (Client_Type(cl) != CLIENT_USER)
|
if (Client_Type(cl) != CLIENT_USER)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -96,6 +96,7 @@
|
||||||
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
|
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
|
||||||
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
|
#define ERR_NORECIPIENT_MSG "411 %s :No receipient given (%s)"
|
||||||
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
|
#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_UNKNOWNCOMMAND_MSG "421 %s %s :Unknown command"
|
||||||
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
|
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
|
||||||
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"
|
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"
|
||||||
|
|
Loading…
Reference in New Issue