X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Ftools.c;h=2cb1065fa8458b33b2235200e3269f79a1e48558;hb=727b8a503f88131d92025bc43e3803d4a7c2aa00;hp=c802bbeaf165e4f3762a5b11dd1560db0acb53b9;hpb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;p=NeonServV5.git diff --git a/src/tools.c b/src/tools.c index c802bbe..2cb1065 100644 --- a/src/tools.c +++ b/src/tools.c @@ -19,6 +19,7 @@ #include "ChanNode.h" #include "lang.h" #include "ClientSocket.h" +#include "IPNode.h" static const struct default_language_entry msgtab[] = { {"TIME_MASK_2_ITEMS", "%s and %s"}, /* {ARGS: "2 days", "1 hour"} */ @@ -487,7 +488,7 @@ char* make_banmask(char *input, char* buffer) { ident = input; *p = '\0'; host = p+1; - } else if((p = strstr(input, "."))) { + } else if((p = strstr(input, ".")) || (p = strstr(input, ":"))) { host = input; } else if(*input == '*' && input[1] != '\0' && !strstr(input+1, "*")) { //AUTH MASK @@ -525,6 +526,26 @@ int isFakeHost(char *host) { return (strlen(p2+1) > 4); } +int mask_match(char *mask, struct UserNode *user) { + char usermask[NICKLEN+USERLEN+HOSTLEN+3]; + char matchmask[strlen(mask)+3]; + strcpy(matchmask, mask); + char *host = strchr(mask, '@'); + if(host) { + struct IPNode *ip = createIPNode(host); + int bits = (ip->flags & IPNODE_IS_IPV6 ? 128 : 32); + if((host = strchr(host, '/'))) { + bits = atoi(host+1); + } + if(ip && user->ip&& !ipmatch(user->ip, ip, bits)) { + host[1] = '*'; + host[2] = '\0'; + } + } + sprintf(usermask, "%s!%s@%s", user->nick, user->ident, user->host); + return match(matchmask, usermask); +} + static unsigned long crc_table[256]; static void crc32_init() {