X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fipban.qc;h=a180547c0f97c09cb3632fdeb694e9bece0762a5;hb=fbf95bc8847bd149f4e70b4e96b8ce4bd203005f;hp=b40a1e3a289ad682f95cfe8a96b35e83d84a9aa3;hpb=4f926be80533640c5531417f7553de6c3da0c528;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/ipban.qc b/qcsrc/server/ipban.qc index b40a1e3a2..a180547c0 100644 --- a/qcsrc/server/ipban.qc +++ b/qcsrc/server/ipban.qc @@ -8,7 +8,7 @@ * 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): @@ -19,6 +19,8 @@ * 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) @@ -112,7 +114,7 @@ void OnlineBanList_URI_Get_Callback(float id, float status, string data) } if(syncinterval > 0) syncinterval *= 60; - + if(status != 0) { print("error: status is ", ftos(status), "\n"); @@ -191,7 +193,7 @@ void OnlineBanList_Think() 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" @@ -206,7 +208,7 @@ void OnlineBanList_Think() 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)); @@ -225,7 +227,7 @@ void OnlineBanList_Think() 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 @@ -319,23 +321,24 @@ void Ban_View() { 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"); } @@ -364,7 +367,7 @@ float Ban_GetClientIP(entity client) 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 @@ -428,8 +431,12 @@ float Ban_IsClientBanned(entity client, float idx) 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; } @@ -446,6 +453,15 @@ float Ban_MaybeEnforceBan(entity client) 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; @@ -464,7 +480,7 @@ string Ban_Enforce(float i, string reason) 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); @@ -551,31 +567,39 @@ float Ban_Insert(string ip, float bantime, string reason, float dosync) 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