dbstickybans: Qdeleting queries, misc fixes, Query select proc for executing mutiple queries at once...

This commit is contained in:
MrStonedOne
2019-03-16 00:15:16 -07:00
parent de220da1e9
commit 186f6c8ddd
10 changed files with 213 additions and 96 deletions

View File

@@ -1,6 +1,6 @@
Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
The latest database version is 4.7; The query to update the schema revision table is: The latest database version is 5.1; The query to update the schema revision table is:
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 1); INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 1);
or or
@@ -10,7 +10,7 @@ In any query remember to add a prefix to the table names if you use one.
---------------------------------------------------- ----------------------------------------------------
Version 5.1, 23 Dec 2018, by MrStonedOne Version 5.1, 25 Feb 2018, by MrStonedOne
Added four tables to enable storing of stickybans in the database since byond can lose them, and to enable disabling stickybans for a round without depending on a crash free round. Existing stickybans are automagically imported to the tables. Added four tables to enable storing of stickybans in the database since byond can lose them, and to enable disabling stickybans for a round without depending on a crash free round. Existing stickybans are automagically imported to the tables.
CREATE TABLE `stickyban` ( CREATE TABLE `stickyban` (
@@ -24,7 +24,8 @@ CREATE TABLE `stickyban` (
CREATE TABLE `stickyban_matched_ckey` ( CREATE TABLE `stickyban_matched_ckey` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ckey` VARCHAR(32) NOT NULL, `matched_ckey` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`exempt` TINYINT(1) NOT NULL DEFAULT '0', `exempt` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`stickyban`, `matched_ckey`) PRIMARY KEY (`stickyban`, `matched_ckey`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
@@ -32,14 +33,16 @@ CREATE TABLE `stickyban_matched_ckey` (
CREATE TABLE `stickyban_matched_ip` ( CREATE TABLE `stickyban_matched_ip` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ip` INT UNSIGNED NOT NULL, `matched_ip` INT UNSIGNED NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_ip`) PRIMARY KEY (`stickyban`, `matched_ip`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
CREATE TABLE `stickyban_matched_cid` ( CREATE TABLE `stickyban_matched_cid` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_cid` INT UNSIGNED NOT NULL, `matched_cid` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_cid`) PRIMARY KEY (`stickyban`, `matched_cid`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;

View File

@@ -465,10 +465,10 @@ $$
DELIMITER ; DELIMITER ;
-- --
-- Table structure for table `SS13_stickyban` -- Table structure for table `stickyban`
-- --
DROP TABLE IF EXISTS `SS13_stickyban`; DROP TABLE IF EXISTS `stickyban`;
CREATE TABLE `SS13_stickyban` ( CREATE TABLE `stickyban` (
`ckey` VARCHAR(32) NOT NULL, `ckey` VARCHAR(32) NOT NULL,
`reason` VARCHAR(2048) NOT NULL, `reason` VARCHAR(2048) NOT NULL,
`banning_admin` VARCHAR(32) NOT NULL, `banning_admin` VARCHAR(32) NOT NULL,
@@ -477,13 +477,14 @@ CREATE TABLE `SS13_stickyban` (
) ENGINE=InnoDB; ) ENGINE=InnoDB;
-- --
-- Table structure for table `ss13_stickyban_matched_ckey` -- Table structure for table `stickyban_matched_ckey`
-- --
DROP TABLE IF EXISTS `ss13_stickyban_matched_ckey`; DROP TABLE IF EXISTS `stickyban_matched_ckey`;
CREATE TABLE `ss13_stickyban_matched_ckey` ( CREATE TABLE `ss13_stickyban_matched_ckey` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ckey` VARCHAR(32) NOT NULL, `matched_ckey` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`exempt` TINYINT(1) NOT NULL DEFAULT '0', `exempt` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`stickyban`, `matched_ckey`) PRIMARY KEY (`stickyban`, `matched_ckey`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
@@ -495,18 +496,20 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ip`;
CREATE TABLE `ss13_stickyban_matched_ip` ( CREATE TABLE `ss13_stickyban_matched_ip` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ip` INT UNSIGNED NOT NULL, `matched_ip` INT UNSIGNED NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_ip`) PRIMARY KEY (`stickyban`, `matched_ip`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
-- --
-- Table structure for table `ss13_stickyban_matched_cid` -- Table structure for table `stickyban_matched_cid`
-- --
DROP TABLE IF EXISTS `ss13_stickyban_matched_cid`; DROP TABLE IF EXISTS `stickyban_matched_cid`;
CREATE TABLE `ss13_stickyban_matched_cid` ( CREATE TABLE `stickyban_matched_cid` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_cid` INT UNSIGNED NOT NULL, `matched_cid` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_cid`) PRIMARY KEY (`stickyban`, `matched_cid`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;

View File

@@ -483,7 +483,8 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ckey`;
CREATE TABLE `ss13_stickyban_matched_ckey` ( CREATE TABLE `ss13_stickyban_matched_ckey` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ckey` VARCHAR(32) NOT NULL, `matched_ckey` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`exempt` TINYINT(1) NOT NULL DEFAULT '0', `exempt` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`stickyban`, `matched_ckey`) PRIMARY KEY (`stickyban`, `matched_ckey`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
@@ -495,7 +496,8 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ip`;
CREATE TABLE `ss13_stickyban_matched_ip` ( CREATE TABLE `ss13_stickyban_matched_ip` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_ip` INT UNSIGNED NOT NULL, `matched_ip` INT UNSIGNED NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_ip`) PRIMARY KEY (`stickyban`, `matched_ip`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;
@@ -505,8 +507,9 @@ CREATE TABLE `ss13_stickyban_matched_ip` (
DROP TABLE IF EXISTS `ss13_stickyban_matched_cid`; DROP TABLE IF EXISTS `ss13_stickyban_matched_cid`;
CREATE TABLE `ss13_stickyban_matched_cid` ( CREATE TABLE `ss13_stickyban_matched_cid` (
`stickyban` VARCHAR(32) NOT NULL, `stickyban` VARCHAR(32) NOT NULL,
`matched_cid` INT UNSIGNED NOT NULL, `matched_cid` VARCHAR(32) NOT NULL,
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `first_matched` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stickyban`, `matched_cid`) PRIMARY KEY (`stickyban`, `matched_cid`)
) ENGINE=InnoDB; ) ENGINE=InnoDB;

View File

@@ -83,4 +83,4 @@
#define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you #define SPAM_TRIGGER_AUTOMUTE 10 //Number of identical messages required before the spam-prevention will automute you
#define STICKYBAN_DB_CACHE_TIME 10 SECONDS #define STICKYBAN_DB_CACHE_TIME 10 SECONDS
#define STICKYBAN_ROGUE_CHECK_TIME 5 SECONDS #define STICKYBAN_ROGUE_CHECK_TIME 5

View File

@@ -177,6 +177,27 @@ SUBSYSTEM_DEF(dbcore)
return FALSE return FALSE
return new /datum/DBQuery(sql_query, connection) return new /datum/DBQuery(sql_query, connection)
/datum/controller/subsystem/dbcore/proc/QuerySelect(list/querys, warn = FALSE, qdel = FALSE)
if (!islist(querys))
if (!istype(querys, /datum/DBQuery))
CRASH("Invalid query passed to QuerySelect: [querys]")
querys = list(querys)
for (var/thing in querys)
var/datum/DBQuery/query = thing
if (warn)
INVOKE_ASYNC(query, /datum/DBQuery.proc/warn_execute)
else
INVOKE_ASYNC(query, /datum/DBQuery.proc/Execute)
for (var/thing in querys)
var/datum/DBQuery/query = thing
UNTIL(!query.in_progress)
if (qdel)
qdel(query)
/* /*
Takes a list of rows (each row being an associated list of column => value) and inserts them via a single mass query. Takes a list of rows (each row being an associated list of column => value) and inserts them via a single mass query.
Rows missing columns present in other rows will resolve to SQL NULL Rows missing columns present in other rows will resolve to SQL NULL

View File

@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(stickyban)
var/list/ban = params2list(world.GetConfig("ban", oldban)) var/list/ban = params2list(world.GetConfig("ban", oldban))
if (ban && !ban["fromdb"]) if (ban && !ban["fromdb"])
if (!import_to_db(ckey, ban)) if (!import_raw_stickyban_to_db(ckey, ban))
log_world("Could not import stickyban on [oldban] into the database. Ignoring") log_world("Could not import stickyban on [oldban] into the database. Ignoring")
continue continue
dbcacheexpire = 0 dbcacheexpire = 0
@@ -55,11 +55,17 @@ SUBSYSTEM_DEF(stickyban)
var/newdbcache = list() //so if we runtime or the db connection dies we don't kill the existing cache var/newdbcache = list() //so if we runtime or the db connection dies we don't kill the existing cache
var/datum/DBQuery/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") var/datum/DBQuery/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey")
if (!query_stickybans.warn_execute()) var/datum/DBQuery/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched")
return var/datum/DBQuery/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched")
var/datum/DBQuery/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched")
var/datum/DBQuery/query_stickyban_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") SSdbcore.QuerySelect(list(query_stickybans, query_ckey_matches, query_cid_matches, query_ip_matches))
if (!query_stickyban_matches.warn_execute())
if (query_stickybans.last_error)
qdel(query_stickybans)
qdel(query_ckey_matches)
qdel(query_cid_matches)
qdel(query_ip_matches)
return return
while (query_stickybans.NextRow()) while (query_stickybans.NextRow())
@@ -75,59 +81,127 @@ SUBSYSTEM_DEF(stickyban)
newdbcache["[query_stickybans.item[1]]"] = ban newdbcache["[query_stickybans.item[1]]"] = ban
while (query_stickyban_matches.NextRow()) if (!query_ckey_matches.last_error)
var/list/match = list() while (query_ckey_matches.NextRow())
var/list/match = list()
match["stickyban"] = query_stickyban_matches.item[1] match["stickyban"] = query_ckey_matches.item[1]
match["matched_ckey"] = query_stickyban_matches.item[2] match["matched_ckey"] = query_ckey_matches.item[2]
match["first_matched"] = query_stickyban_matches.item[3] match["first_matched"] = query_ckey_matches.item[3]
match["exempt"] = text2num(query_stickyban_matches.item[4]) match["last_matched"] = query_ckey_matches.item[4]
match["exempt"] = text2num(query_ckey_matches.item[5])
var/ban = newdbcache[query_stickyban_matches.item[1]] var/ban = newdbcache[query_ckey_matches.item[1]]
if (!ban) if (!ban)
continue continue
var/keys = ban[query_stickyban_matches.item[4] ? "whitelist" : "keys"] var/keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"]
if (!keys) if (!keys)
keys = ban[query_stickyban_matches.item[4] ? "whitelist" : "keys"] = list() keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"] = list()
keys[query_stickyban_matches.item[2]] = match keys[query_ckey_matches.item[2]] = match
if (!query_cid_matches.last_error)
while (query_cid_matches.NextRow())
var/list/match = list()
match["stickyban"] = query_cid_matches.item[1]
match["matched_cid"] = query_cid_matches.item[2]
match["first_matched"] = query_cid_matches.item[3]
match["last_matched"] = query_cid_matches.item[4]
var/ban = newdbcache[query_cid_matches.item[1]]
if (!ban)
continue
var/computer_ids = ban["computer_id"]
if (!computer_ids)
computer_ids = ban["computer_id"] = list()
computer_ids[query_cid_matches.item[2]] = match
if (!query_ip_matches.last_error)
while (query_ip_matches.NextRow())
var/list/match = list()
match["stickyban"] = query_ip_matches.item[1]
match["matched_ip"] = query_ip_matches.item[2]
match["first_matched"] = query_ip_matches.item[3]
match["last_matched"] = query_ip_matches.item[4]
var/ban = newdbcache[query_ip_matches.item[1]]
if (!ban)
continue
var/IPs = ban["IP"]
if (!IPs)
IPs = ban["IP"] = list()
IPs[query_ip_matches.item[2]] = match
dbcache = newdbcache dbcache = newdbcache
dbcacheexpire = world.time+STICKYBAN_DB_CACHE_TIME dbcacheexpire = world.time+STICKYBAN_DB_CACHE_TIME
qdel(query_stickybans)
qdel(query_ckey_matches)
qdel(query_cid_matches)
qdel(query_ip_matches)
/datum/controller/subsystem/stickyban/proc/import_to_db(ckey, list/ban)
/datum/controller/subsystem/stickyban/proc/import_raw_stickyban_to_db(ckey, list/ban)
. = FALSE . = FALSE
if (!ban["admin"]) if (!ban["admin"])
ban["admin"] = "LEGACY" ban["admin"] = "LEGACY"
if (!ban["message"]) if (!ban["message"])
ban["message"] = "Evasion" ban["message"] = "Evasion"
var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(ban["message"])]', '[sanitizeSQL(ban["admin"])]')") var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery("INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(ban["message"])]', '[sanitizeSQL(ban["admin"])]')")
if (!query_create_stickyban.warn_execute()) if (!query_create_stickyban.warn_execute())
qdel(query_create_stickyban)
return return
qdel(query_create_stickyban)
var/list/sqlkeys = list() var/list/sqlckeys = list()
var/list/sqlcids = list()
var/list/sqlips = list()
if (ban["keys"]) if (ban["keys"])
var/list/keys = splittext(ban["keys"], ",") var/list/keys = splittext(ban["keys"], ",")
for (var/key in keys) for (var/key in keys)
var/list/sqlkey = list() var/list/sqlckey = list()
sqlkey["stickyban"] = "'[sanitizeSQL(ckey)]'" sqlckey["stickyban"] = "'[sanitizeSQL(ckey)]'"
sqlkey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'" sqlckey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
sqlkey["exempt"] = FALSE sqlckey["exempt"] = FALSE
sqlkeys += sqlkey sqlckeys[++sqlckeys.len] = sqlckey
if (ban["whitelist"]) if (ban["whitelist"])
var/list/keys = splittext(ban["whitelist"], ",") var/list/keys = splittext(ban["whitelist"], ",")
for (var/key in keys) for (var/key in keys)
var/list/sqlkey = list() var/list/sqlckey = list()
sqlkey["stickyban"] = "'[sanitizeSQL(ckey)]'" sqlckey["stickyban"] = "'[sanitizeSQL(ckey)]'"
sqlkey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'" sqlckey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
sqlkey["exempt"] = TRUE sqlckey["exempt"] = TRUE
sqlkeys += sqlkey sqlckeys[++sqlckeys.len] = sqlckey
if (length(sqlkeys)) if (ban["computer_id"])
SSdbcore.MassInsert(format_table_name("stickyban_matched_ckey"), sqlkeys, FALSE, TRUE) var/list/cids = splittext(ban["computer_id"], ",")
for (var/cid in cids)
var/list/sqlcid = list()
sqlcid["stickyban"] = "'[sanitizeSQL(ckey)]'"
sqlcid["matched_cid"] = "'[sanitizeSQL(cid)]'"
sqlcids[++sqlcids.len] = sqlcid
if (ban["IP"])
var/list/ips = splittext(ban["IP"], ",")
for (var/ip in ips)
var/list/sqlip = list()
sqlip["stickyban"] = "'[sanitizeSQL(ckey)]'"
sqlip["matched_ip"] = "'[sanitizeSQL(ip)]'"
sqlips[++sqlips.len] = sqlip
if (length(sqlckeys))
SSdbcore.MassInsert(format_table_name("stickyban_matched_ckey"), sqlckeys, FALSE, TRUE)
if (length(sqlcids))
SSdbcore.MassInsert(format_table_name("stickyban_matched_cid"), sqlcids, FALSE, TRUE)
if (length(sqlips))
SSdbcore.MassInsert(format_table_name("stickyban_matched_ip"), sqlips, FALSE, TRUE)
return TRUE return TRUE

View File

@@ -20,6 +20,8 @@ GLOBAL_VAR(restart_counter)
config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER]) config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER])
load_admins()
//SetupLogs depends on the RoundID, so lets check //SetupLogs depends on the RoundID, so lets check
//DB schema and set RoundID if we can //DB schema and set RoundID if we can
SSdbcore.CheckSchemaVersion() SSdbcore.CheckSchemaVersion()
@@ -30,7 +32,6 @@ GLOBAL_VAR(restart_counter)
world.log = file("[GLOB.log_directory]/dd.log") world.log = file("[GLOB.log_directory]/dd.log")
#endif #endif
load_admins()
LoadVerbs(/datum/verbs/menu) LoadVerbs(/datum/verbs/menu)
if(CONFIG_GET(flag/usewhitelist)) if(CONFIG_GET(flag/usewhitelist))
load_whitelist() load_whitelist()

View File

@@ -14,15 +14,10 @@
log_access("Failed Login (invalid data): [key] [address]-[computer_id]") log_access("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)")
if (text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.)")
var/admin = FALSE var/admin = FALSE
var/ckey = ckey(key) var/ckey = ckey(key)
//isBanned can get re-called on a user in certain situations, this prevents that leading to repeated messages to admins. //IsBanned can get re-called on a user in certain situations, this prevents that leading to repeated messages to admins.
var/static/list/checkedckeys = list() var/static/list/checkedckeys = list()
//magic voodo to check for a key in a list while also adding that key to the list without having to do two associated lookups //magic voodo to check for a key in a list while also adding that key to the list without having to do two associated lookups
var/message = !checkedckeys[ckey]++ var/message = !checkedckeys[ckey]++
@@ -90,7 +85,12 @@
return list("reason"="Banned","desc"="[desc]") return list("reason"="Banned","desc"="[desc]")
var/list/ban = ..() //default pager ban stuff var/list/ban = ..() //default pager ban stuff
if (ban) if (ban)
if (!admin)
. = ban
if (real_bans_only)
return
var/bannedckey = "ERROR" var/bannedckey = "ERROR"
if (ban["ckey"]) if (ban["ckey"])
bannedckey = ban["ckey"] bannedckey = ban["ckey"]
@@ -117,8 +117,6 @@
var/list/newmatches_connected = cachedban["existing_user_matches_this_round"] var/list/newmatches_connected = cachedban["existing_user_matches_this_round"]
var/list/newmatches_admin = cachedban["admin_matches_this_round"] var/list/newmatches_admin = cachedban["admin_matches_this_round"]
if (C) if (C)
newmatches_connected[ckey] = ckey newmatches_connected[ckey] = ckey
newmatches_connected = cachedban["existing_user_matches_this_round"] newmatches_connected = cachedban["existing_user_matches_this_round"]
@@ -138,7 +136,7 @@
newmatches.len+pendingmatches.len > STICKYBAN_MAX_MATCHES || \ newmatches.len+pendingmatches.len > STICKYBAN_MAX_MATCHES || \
newmatches_connected.len > STICKYBAN_MAX_EXISTING_USER_MATCHES || \ newmatches_connected.len > STICKYBAN_MAX_EXISTING_USER_MATCHES || \
newmatches_admin.len > STICKYBAN_MAX_ADMIN_MATCHES \ newmatches_admin.len > STICKYBAN_MAX_ADMIN_MATCHES \
) )
var/action var/action
if (ban["fromdb"]) if (ban["fromdb"])
@@ -168,14 +166,14 @@
world.SetConfig("ban", bannedckey, list2stickyban(cachedban)) world.SetConfig("ban", bannedckey, list2stickyban(cachedban))
return null return null
if (ban["fromdb"]) if (ban["fromdb"])
if(SSdbcore.Connect()) if(SSdbcore.Connect())
var/datum/DBQuery/query_add_ckey_match = SSdbcore.NewQuery("INSERT IGNORE INTO [format_table_name("stickyban_matched_ckey")] (matched_ckey, stickyban) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(bannedckey)]')") INVOKE_ASYNC(SSdbcore, /datum/controller/subsystem/dbcore/proc.QuerySelect, list(
query_add_ckey_match.warn_execute() SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban_matched_ckey")] (matched_ckey, stickyban) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(bannedckey)]') ON DUPLICATE KEY UPDATE last_matched = now()"),
var/datum/DBQuery/query_add_ip_match = SSdbcore.NewQuery("INSERT IGNORE INTO [format_table_name("stickyban_matched_ip")] (matched_ip, stickyban) VALUES ('[sanitizeSQL(address)]', '[sanitizeSQL(bannedckey)]')") SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban_matched_ip")] (matched_ip, stickyban) VALUES ( INET_ATON('[sanitizeSQL(address)]'), '[sanitizeSQL(bannedckey)]') ON DUPLICATE KEY UPDATE last_matched = now()"),
query_add_ip_match.warn_execute() SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban_matched_cid")] (matched_cid, stickyban) VALUES ('[sanitizeSQL(computer_id)]', '[sanitizeSQL(bannedckey)]') ON DUPLICATE KEY UPDATE last_matched = now()")
var/datum/DBQuery/query_add_cid_match = SSdbcore.NewQuery("INSERT IGNORE INTO [format_table_name("stickyban_matched_cid")] (matched_cid, stickyban) VALUES ('[sanitizeSQL(computer_id)]', '[sanitizeSQL(bannedckey)]')") ), FALSE, TRUE)
query_add_cid_match.warn_execute()
//byond will not trigger isbanned() for "global" host bans, //byond will not trigger isbanned() for "global" host bans,
//ie, ones where the "apply to this game only" checkbox is not checked (defaults to not checked) //ie, ones where the "apply to this game only" checkbox is not checked (defaults to not checked)

View File

@@ -32,12 +32,19 @@
return return
ban["message"] = "[reason]" ban["message"] = "[reason]"
world.SetConfig("ban",ckey,list2stickyban(ban))
SSstickyban.cache[ckey] = ban
if(SSdbcore.Connect()) if(SSdbcore.Connect())
var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(ban["message"])]', '[sanitizeSQL(usr.ckey)]')") var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery("INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ('[sanitizeSQL(ckey)]', '[sanitizeSQL(ban["message"])]', '[sanitizeSQL(usr.ckey)]')")
query_create_stickyban.warn_execute() if (query_create_stickyban.warn_execute())
ban["fromdb"] = TRUE
qdel(query_create_stickyban)
world.SetConfig("ban",ckey,list2stickyban(ban))
ban = stickyban2list(list2stickyban(ban))
ban["matches_this_round"] = list()
ban["existing_user_matches_this_round"] = list()
ban["admin_matches_this_round"] = list()
ban["pending_matches_this_round"] = list()
SSstickyban.cache[ckey] = ban
log_admin_private("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") log_admin_private("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]</span>")
@@ -60,10 +67,13 @@
SSstickyban.cache -= ckey SSstickyban.cache -= ckey
if (SSdbcore.Connect()) if (SSdbcore.Connect())
var/datum/DBQuery/query_remove_stickyban = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = '[sanitizeSQL(ckey)]'") SSdbcore.QuerySelect(list(
query_remove_stickyban.warn_execute() SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = '[sanitizeSQL(ckey)]'"),
var/datum/DBQuery/query_remove_stickyban_alts = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]'") SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]'"),
query_remove_stickyban_alts.warn_execute() SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = '[sanitizeSQL(ckey)]'"),
SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = '[sanitizeSQL(ckey)]'")
), warn = TRUE, qdel = TRUE)
log_admin_private("[key_name(usr)] removed [ckey]'s stickyban") log_admin_private("[key_name(usr)] removed [ckey]'s stickyban")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [ckey]'s stickyban</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [ckey]'s stickyban</span>")
@@ -108,6 +118,7 @@
if (SSdbcore.Connect()) if (SSdbcore.Connect())
var/datum/DBQuery/query_remove_stickyban_alt = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'") var/datum/DBQuery/query_remove_stickyban_alt = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'")
query_remove_stickyban_alt.warn_execute() query_remove_stickyban_alt.warn_execute()
qdel(query_remove_stickyban_alt)
log_admin_private("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban") log_admin_private("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban</span>")
@@ -138,6 +149,7 @@
if (SSdbcore.Connect()) if (SSdbcore.Connect())
var/datum/DBQuery/query_edit_stickyban = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban")] SET reason = '[sanitizeSQL(reason)]' WHERE ckey = '[sanitizeSQL(ckey)]'") var/datum/DBQuery/query_edit_stickyban = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban")] SET reason = '[sanitizeSQL(reason)]' WHERE ckey = '[sanitizeSQL(ckey)]'")
query_edit_stickyban.warn_execute() query_edit_stickyban.warn_execute()
qdel(query_edit_stickyban)
log_admin_private("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") log_admin_private("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]</span>")
@@ -181,9 +193,10 @@
SSstickyban.cache[ckey] = ban SSstickyban.cache[ckey] = ban
if (!SSdbcore.Connect()) if (SSdbcore.Connect())
var/datum/DBQuery/query_exempt_stickyban_alt = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'") var/datum/DBQuery/query_exempt_stickyban_alt = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'")
query_exempt_stickyban_alt.warn_execute() query_exempt_stickyban_alt.warn_execute()
qdel(query_exempt_stickyban_alt)
log_admin_private("[key_name(usr)] has exempted [alt] from [ckey]'s sticky ban") log_admin_private("[key_name(usr)] has exempted [alt] from [ckey]'s sticky ban")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has exempted [alt] from [ckey]'s sticky ban</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has exempted [alt] from [ckey]'s sticky ban</span>")
@@ -228,9 +241,9 @@
SSstickyban.cache[ckey] = ban SSstickyban.cache[ckey] = ban
if (SSdbcore.Connect()) if (SSdbcore.Connect())
var/datum/DBQuery/query_unexempt_stickyban_alt = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'") var/datum/DBQuery/query_unexempt_stickyban_alt = SSdbcore.NewQuery("UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = '[sanitizeSQL(ckey)]' AND matched_ckey = '[sanitizeSQL(alt)]'")
query_unexempt_stickyban_alt.warn_execute() query_unexempt_stickyban_alt.warn_execute()
qdel(query_unexempt_stickyban_alt)
log_admin_private("[key_name(usr)] has unexempted [alt] from [ckey]'s sticky ban") log_admin_private("[key_name(usr)] has unexempted [alt] from [ckey]'s sticky ban")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has unexempted [alt] from [ckey]'s sticky ban</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has unexempted [alt] from [ckey]'s sticky ban</span>")
@@ -287,8 +300,8 @@
world.SetConfig("ban",ckey,list2stickyban(ban)) world.SetConfig("ban",ckey,list2stickyban(ban))
log_admin_private("[key_name(usr)] has put [ckey]'s sticky ban on timeout.") log_admin_private("[key_name(usr)] has taken [ckey]'s sticky ban off of timeout.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [ckey]'s sticky ban on timeout.</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has taken [ckey]'s sticky ban off of timeout.</span>")
if ("revert") if ("revert")
@@ -321,9 +334,10 @@
var/timeout var/timeout
if (SSdbcore.Connect()) if (SSdbcore.Connect())
timeout = "<a href='?_src_=holder;[HrefToken()];stickyban=[(ban["timeout"] ? "untimeout" : "timeout")]&ckey=[ckey]'>\[[(ban["timeout"] ? "untimeout" : "timeout" )]\]</a>" timeout = "<a href='?_src_=holder;[HrefToken()];stickyban=[(ban["timeout"] ? "untimeout" : "timeout")]&ckey=[ckey]'>\[[(ban["timeout"] ? "untimeout" : "timeout" )]\]</a>"
else
timeout = "<a href='?_src_=holder;[HrefToken()];stickyban=revert&ckey=[ckey]'>\[revert\]</a>"
. = list({" . = list({"
<a href='?_src_=holder;[HrefToken()];stickyban=remove&ckey=[ckey]'>\[-\]</a> <a href='?_src_=holder;[HrefToken()];stickyban=remove&ckey=[ckey]'>\[-\]</a>
<a href='?_src_=holder;[HrefToken()];stickyban=revert&ckey=[ckey]'>\[revert\]</a>
[timeout] [timeout]
<b>[ckey]</b> <b>[ckey]</b>
<br />" <br />"
@@ -334,16 +348,16 @@
else else
. += "LEGACY<br />" . += "LEGACY<br />"
. += "Caught keys<br />\n<ol>" . += "Caught keys<br />\n<ol>"
var/banned_keys = list() for (var/key in ban["keys"])
if (ban["keys"])
banned_keys += ban["keys"]
if (ban["whitelist"])
banned_keys += ban["whitelist"]
for (var/key in banned_keys)
if (ckey(key) == ckey) if (ckey(key) == ckey)
continue continue
var/exempt = "<a href='?_src_=holder;[HrefToken()];stickyban=[(ban["keys"][key]["exempt"] ? "unexempt" : "exempt")]&ckey=[ckey]&alt=[ckey(key)]'>\[[(ban["keys"][key]["exempt"] ? "UE" : "E")]\]</a>" . += "<li><a href='?_src_=holder;[HrefToken()];stickyban=remove_alt&ckey=[ckey]&alt=[ckey(key)]'>\[-\]</a>[key]<a href='?_src_=holder;[HrefToken()];stickyban=exempt&ckey=[ckey]&alt=[ckey(key)]'>\[E\]</a></li>"
. += "<li><a href='?_src_=holder;[HrefToken()];stickyban=remove_alt&ckey=[ckey]&alt=[ckey(key)]'>\[-\]</a>[key][exempt]</li>"
for (var/key in ban["whitelist"])
if (ckey(key) == ckey)
continue
. += "<li><a href='?_src_=holder;[HrefToken()];stickyban=remove_alt&ckey=[ckey]&alt=[ckey(key)]'>\[-\]</a>[key]<a href='?_src_=holder;[HrefToken()];stickyban=unexempt&ckey=[ckey]&alt=[ckey(key)]'>\[UE\]</a></li>"
. += "</ol>\n" . += "</ol>\n"
/datum/admins/proc/stickyban_show() /datum/admins/proc/stickyban_show()

View File

@@ -158,7 +158,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
var/list/row = src.connectionHistory[i] var/list/row = src.connectionHistory[i]
if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object
return return
if (world.IsBanned(row["ckey"], row["compid"], row["ip"], real_bans_only=TRUE)) if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE))
found = row found = row
break break