X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc.c;h=2466b6bf9e47ef9ed7c084fe0a2af93a6570cf0f;hb=44acf41cc172e8131c3a987d430b9f948afd26ad;hp=47f86528004d24a009504076108ded7fc7b2f8c6;hpb=178f9cbdac3bbeb58600268791916f3bfbcbd958;p=ngircd-alex.git diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index 47f86528..2466b6bf 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -467,18 +467,18 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors) Req->argv[1])) return DISCONNECTED; } else if (ForceType != CLIENT_SERVICE + && (chan = Channel_Search(currentTarget))) { + 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 */ if (!Send_Message_Mask(from, Req->command, currentTarget, Req->argv[1], 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 (!SendErrors) return CONNECTED; @@ -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 = strrchr(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;