From f73a12db33f33380c0027bc02ff20839d12e5c65 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Mon, 31 May 2010 23:09:49 +0000 Subject: [PATCH] re-enabled master gbans git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5128 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/server.cpp | 49 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/source/src/server.cpp b/source/src/server.cpp index 2c5b9b5a..a5b425b4 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -1770,6 +1770,50 @@ void startgame(const char *newname, int newmode, int newtime, bool notify) if(notify) senddisconnectedscores(-1); } +struct gbaninfo +{ + enet_uint32 ip, mask; +}; + +vector gbans; + +void cleargbans() +{ + gbans.shrink(0); +} + +bool checkgban(uint ip) +{ + loopv(gbans) if((ip & gbans[i].mask) == gbans[i].ip) return true; + return false; +} + +void addgban(const char *name) +{ + union { uchar b[sizeof(enet_uint32)]; enet_uint32 i; } ip, mask; + ip.i = 0; + mask.i = 0; + loopi(4) + { + char *end = NULL; + int n = strtol(name, &end, 10); + if(!end) break; + if(end > name) { ip.b[i] = n; mask.b[i] = 0xFF; } + name = end; + while(*name && *name++ != '.'); + } + gbaninfo &ban = gbans.add(); + ban.ip = ip.i; + ban.mask = mask.i; + + loopvrev(clients) + { + client &c = *clients[i]; + if(c.type!=ST_TCPIP || c.role >= CR_ADMIN) continue; + if(checkgban(c.peer->address.host)) disconnect_client(c.clientnum, DISC_BANREFUSE); + } +} + bool isbanned(int cn) { if(!valid_client(cn)) return false; @@ -1781,7 +1825,7 @@ bool isbanned(int cn) if(b.millis < servmillis) { bans.remove(i--); } if(b.address.host == c.peer->address.host) { return true; } } - return ipblacklist.check(c.peer->address.host); + return checkgban(c.peer->address.host) || ipblacklist.check(c.peer->address.host); } int serveroperator() @@ -3506,12 +3550,11 @@ void localconnect() void processmasterinput(const char *cmd, int cmdlen, const char *args) { -#if 0 + string val; if(!strncmp(cmd, "cleargbans", cmdlen)) cleargbans(); else if(sscanf(cmd, "addgban %s", val) == 1) addgban(val); -#endif } void initserver(bool dedicated)