]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/ipban.qc
Don't give accuracy for shooting frozen players
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / ipban.qc
index b40a1e3a289ad682f95cfe8a96b35e83d84a9aa3..a180547c0f97c09cb3632fdeb694e9bece0762a5 100644 (file)
@@ -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