* GET g_ban_sync_uri?action=unban&hostname=...&ip=xxx.xxx.xxx
* - Querying the ban list
* GET g_ban_sync_uri?action=list&hostname=...&servers=xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx;...
- *
+ *
* shows the bans from the listed servers, and possibly others.
* Format of a ban is ASCII plain text, four lines per ban, delimited by
* newline ONLY (no carriage return):
* server IP that registered the ban
*/
+#define MAX_IPBAN_URIS (URI_GET_IPBAN_END - URI_GET_IPBAN + 1)
+
float Ban_Insert(string ip, float bantime, string reason, float dosync);
void OnlineBanList_SendBan(string ip, float bantime, string reason)
}
if(syncinterval > 0)
syncinterval *= 60;
-
+
if(status != 0)
{
print("error: status is ", ftos(status), "\n");
float argc;
string uri;
float i, n;
-
+
if(autocvar_g_ban_sync_uri == "")
goto killme;
if(autocvar_g_ban_sync_interval == 0) // < 0 is okay, it means "sync on level start only"
for(i = 1; i < argc; ++i)
OnlineBanList_Servers = strcat(OnlineBanList_Servers, ";", argv(i));
OnlineBanList_Servers = strzone(OnlineBanList_Servers);
-
+
uri = strcat( "action=list&hostname=", uri_escape(autocvar_hostname));
uri = strcat(uri, "&servers=", uri_escape(OnlineBanList_Servers));
else
uri_get(strcat(argv(i), "?", uri), URI_GET_IPBAN + i); // 1000 = "banlist" callback target
}
-
+
if(autocvar_g_ban_sync_interval > 0)
self.nextthink = time + max(60, autocvar_g_ban_sync_interval * 60);
else
{
float i, n;
string msg;
-
+
print("^2Listing all existing active bans:\n");
-
+
+ n = 0;
for(i = 0; i < ban_count; ++i)
{
if(time > ban_expire[i])
continue;
-
+
++n; // total number of existing bans
-
+
msg = strcat("#", ftos(i), ": ");
msg = strcat(msg, ban_ip[i], " is still banned for ");
msg = strcat(msg, ftos(ban_expire[i] - time), " seconds");
-
+
print(" ", msg, "\n");
}
-
+
print("^2Done listing all active (", ftos(n), ") bans.\n");
}
i4 = strstrofs(s, ".", i3 + 1);
if(i4 >= 0)
s = substring(s, 0, i4);
-
+
ban_ip1 = substring(s, 0, i1); // 8
ban_ip2 = substring(s, 0, i2); // 16
ban_ip3 = substring(s, 0, i3); // 24
if(ban_idfp == s) return TRUE;
}
if(ipbanned)
- if(!autocvar_g_banned_list_idmode || !ban_idfp)
+ {
+ if(!autocvar_g_banned_list_idmode)
+ return TRUE;
+ if (!ban_idfp)
return TRUE;
+ }
return FALSE;
}
return FALSE;
}
+.float ban_checked;
+float Ban_MaybeEnforceBanOnce(entity client)
+{
+ if(client.ban_checked)
+ return FALSE;
+ client.ban_checked = TRUE;
+ return Ban_MaybeEnforceBan(self);
+}
+
string Ban_Enforce(float i, string reason)
{
string s;
reason = strcat(reason, ", ");
reason = strcat(reason, e.netname);
}
- s = strcat(s, "^1NOTE:^7 banned client ", e.netname, "^7 has to go\n");
+ s = strcat(s, "^1NOTE:^7 banned client ", e.netaddress, "^7 has to go\n");
dropclient(e);
}
bprint(s);
void Ban_KickBanClient(entity client, float bantime, float masksize, string reason)
{
+ string ip, id;
if(!Ban_GetClientIP(client))
{
sprint(client, strcat("Kickbanned: ", reason, "\n"));
dropclient(client);
return;
}
- // now ban him
+
+ // who to ban?
switch(masksize)
{
case 1:
- Ban_Insert(ban_ip1, bantime, reason, 1);
+ ip = strcat1(ban_ip1);
break;
case 2:
- Ban_Insert(ban_ip2, bantime, reason, 1);
+ ip = strcat1(ban_ip2);
break;
case 3:
- Ban_Insert(ban_ip3, bantime, reason, 1);
+ ip = strcat1(ban_ip3);
break;
case 4:
default:
- Ban_Insert(ban_ip4, bantime, reason, 1);
+ ip = strcat1(ban_ip4);
break;
}
if(ban_idfp)
- Ban_Insert(ban_idfp, bantime, reason, 1);
+ id = strcat1(ban_idfp);
+ else
+ id = string_null;
+
+ Ban_Insert(ip, bantime, reason, 1);
+ if(id)
+ Ban_Insert(id, bantime, reason, 1);
/*
* not needed, as we enforce the ban in Ban_Insert anyway
// and kick him