mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-09 16:09:15 +00:00
dbstickybans: Qdeleting queries, misc fixes, Query select proc for executing mutiple queries at once...
This commit is contained in:
@@ -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.
|
||||
|
||||
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);
|
||||
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.
|
||||
|
||||
CREATE TABLE `stickyban` (
|
||||
@@ -24,7 +24,8 @@ CREATE TABLE `stickyban` (
|
||||
CREATE TABLE `stickyban_matched_ckey` (
|
||||
`stickyban` 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',
|
||||
PRIMARY KEY (`stickyban`, `matched_ckey`)
|
||||
) ENGINE=InnoDB;
|
||||
@@ -32,14 +33,16 @@ CREATE TABLE `stickyban_matched_ckey` (
|
||||
CREATE TABLE `stickyban_matched_ip` (
|
||||
`stickyban` VARCHAR(32) 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`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `stickyban_matched_cid` (
|
||||
`stickyban` VARCHAR(32) NOT NULL,
|
||||
`matched_cid` INT UNSIGNED NOT NULL,
|
||||
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`matched_cid` VARCHAR(32) NOT NULL,
|
||||
`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`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
|
||||
@@ -465,10 +465,10 @@ $$
|
||||
DELIMITER ;
|
||||
|
||||
--
|
||||
-- Table structure for table `SS13_stickyban`
|
||||
-- Table structure for table `stickyban`
|
||||
--
|
||||
DROP TABLE IF EXISTS `SS13_stickyban`;
|
||||
CREATE TABLE `SS13_stickyban` (
|
||||
DROP TABLE IF EXISTS `stickyban`;
|
||||
CREATE TABLE `stickyban` (
|
||||
`ckey` VARCHAR(32) NOT NULL,
|
||||
`reason` VARCHAR(2048) NOT NULL,
|
||||
`banning_admin` VARCHAR(32) NOT NULL,
|
||||
@@ -477,13 +477,14 @@ CREATE TABLE `SS13_stickyban` (
|
||||
) 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` (
|
||||
`stickyban` 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',
|
||||
PRIMARY KEY (`stickyban`, `matched_ckey`)
|
||||
) ENGINE=InnoDB;
|
||||
@@ -495,18 +496,20 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ip`;
|
||||
CREATE TABLE `ss13_stickyban_matched_ip` (
|
||||
`stickyban` VARCHAR(32) 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`)
|
||||
) 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`;
|
||||
CREATE TABLE `ss13_stickyban_matched_cid` (
|
||||
DROP TABLE IF EXISTS `stickyban_matched_cid`;
|
||||
CREATE TABLE `stickyban_matched_cid` (
|
||||
`stickyban` VARCHAR(32) NOT NULL,
|
||||
`matched_cid` INT UNSIGNED NOT NULL,
|
||||
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`matched_cid` VARCHAR(32) NOT NULL,
|
||||
`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`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
|
||||
@@ -483,7 +483,8 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ckey`;
|
||||
CREATE TABLE `ss13_stickyban_matched_ckey` (
|
||||
`stickyban` 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',
|
||||
PRIMARY KEY (`stickyban`, `matched_ckey`)
|
||||
) ENGINE=InnoDB;
|
||||
@@ -495,7 +496,8 @@ DROP TABLE IF EXISTS `ss13_stickyban_matched_ip`;
|
||||
CREATE TABLE `ss13_stickyban_matched_ip` (
|
||||
`stickyban` VARCHAR(32) 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`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
@@ -505,8 +507,9 @@ CREATE TABLE `ss13_stickyban_matched_ip` (
|
||||
DROP TABLE IF EXISTS `ss13_stickyban_matched_cid`;
|
||||
CREATE TABLE `ss13_stickyban_matched_cid` (
|
||||
`stickyban` VARCHAR(32) NOT NULL,
|
||||
`matched_cid` INT UNSIGNED NOT NULL,
|
||||
`first_matched` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`matched_cid` VARCHAR(32) NOT NULL,
|
||||
`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`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
|
||||
@@ -83,4 +83,4 @@
|
||||
#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_ROGUE_CHECK_TIME 5 SECONDS
|
||||
#define STICKYBAN_ROGUE_CHECK_TIME 5
|
||||
@@ -177,6 +177,27 @@ SUBSYSTEM_DEF(dbcore)
|
||||
return FALSE
|
||||
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.
|
||||
Rows missing columns present in other rows will resolve to SQL NULL
|
||||
|
||||
@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(stickyban)
|
||||
|
||||
var/list/ban = params2list(world.GetConfig("ban", oldban))
|
||||
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")
|
||||
continue
|
||||
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/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())
|
||||
return
|
||||
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")
|
||||
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")
|
||||
if (!query_stickyban_matches.warn_execute())
|
||||
SSdbcore.QuerySelect(list(query_stickybans, query_ckey_matches, query_cid_matches, query_ip_matches))
|
||||
|
||||
if (query_stickybans.last_error)
|
||||
qdel(query_stickybans)
|
||||
qdel(query_ckey_matches)
|
||||
qdel(query_cid_matches)
|
||||
qdel(query_ip_matches)
|
||||
return
|
||||
|
||||
while (query_stickybans.NextRow())
|
||||
@@ -75,59 +81,127 @@ SUBSYSTEM_DEF(stickyban)
|
||||
newdbcache["[query_stickybans.item[1]]"] = ban
|
||||
|
||||
|
||||
while (query_stickyban_matches.NextRow())
|
||||
var/list/match = list()
|
||||
if (!query_ckey_matches.last_error)
|
||||
while (query_ckey_matches.NextRow())
|
||||
var/list/match = list()
|
||||
|
||||
match["stickyban"] = query_stickyban_matches.item[1]
|
||||
match["matched_ckey"] = query_stickyban_matches.item[2]
|
||||
match["first_matched"] = query_stickyban_matches.item[3]
|
||||
match["exempt"] = text2num(query_stickyban_matches.item[4])
|
||||
match["stickyban"] = query_ckey_matches.item[1]
|
||||
match["matched_ckey"] = query_ckey_matches.item[2]
|
||||
match["first_matched"] = query_ckey_matches.item[3]
|
||||
match["last_matched"] = query_ckey_matches.item[4]
|
||||
match["exempt"] = text2num(query_ckey_matches.item[5])
|
||||
|
||||
var/ban = newdbcache[query_stickyban_matches.item[1]]
|
||||
if (!ban)
|
||||
continue
|
||||
var/keys = ban[query_stickyban_matches.item[4] ? "whitelist" : "keys"]
|
||||
if (!keys)
|
||||
keys = ban[query_stickyban_matches.item[4] ? "whitelist" : "keys"] = list()
|
||||
keys[query_stickyban_matches.item[2]] = match
|
||||
var/ban = newdbcache[query_ckey_matches.item[1]]
|
||||
if (!ban)
|
||||
continue
|
||||
var/keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"]
|
||||
if (!keys)
|
||||
keys = ban[text2num(query_ckey_matches.item[5]) ? "whitelist" : "keys"] = list()
|
||||
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
|
||||
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
|
||||
if (!ban["admin"])
|
||||
ban["admin"] = "LEGACY"
|
||||
if (!ban["message"])
|
||||
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())
|
||||
qdel(query_create_stickyban)
|
||||
return
|
||||
qdel(query_create_stickyban)
|
||||
|
||||
var/list/sqlkeys = list()
|
||||
var/list/sqlckeys = list()
|
||||
var/list/sqlcids = list()
|
||||
var/list/sqlips = list()
|
||||
|
||||
if (ban["keys"])
|
||||
var/list/keys = splittext(ban["keys"], ",")
|
||||
for (var/key in keys)
|
||||
var/list/sqlkey = list()
|
||||
sqlkey["stickyban"] = "'[sanitizeSQL(ckey)]'"
|
||||
sqlkey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
|
||||
sqlkey["exempt"] = FALSE
|
||||
sqlkeys += sqlkey
|
||||
var/list/sqlckey = list()
|
||||
sqlckey["stickyban"] = "'[sanitizeSQL(ckey)]'"
|
||||
sqlckey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
|
||||
sqlckey["exempt"] = FALSE
|
||||
sqlckeys[++sqlckeys.len] = sqlckey
|
||||
|
||||
if (ban["whitelist"])
|
||||
var/list/keys = splittext(ban["whitelist"], ",")
|
||||
for (var/key in keys)
|
||||
var/list/sqlkey = list()
|
||||
sqlkey["stickyban"] = "'[sanitizeSQL(ckey)]'"
|
||||
sqlkey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
|
||||
sqlkey["exempt"] = TRUE
|
||||
sqlkeys += sqlkey
|
||||
var/list/sqlckey = list()
|
||||
sqlckey["stickyban"] = "'[sanitizeSQL(ckey)]'"
|
||||
sqlckey["matched_ckey"] = "'[sanitizeSQL(ckey(key))]'"
|
||||
sqlckey["exempt"] = TRUE
|
||||
sqlckeys[++sqlckeys.len] = sqlckey
|
||||
|
||||
if (length(sqlkeys))
|
||||
SSdbcore.MassInsert(format_table_name("stickyban_matched_ckey"), sqlkeys, FALSE, TRUE)
|
||||
if (ban["computer_id"])
|
||||
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
|
||||
|
||||
@@ -20,6 +20,8 @@ GLOBAL_VAR(restart_counter)
|
||||
|
||||
config.Load(params[OVERRIDE_CONFIG_DIRECTORY_PARAMETER])
|
||||
|
||||
load_admins()
|
||||
|
||||
//SetupLogs depends on the RoundID, so lets check
|
||||
//DB schema and set RoundID if we can
|
||||
SSdbcore.CheckSchemaVersion()
|
||||
@@ -30,7 +32,6 @@ GLOBAL_VAR(restart_counter)
|
||||
world.log = file("[GLOB.log_directory]/dd.log")
|
||||
#endif
|
||||
|
||||
load_admins()
|
||||
LoadVerbs(/datum/verbs/menu)
|
||||
if(CONFIG_GET(flag/usewhitelist))
|
||||
load_whitelist()
|
||||
|
||||
@@ -14,15 +14,10 @@
|
||||
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.)")
|
||||
|
||||
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/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()
|
||||
//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]++
|
||||
@@ -90,7 +85,12 @@
|
||||
return list("reason"="Banned","desc"="[desc]")
|
||||
|
||||
var/list/ban = ..() //default pager ban stuff
|
||||
|
||||
if (ban)
|
||||
if (!admin)
|
||||
. = ban
|
||||
if (real_bans_only)
|
||||
return
|
||||
var/bannedckey = "ERROR"
|
||||
if (ban["ckey"])
|
||||
bannedckey = ban["ckey"]
|
||||
@@ -117,8 +117,6 @@
|
||||
var/list/newmatches_connected = cachedban["existing_user_matches_this_round"]
|
||||
var/list/newmatches_admin = cachedban["admin_matches_this_round"]
|
||||
|
||||
|
||||
|
||||
if (C)
|
||||
newmatches_connected[ckey] = ckey
|
||||
newmatches_connected = cachedban["existing_user_matches_this_round"]
|
||||
@@ -138,7 +136,7 @@
|
||||
newmatches.len+pendingmatches.len > STICKYBAN_MAX_MATCHES || \
|
||||
newmatches_connected.len > STICKYBAN_MAX_EXISTING_USER_MATCHES || \
|
||||
newmatches_admin.len > STICKYBAN_MAX_ADMIN_MATCHES \
|
||||
)
|
||||
)
|
||||
|
||||
var/action
|
||||
if (ban["fromdb"])
|
||||
@@ -168,14 +166,14 @@
|
||||
world.SetConfig("ban", bannedckey, list2stickyban(cachedban))
|
||||
return null
|
||||
|
||||
if (ban["fromdb"])
|
||||
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)]')")
|
||||
query_add_ckey_match.warn_execute()
|
||||
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)]')")
|
||||
query_add_ip_match.warn_execute()
|
||||
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)]')")
|
||||
query_add_cid_match.warn_execute()
|
||||
if (ban["fromdb"])
|
||||
if(SSdbcore.Connect())
|
||||
INVOKE_ASYNC(SSdbcore, /datum/controller/subsystem/dbcore/proc.QuerySelect, list(
|
||||
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()"),
|
||||
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()"),
|
||||
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()")
|
||||
), FALSE, TRUE)
|
||||
|
||||
|
||||
//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)
|
||||
|
||||
@@ -32,12 +32,19 @@
|
||||
return
|
||||
ban["message"] = "[reason]"
|
||||
|
||||
world.SetConfig("ban",ckey,list2stickyban(ban))
|
||||
SSstickyban.cache[ckey] = ban
|
||||
|
||||
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)]')")
|
||||
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"]]")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]</span>")
|
||||
@@ -60,10 +67,13 @@
|
||||
SSstickyban.cache -= ckey
|
||||
|
||||
if (SSdbcore.Connect())
|
||||
var/datum/DBQuery/query_remove_stickyban = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = '[sanitizeSQL(ckey)]'")
|
||||
query_remove_stickyban.warn_execute()
|
||||
var/datum/DBQuery/query_remove_stickyban_alts = SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]'")
|
||||
query_remove_stickyban_alts.warn_execute()
|
||||
SSdbcore.QuerySelect(list(
|
||||
SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = '[sanitizeSQL(ckey)]'"),
|
||||
SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = '[sanitizeSQL(ckey)]'"),
|
||||
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")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [ckey]'s stickyban</span>")
|
||||
@@ -108,6 +118,7 @@
|
||||
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)]'")
|
||||
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")
|
||||
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())
|
||||
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()
|
||||
qdel(query_edit_stickyban)
|
||||
|
||||
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>")
|
||||
@@ -181,9 +193,10 @@
|
||||
|
||||
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)]'")
|
||||
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")
|
||||
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
|
||||
|
||||
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)]'")
|
||||
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")
|
||||
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))
|
||||
|
||||
log_admin_private("[key_name(usr)] has put [ckey]'s sticky ban on timeout.")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [ckey]'s sticky ban on timeout.</span>")
|
||||
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 taken [ckey]'s sticky ban off of timeout.</span>")
|
||||
|
||||
|
||||
if ("revert")
|
||||
@@ -321,9 +334,10 @@
|
||||
var/timeout
|
||||
if (SSdbcore.Connect())
|
||||
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({"
|
||||
<a href='?_src_=holder;[HrefToken()];stickyban=remove&ckey=[ckey]'>\[-\]</a>
|
||||
<a href='?_src_=holder;[HrefToken()];stickyban=revert&ckey=[ckey]'>\[revert\]</a>
|
||||
[timeout]
|
||||
<b>[ckey]</b>
|
||||
<br />"
|
||||
@@ -334,16 +348,16 @@
|
||||
else
|
||||
. += "LEGACY<br />"
|
||||
. += "Caught keys<br />\n<ol>"
|
||||
var/banned_keys = list()
|
||||
if (ban["keys"])
|
||||
banned_keys += ban["keys"]
|
||||
if (ban["whitelist"])
|
||||
banned_keys += ban["whitelist"]
|
||||
for (var/key in banned_keys)
|
||||
for (var/key in ban["keys"])
|
||||
if (ckey(key) == ckey)
|
||||
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][exempt]</li>"
|
||||
. += "<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>"
|
||||
|
||||
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"
|
||||
|
||||
/datum/admins/proc/stickyban_show()
|
||||
|
||||
@@ -158,7 +158,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
|
||||
var/list/row = src.connectionHistory[i]
|
||||
if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object
|
||||
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
|
||||
break
|
||||
|
||||
|
||||
Reference in New Issue
Block a user