Merge branch 'master' of github.com:fmorgner/umurmur
[umurmur.git] / src / ban.c
index 5e2d2654b53f3209c1ada5d1db9211dc216f2448..e1855de2cb830be0c4d9ff12ab15c8031c90d6a9 100644 (file)
--- a/src/ban.c
+++ b/src/ban.c
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009-2012, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2012, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
@@ -56,10 +56,10 @@ void Ban_init(void)
 
 void Ban_deinit(void)
 {
-       /* Save banlist */      
+       /* Save banlist */
        if (getStrConf(BANFILE) != NULL)
                Ban_saveBanFile();
-       
+
        Ban_clearBanList();
 }
 
@@ -72,7 +72,7 @@ void Ban_UserBan(client_t *client, char *reason)
        if (ban == NULL)
                Log_fatal("Out of memory");
        memset(ban, 0, sizeof(ban_t));
-       
+
        memcpy(ban->hash, client->hash, 20);
        memcpy(&ban->address, &client->remote_tcp.sin_addr, sizeof(in_addr_t));
        ban->mask = 128;
@@ -86,11 +86,10 @@ void Ban_UserBan(client_t *client, char *reason)
        banlist_changed = true;
        if(getBoolConf(SYNC_BANFILE))
                Ban_saveBanFile();
-       
+
        SSLi_hash2hex(ban->hash, hexhash);
        Log_info_client(client, "User kickbanned. Reason: '%s' Hash: %s IP: %s Banned for: %d seconds",
-                       ban->name, ban->reason, hexhash, inet_ntoa(*((struct in_addr *)&ban->address)),
-                       ban->duration);
+                       ban->reason, hexhash, inet_ntoa(*((struct in_addr *)&ban->address)), ban->duration);
 }
 
 
@@ -100,7 +99,7 @@ void Ban_pruneBanned()
        ban_t *ban;
        char hexhash[41];
        uint64_t bantime_long;
-               
+
        list_iterate(itr, &banlist) {
                ban = list_get_entry(itr, ban_t, node);
                bantime_long = ban->duration * 1000000LL;
@@ -130,11 +129,11 @@ bool_t Ban_isBanned(client_t *client)
        ban_t *ban;
        list_iterate(itr, &banlist) {
                ban = list_get_entry(itr, ban_t, node);
-               if (memcmp(ban->hash, client->hash, 20) == 0) 
+               if (memcmp(ban->hash, client->hash, 20) == 0)
                        return true;
        }
        return false;
-       
+
 }
 
 bool_t Ban_isBannedAddr(in_addr_t *addr)
@@ -143,7 +142,7 @@ bool_t Ban_isBannedAddr(in_addr_t *addr)
        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;
@@ -153,7 +152,7 @@ bool_t Ban_isBannedAddr(in_addr_t *addr)
                        tempaddr1 &= (2 ^ mask) - 1;
                        tempaddr2 &= (2 ^ mask) - 1;
                }
-               if (memcmp(&tempaddr1, &tempaddr2, sizeof(in_addr_t)) == 0) 
+               if (memcmp(&tempaddr1, &tempaddr2, sizeof(in_addr_t)) == 0)
                        return true;
        }
        return false;
@@ -174,7 +173,7 @@ message_t *Ban_getBanList(void)
        char timestr[32];
        char hexhash[41];
        uint8_t address[16];
-       
+
        msg = Msg_banList_create(bancount);
        list_iterate(itr, &banlist) {
                ban = list_get_entry(itr, ban_t, node);
@@ -213,7 +212,7 @@ void Ban_putBanList(message_t *msg, int n_bans)
        char *hexhash, *name, *reason, *start;
        uint32_t duration, mask;
        uint8_t *address;
-       
+
        for (i = 0; i < n_bans; i++) {
                Msg_banList_getEntry(msg, i, &address, &mask, &name, &hexhash, &reason, &start, &duration);
                ban = malloc(sizeof(ban_t));
@@ -227,7 +226,7 @@ void Ban_putBanList(message_t *msg, int n_bans)
                ban->name = strdup(name);
                strptime(start, "%Y-%m-%dT%H:%M:%S", &timespec);
                ban->time = mktime(&timespec);
-               Timer_init(&ban->startTime);
+               ban->startTime = ban->time * 1000000LL;
                ban->duration = duration;
                list_add_tail(&ban->node, &banlist);
                bancount++;
@@ -254,17 +253,19 @@ static void Ban_saveBanFile(void)
        list_iterate(itr, &banlist) {
                ban = list_get_entry(itr, ban_t, node);
                SSLi_hash2hex(ban->hash, hexhash);
-               fprintf(file, "%s,%s,%d,%d,%d,%s,%s\n", hexhash, inet_ntoa(*((struct in_addr *)&ban->address)),
-                       ban->mask, ban->time, ban->duration, ban->name, ban->reason);
+               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);
        }
        fclose(file);
+       banlist_changed = false;
+       Log_info("Banlist file '%s': %d entries written", getStrConf(BANFILE), bancount);
 }
 
 static void Ban_readBanFile(void)
 {
        struct dlist *itr;
        ban_t *ban;
-       char line[512], *hexhash, *address, *name, *reason;
+       char line[1024], *hexhash, *address, *name, *reason;
        uint32_t mask, duration;
        time_t time;
        char *p;
@@ -275,7 +276,7 @@ static void Ban_readBanFile(void)
                Log_warn("Could not read banlist file %s: %s", getStrConf(BANFILE), strerror(errno));
                return;
        }
-       while (fgets(line, 512, file) != NULL) {
+       while (fgets(line, 1024, file) != NULL) {
                p = strtok(line, ",");
                hexhash = p;
                p = strtok(NULL, ",");
@@ -296,7 +297,7 @@ static void Ban_readBanFile(void)
                p = strtok(NULL, "\n");
                if (p == NULL) break;
                reason = p;
-               
+
                ban = malloc(sizeof(ban_t));
                if (ban == NULL)
                        Log_fatal("Out of memory");
@@ -305,13 +306,16 @@ static void Ban_readBanFile(void)
                inet_aton(address, (struct in_addr *)&ban->address);
                ban->name = strdup(name);
                ban->reason = strdup(reason);
+               if (ban->name == NULL || ban->reason == NULL)
+                       Log_fatal("Out of memory");
                ban->time = time;
                ban->duration = duration;
                ban->mask = mask;
-               Timer_init(&ban->startTime);
+               ban->startTime = ban->time * 1000000LL;
                list_add_tail(&ban->node, &banlist);
                bancount++;
                Log_debug("Banfile: H = '%s' A = '%s' M = %d U = '%s' R = '%s'", hexhash, address, ban->mask, ban->name, ban->reason);
        }
        fclose(file);
+       Log_info("Banlist file '%s': %d entries read", getStrConf(BANFILE), bancount);
 }