]> arthur.barton.de Git - ngircd-alex.git/commitdiff
irc.c: reject masks with wildcard after last dot
authorFlorian Westphal <fw@strlen.de>
Sat, 17 Jan 2009 23:33:34 +0000 (00:33 +0100)
committerFlorian Westphal <fw@strlen.de>
Sat, 17 Jan 2009 23:36:38 +0000 (00:36 +0100)
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 ".".

src/ngircd/irc.c
src/ngircd/messages.h

index e5f5bbd5ddeab864b153533fa36336f5cb5d009d..a0dc0ea9b8ed2b3722b736af9cf80575eab85627 100644 (file)
@@ -468,11 +468,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                                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 */
@@ -501,6 +501,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
        CLIENT *cl;
        bool client_match;
        char *mask = targetMask + 1;
+       const char *check_wildcards;
 
        cl = NULL;
 
@@ -511,6 +512,21 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
                                          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)
@@ -522,6 +538,7 @@ Send_Message_Mask(CLIENT * from, char * command, char * targetMask,
                                        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;
index 562f778de1c8a86810231bb23826ca9e6b2446ea..209485a828245d443fc85cfceef6826da4a31f30 100644 (file)
@@ -96,6 +96,7 @@
 #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"