re-enabled master gbans

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5128 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
Lee Salzman
2010-05-31 23:09:49 +00:00
parent 49949046ab
commit f73a12db33
+46 -3
View File
@@ -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<gbaninfo> 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)