Fixed banning to work for both v4 and v6
authorFelix Morgner <felix.morgner@gmail.com>
Fri, 2 May 2014 07:10:36 +0000 (09:10 +0200)
committerFelix Morgner <felix.morgner@gmail.com>
Fri, 2 May 2014 07:10:36 +0000 (09:10 +0200)
src/ban.c
src/ban.h
src/client.c

index 75f45b28ba412cd799574edbefa4bbf74e84eff1..229b0de1fd637232322e5a7c9dec8885a2d2b63c 100644 (file)
--- 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;
 }
index 98550a4dca5fc9b0f462f2ba5807a37a742fea6b..dccf26fdac1cac76256169e587b79834b03df18d 100644 (file)
--- 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);
index 2e9dc65348ae27b70b64465df7bf80a9ec49db7f..dc8b1c2d330aa93de0f6851f1daae8252eaf4810 100644 (file)
@@ -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;