-/* tools.c - NeonServ v5.3
+/* tools.c - NeonServ v5.6
* Copyright (C) 2011-2012 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
#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"} */
if(table->contents[row][col][i] == '\002') j++;
else if(table->contents[row][col][i] == '\003') {
j++;
- for(k = 1; k < 2; k++) {
+ for(k = 1; k <= 2; k++) {
if(isdigit(table->contents[row][col][i+k]))
j++;
else
}
}
}
- }
+ } else if(table->col_flags[col] & TABLE_FLAG_COL_SKIP_NULL)
+ continue;
i -= j;
if(col < table->width-1) {
for(;i < table->maxwidth[col]; i++) {
modeStr[modePos++] = modeBuf->addModes[i];
if(modeBuf->addModesParams[i]) {
paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->addModesParams[i]);
+ free(modeBuf->addModesParams[i]);
+ modeBuf->addModesParams[i] = NULL;
}
}
modeBuf->addCount = 0;
modeStr[modePos++] = modeBuf->delModes[i];
if(modeBuf->delModesParams[i]) {
paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->delModesParams[i]);
+ free(modeBuf->delModesParams[i]);
+ modeBuf->delModesParams[i] = NULL;
}
}
modeBuf->delCount = 0;
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
char *p1, *p2 = host;
//find the last dot to identify if the hostmask is a fake host
- while((p1 = strstr(p2, "."))) {
+ while((p1 = strchr(p2, '.'))) {
p2 = p1 + 1;
}
//TLD database: http://www.iana.org/domains/root/db/
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() {