//==================================================================================================== // // Name: i3D.net Ban Detector. // Author: zaCade // Description: Detect potential ban evasions. // //==================================================================================================== #undef REQUIRE_PLUGIN #include #include #include new G_iParentAuthID[MAXPLAYERS+1]; new G_iClientAuthID[MAXPLAYERS+1]; new bool:G_bSourcebansAvailable; new Handle:G_hDatabase; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin:myinfo = { name = "UNLOZE Ban Detector", author = "zaCade", description = "Detect potential ban evasions", version = "1.0", }; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnPluginStart() { SQL_TConnect(SQL_OnConnected, "sourcebans"); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnAllPluginsLoaded() { if (LibraryExists("sourcebans")) G_bSourcebansAvailable = true; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnLibraryAdded(const String:name[]) { if (StrEqual("sourcebans", name)) G_bSourcebansAvailable = true; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnLibraryRemoved(const String:name[]) { if (StrEqual("sourcebans", name)) G_bSourcebansAvailable = false; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnClientConnected(client) { G_iParentAuthID[client] = -1; G_iClientAuthID[client] = -1; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnClientDisconnect(client) { G_iParentAuthID[client] = -1; G_iClientAuthID[client] = -1; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnClientPostAdminCheck(client) { if (G_bSourcebansAvailable && !IsFakeClient(client)) { if (G_iParentAuthID[client] != -1 && G_iClientAuthID[client] != -1) CheckBans_SteamID(client, G_iParentAuthID[client], G_iClientAuthID[client]); CheckBans_IPAdress(client); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public SteamWorks_OnValidateClient(parentAuthID, clientAuthID) { if (G_bSourcebansAvailable && parentAuthID != clientAuthID) { for (new client = 1; client <= MaxClients; client++) { if (IsClientConnected(client) && GetSteamAccountID(client) == clientAuthID) { if (!IsClientInGame(client)) { G_iParentAuthID[client] = parentAuthID; G_iClientAuthID[client] = clientAuthID; break; } else { CheckBans_SteamID(client, parentAuthID, clientAuthID); break; } } } } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public CheckBans_SteamID(client, parentAuthID, clientAuthID) { new String:authid[32]; Format(authid, sizeof(authid), "STEAM_0:%d:%d", (parentAuthID & 1), (parentAuthID >> 1)); new String:query[512]; Format(query, sizeof(query), "SELECT * FROM sb_bans WHERE authid = '%s' AND ((length = 0 OR ends > UNIX_TIMESTAMP()) AND RemoveType IS NULL)", authid); // Format(query, sizeof(query), "SELECT * FROM sb_bans WHERE authid = '%s' AND ((ends > '%d' AND length != '0') OR length = '0')", authid, GetTime()); LogMessage("[BanDetector] Checking family sharing user %L (AUTH: %s, PAUTH: %d, CAUTH: %d)", client, authid, parentAuthID, clientAuthID); if (G_hDatabase != INVALID_HANDLE) SQL_TQuery(G_hDatabase, SQL_OnCheckClientSteamID, query, client); else LogMessage("[BanDetector] Unable to check user %L (No database)", client); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public CheckBans_IPAdress(client) { new String:adress[32]; GetClientIP(client, adress, sizeof(adress)); new String:query[512]; Format(query, sizeof(query), "SELECT * FROM sb_bans WHERE ip = '%s' AND ((length = 0 OR ends > UNIX_TIMESTAMP()) AND RemoveType IS NULL AND (aid != 0 OR reason != 'Ban evasion (IP)')", adress); // Format(query, sizeof(query), "SELECT * FROM sb_bans WHERE ip = '%s' AND ((ends > '%d' AND length != '0') OR length = '0') AND ((reason != 'Ban evasion (IP)' AND aid = '0') OR aid != '0')", adress, GetTime()); LogMessage("[BanDetector] Checking user %L (IP: %s)", client, adress); if (G_hDatabase != INVALID_HANDLE) SQL_TQuery(G_hDatabase, SQL_OnCheckClientIP, query, client); else LogMessage("[BanDetector] Unable to check user %L (No database)", client); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public SQL_OnConnected(Handle:owner, Handle:handle, const String:error[], any:data) { if (handle != INVALID_HANDLE) G_hDatabase = handle; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public SQL_OnCheckClientSteamID(Handle:owner, Handle:handle, const String:error[], any:client) { //SBPP_BanPlayer(0, client, 0, "Ban evasion (FS)"); if (handle != INVALID_HANDLE && SQL_FetchRow(handle)) KickClient(client, "Ban evasion (FS)"); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public SQL_OnCheckClientIP(Handle:owner, Handle:handle, const String:error[], any:client) { //SBPP_BanPlayer(0, client, 0, "Ban evasion (IP)"); if (handle != INVALID_HANDLE && SQL_FetchRow(handle)) KickClient(client, "Ban evasion (IP)"); }