X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fban.c;h=3c7c4ffa656ea26c2ab285192b03f9466d4f08d5;hb=bb5f5ae82bdcb7b5189032940d0b609dc12be70b;hp=e5294ba3f45f2d2229a7d3a45decb5a1377e71cb;hpb=c289fc55d1fce7f474127933063ba2008a188259;p=umurmur.git diff --git a/src/ban.c b/src/ban.c index e5294ba..3c7c4ff 100644 --- a/src/ban.c +++ b/src/ban.c @@ -36,6 +36,7 @@ #include "ban.h" #include "conf.h" #include "ssl.h" +#include "util.h" static void Ban_saveBanFile(void); static void Ban_readBanFile(void); @@ -74,13 +75,13 @@ void Ban_UserBan(client_t *client, char *reason) memset(ban, 0, sizeof(ban_t)); memcpy(ban->hash, client->hash, 20); - if (client->remote_tcp.ss_family == AF_INET) { - memcpy(&ban->address, &(((struct sockaddr_in*)&client->remote_tcp)->sin_addr), sizeof(in_addr_t)); - ban->mask = sizeof(in_addr_t); - } else { - memcpy(&ban->address, &(((struct sockaddr_in6*)&client->remote_tcp)->sin6_addr), 4 * sizeof(in_addr_t)); - ban->mask = 4 * sizeof(in_addr_t); - } + if (client->remote_tcp.ss_family == AF_INET) { + memcpy(&ban->address, &(((struct sockaddr_in*)&client->remote_tcp)->sin_addr), sizeof(in_addr_t)); + ban->mask = sizeof(in_addr_t); + } else { + memcpy(&ban->address, &(((struct sockaddr_in6*)&client->remote_tcp)->sin6_addr), 4 * sizeof(in_addr_t)); + ban->mask = 4 * sizeof(in_addr_t); + } ban->reason = strdup(reason); ban->name = strdup(client->username); ban->time = time(NULL); @@ -94,15 +95,8 @@ void Ban_UserBan(client_t *client, char *reason) SSLi_hash2hex(ban->hash, hexhash); - char addressPresentation[INET6_ADDRSTRLEN]; - - if(client->remote_tcp.ss_family == AF_INET) - inet_ntop(AF_INET, &((struct sockaddr_in*)&client->remote_tcp)->sin_addr, addressPresentation, INET6_ADDRSTRLEN); - else - inet_ntop(AF_INET6, &((struct sockaddr_in6*)&client->remote_tcp)->sin6_addr, addressPresentation, INET6_ADDRSTRLEN); - Log_info_client(client, "User kickbanned. Reason: '%s' Hash: %s IP: %s Banned for: %d seconds", - ban->reason, hexhash, addressPresentation, ban->duration); + ban->reason, hexhash, Util_clientAddressToString(client), ban->duration); } @@ -119,8 +113,8 @@ void Ban_pruneBanned() #ifdef DEBUG SSLi_hash2hex(ban->hash, hexhash); Log_debug("BL: User %s Reason: '%s' Hash: %s IP: %s Time left: %d", - ban->name, ban->reason, hexhash, inet_ntoa(*((struct in_addr *)&ban->address)), - bantime_long / 1000000LL - Timer_elapsed(&ban->startTime) / 1000000LL); + ban->name, ban->reason, hexhash, inet_ntoa(*((struct in_addr *)&ban->address)), + bantime_long / 1000000LL - Timer_elapsed(&ban->startTime) / 1000000LL); #endif /* Duration of 0 = forever */ if (ban->duration != 0 && Timer_isElapsed(&ban->startTime, bantime_long)) { @@ -149,24 +143,23 @@ bool_t Ban_isBanned(client_t *client) } -bool_t Ban_isBannedAddr(in_addr_t *addr) +bool_t Ban_isBannedAddr(struct sockaddr_storage *address) { struct dlist *itr; ban_t *ban; - int mask; in_addr_t tempaddr1, tempaddr2; list_iterate(itr, &banlist) { ban = list_get_entry(itr, ban_t, node); - mask = ban->mask - 96; - if (mask < 32) { /* XXX - only ipv4 support */ - memcpy(&tempaddr1, addr, sizeof(in_addr_t)); - memcpy(&tempaddr2, &ban->address, sizeof(in_addr_t)); - tempaddr1 &= (2 ^ mask) - 1; - tempaddr2 &= (2 ^ mask) - 1; + + if(ban->mask == sizeof(in_addr_t)) { + if(memcmp(ban->address, &((struct sockaddr_in *)address)->sin_addr, ban->mask) == 0) + return true; + } + else { + if(memcmp(ban->address, &((struct sockaddr_in6 *)address)->sin6_addr, ban->mask) == 0) + return true; } - if (memcmp(&tempaddr1, &tempaddr2, sizeof(in_addr_t)) == 0) - return true; } return false; } @@ -198,7 +191,7 @@ message_t *Ban_getBanList(void) memcpy(&address[12], &ban->address, 4); memset(&address[10], 0xff, 2); /* IPv4 */ Msg_banList_addEntry(msg, i++, address, ban->mask, ban->name, - hexhash, ban->reason, timestr, ban->duration); + hexhash, ban->reason, timestr, ban->duration); } return msg; } @@ -267,7 +260,7 @@ static void Ban_saveBanFile(void) ban = list_get_entry(itr, ban_t, node); SSLi_hash2hex(ban->hash, hexhash); fprintf(file, "%s,%s,%d,%ld,%d,%s,%s\n", hexhash, inet_ntoa(*((struct in_addr *)&ban->address)), - ban->mask, (long int)ban->time, ban->duration, ban->name, ban->reason); + ban->mask, (long int)ban->time, ban->duration, ban->name, ban->reason); } fclose(file); banlist_changed = false;