From f437c88e9885c332a11fce2babc53c22dfd6e86e Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 2 May 2014 09:10:36 +0200 Subject: [PATCH] Fixed banning to work for both v4 and v6 --- src/ban.c | 19 +++++++++---------- src/ban.h | 2 +- src/client.c | 19 ++++++++----------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/ban.c b/src/ban.c index 75f45b2..229b0de 100644 --- a/src/ban.c +++ b/src/ban.c @@ -142,24 +142,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; } diff --git a/src/ban.h b/src/ban.h index 98550a4..dccf26f 100644 --- a/src/ban.h +++ b/src/ban.h @@ -51,7 +51,7 @@ typedef struct { void Ban_UserBan(client_t *client, char *reason); void Ban_pruneBanned(); bool_t Ban_isBanned(client_t *client); -bool_t Ban_isBannedAddr(in_addr_t *addr); +bool_t Ban_isBannedAddr(struct sockaddr_storage *address); int Ban_getBanCount(void); message_t *Ban_getBanList(void); void Ban_putBanList(message_t *msg, int n_bans); diff --git a/src/client.c b/src/client.c index 2e9dc65..dc8b1c2 100644 --- a/src/client.c +++ b/src/client.c @@ -324,17 +324,6 @@ int Client_add(int fd, struct sockaddr_storage *remote) char addressPresentation[INET6_ADDRSTRLEN]; int port; -#warning FIX BANNING BEFORE RELEASE -#if 0 - if (Ban_isBannedAddr((in_addr_t *)&remote->sin_addr)) { - Log_info("Address %s banned. Disconnecting", inet_ntoa(remote->sin_addr)); - return -1; - } -#endif - - if ((newclient = calloc(1, sizeof(client_t))) == NULL) - Log_fatal("Out of memory (%s:%s)", __FILE__, __LINE__); - if(remote->ss_family == AF_INET) { inet_ntop(AF_INET, &((struct sockaddr_in*)remote)->sin_addr, addressPresentation, INET6_ADDRSTRLEN); port = ntohs(((struct sockaddr_in*)remote)->sin_port); @@ -343,6 +332,14 @@ int Client_add(int fd, struct sockaddr_storage *remote) port = ntohs(((struct sockaddr_in6*)remote)->sin6_port); } + if (Ban_isBannedAddr(remote)) { + Log_info("Address %s banned. Disconnecting", addressPresentation); + return -1; + } + + if ((newclient = calloc(1, sizeof(client_t))) == NULL) + Log_fatal("Out of memory (%s:%s)", __FILE__, __LINE__); + memcpy(newclient->addressString, addressPresentation, INET6_ADDRSTRLEN); newclient->tcpfd = fd; -- 2.30.2