From 60b70c43ce4e98e6a85f9951aa8c2dfcd1f330dc Mon Sep 17 00:00:00 2001 From: harryob <55142896+harryob@users.noreply.github.com> Date: Sun, 17 Sep 2023 09:02:25 +0100 Subject: [PATCH 01/44] sticky n perm --- code/__DEFINES/subsystems.dm | 5 +- code/controllers/subsystem/stickyban.dm | 84 +++++++++++++++++++++++ code/datums/entities/player_sticky_ban.dm | 59 ++++++++++++++++ code/game/world.dm | 17 ----- colonialmarines.dme | 1 + 5 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 code/controllers/subsystem/stickyban.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8a65a4b961ff..e437e6b682f1 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,8 +161,9 @@ #define SS_INIT_DATABASE -27 #define SS_INIT_ENTITYMANAGER -28 #define SS_INIT_PLAYTIME -29 -#define SS_INIT_PREDSHIPS -30 -#define SS_INIT_OBJECTIVES -31 +#define SS_INIT_STICKY -30 +#define SS_INIT_PREDSHIPS -31 +#define SS_INIT_OBJECTIVES -32 #define SS_INIT_MINIMAP -34 #define SS_INIT_STATPANELS -98 #define SS_INIT_CHAT -100 //Should be last to ensure chat remains smooth during init. diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm new file mode 100644 index 000000000000..6055af3f6290 --- /dev/null +++ b/code/controllers/subsystem/stickyban.dm @@ -0,0 +1,84 @@ +SUBSYSTEM_DEF(sticky_ban) + name = "Sticky Ban" + init_order = SS_INIT_STICKY + flags = SS_NO_FIRE + + var/list/active_sticky + +/datum/controller/subsystem/sticky_ban/Initialize() + for(var/existing_ban in world.GetConfig("ban")) + var/ckey = ckey(existing_ban) + + var/list/ban_data = params2list(world.GetConfig("ban", existing_ban)) + + if(ckey != existing_ban) + if(!ban_data["database_ban"]) + import_sticky(code = existing_ban, ban_data = ban_data) + continue + + if(!ban_data["database_ban"]) + import_sticky(ckey, ban_data) + + world.SetConfig("ban", existing_ban, null) + +/datum/controller/subsystem/sticky_ban/proc/import_sticky(ckey, code, list/ban_data) + if(!ban_data["message"]) + ban_data["message"] = "Evasion" + + if(!ckey) + var/list/keys = splittext(ban_data["keys"], ",") + ckey = keys[1] + + var/datum/entity/stickyban/new_sticky = DB_ENTITY(/datum/entity/stickyban) + new_sticky.ckey = ckey + + new_sticky.reason = ban_data["reason"] + new_sticky.message = ban_data["message"] + new_sticky.sticky = ban_data["sticky"] + + new_sticky.date = "LEGACY" + + new_sticky.save() + + if(ban_data["keys"]) + var/list/keys = splittext(ban_data["keys"], ",") + for(var/key in keys) + var/datum/entity/stickyban_matched_ckey/matched_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) + + matched_ckey.ckey = key + matched_ckey.linked_stickyban = new_sticky.id + + matched_ckey.save() + + if(ban_data["whitelist"]) + var/list/keys = splittext(ban_data["whitelist"], ",") + for(var/key in keys) + var/datum/entity/stickyban_matched_ckey/whitelisted_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) + + whitelisted_ckey.ckey = key + whitelisted_ckey.linked_stickyban = new_sticky.id + whitelisted_ckey.whitelisted = TRUE + + whitelisted_ckey.save() + + if(ban_data["computer_id"]) + var/list/cids = splittext(ban_data["computer_id"], ",") + for(var/cid in cids) + var/datum/entity/stickyban_matched_cid/matched_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid) + + matched_cid.cid = cid + matched_cid.linked_stickyban = new_sticky.id + + matched_cid.save() + + if(ban_data["IP"]) + var/list/ips = splittext(ban_data["IP"], ",") + for(var/ip in ips) + var/datum/entity/stickyban_matched_ip/matched_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip) + + matched_ip.ip = ip + matched_ip.linked_stickyban = new_sticky.id + + matched_ip.save() + + diff --git a/code/datums/entities/player_sticky_ban.dm b/code/datums/entities/player_sticky_ban.dm index d79befddb04e..6b90242faeae 100644 --- a/code/datums/entities/player_sticky_ban.dm +++ b/code/datums/entities/player_sticky_ban.dm @@ -1,3 +1,62 @@ +/datum/entity/stickyban + var/ckey + var/reason + var/message + var/date + var/sticky + + var/linked_permaban + +/datum/entity_meta/stickyban + entity_type = /datum/entity/stickyban + table_name = "stickyban" + field_types = list( + "ckey" = DB_FIELDTYPE_STRING_LARGE, + "reason" = DB_FIELDTYPE_STRING_LARGE, + "message" = DB_FIELDTYPE_STRING_LARGE, + "date" = DB_FIELDTYPE_STRING_LARGE, + "sticky" = DB_FIELDTYPE_INT, + "linked_permaban" = DB_FIELDTYPE_BIGINT, + ) + +/datum/entity/stickyban_matched_ckey + var/ckey + var/linked_stickyban + var/whitelisted = FALSE + +/datum/entity_meta/stickyban_matched_ckey + entity_type = /datum/entity/stickyban_matched_ckey + table_name = "stickyban_matched_ckey" + field_types = list( + "ckey" = DB_FIELDTYPE_STRING_LARGE, + "linked_stickyban" = DB_FIELDTYPE_BIGINT, + "whitelisted" = DB_FIELDTYPE_INT, + ) + +/datum/entity/stickyban_matched_cid + var/cid + var/linked_stickyban + +/datum/entity_meta/stickyban_matched_cid + entity_type = /datum/entity/stickyban_matched_cid + table_name = "stickyban_matched_cid" + field_types = list( + "cid" = DB_FIELDTYPE_STRING_LARGE, + "linked_stickyban" = DB_FIELDTYPE_BIGINT, + ) + +/datum/entity/stickyban_matched_ip + var/ip + var/linked_stickyban + +/datum/entity_meta/stickyban_matched_ip + entity_type = /datum/entity/stickyban_matched_ip + table_name = "stickyban_matched_ip" + field_types = list( + "ip" = DB_FIELDTYPE_STRING_LARGE, + "linked_stickyban" = DB_FIELDTYPE_BIGINT, + ) + /datum/entity/player_sticky_ban var/player_id var/admin_id diff --git a/code/game/world.dm b/code/game/world.dm index cff799800a49..595549454b7d 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -59,13 +59,9 @@ var/list/reboot_sfx = file2list("config/reboot_sfx.txt") init_global_referenced_datums() - var/testing_locally = (world.params && world.params["local_test"]) - var/running_tests = (world.params && world.params["run_tests"]) #if defined(AUTOWIKI) || defined(UNIT_TESTS) running_tests = TRUE #endif - // Only do offline sleeping when the server isn't running unit tests or hosting a local dev test - sleep_offline = (!running_tests && !testing_locally) if(!RoleAuthority) RoleAuthority = new /datum/authority/branch/role() @@ -98,19 +94,6 @@ var/list/reboot_sfx = file2list("config/reboot_sfx.txt") if(CONFIG_GET(flag/ToRban)) ToRban_autoupdate() - // If the server's configured for local testing, get everything set up ASAP. - // Shamelessly stolen from the test manager's host_tests() proc - if(testing_locally) - master_mode = "Extended" - - // Wait for the game ticker to initialize - while(!SSticker.initialized) - sleep(10) - - // Start the game ASAP - SSticker.request_start() - return - var/world_topic_spam_protect_ip = "0.0.0.0" var/world_topic_spam_protect_time = world.timeofday diff --git a/colonialmarines.dme b/colonialmarines.dme index 79ddef81b976..1bb445f08802 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -280,6 +280,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\controllers\subsystem\stamina.dm" #include "code\controllers\subsystem\statpanel.dm" #include "code\controllers\subsystem\stats_collector.dm" +#include "code\controllers\subsystem\stickyban.dm" #include "code\controllers\subsystem\techtree.dm" #include "code\controllers\subsystem\teleporter.dm" #include "code\controllers\subsystem\tgui.dm" From c01e454b6a445e965665697cb749ebdef2ce4a3c Mon Sep 17 00:00:00 2001 From: harryob <55142896+harryob@users.noreply.github.com> Date: Tue, 19 Sep 2023 19:02:41 +0100 Subject: [PATCH 02/44] oh finally --- code/controllers/subsystem/stickyban.dm | 36 +++++++++++------------ code/datums/entities/player_sticky_ban.dm | 6 ++-- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 6055af3f6290..d5a96c50c5a2 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -1,44 +1,39 @@ -SUBSYSTEM_DEF(sticky_ban) +SUBSYSTEM_DEF(stickyban) name = "Sticky Ban" init_order = SS_INIT_STICKY flags = SS_NO_FIRE var/list/active_sticky -/datum/controller/subsystem/sticky_ban/Initialize() - for(var/existing_ban in world.GetConfig("ban")) - var/ckey = ckey(existing_ban) +/datum/controller/subsystem/stickyban/Initialize() + var/list/all_bans = world.GetConfig("ban") + for(var/existing_ban in all_bans) var/list/ban_data = params2list(world.GetConfig("ban", existing_ban)) - if(ckey != existing_ban) - if(!ban_data["database_ban"]) - import_sticky(code = existing_ban, ban_data = ban_data) - continue - if(!ban_data["database_ban"]) - import_sticky(ckey, ban_data) + import_sticky(existing_ban, ban_data) + continue world.SetConfig("ban", existing_ban, null) -/datum/controller/subsystem/sticky_ban/proc/import_sticky(ckey, code, list/ban_data) +/datum/controller/subsystem/stickyban/proc/import_sticky(identifier, list/ban_data) if(!ban_data["message"]) ban_data["message"] = "Evasion" - if(!ckey) - var/list/keys = splittext(ban_data["keys"], ",") - ckey = keys[1] - var/datum/entity/stickyban/new_sticky = DB_ENTITY(/datum/entity/stickyban) - new_sticky.ckey = ckey + new_sticky.identifier = identifier new_sticky.reason = ban_data["reason"] new_sticky.message = ban_data["message"] - new_sticky.sticky = ban_data["sticky"] + new_sticky.sticky = ban_data["type"] == "sticky" ? TRUE : FALSE new_sticky.date = "LEGACY" - new_sticky.save() + new_sticky.detach() + +/datum/entity_meta/stickyban/on_insert(datum/entity/stickyban/new_sticky) + var/list/ban_data = params2list(world.GetConfig("ban", new_sticky.identifier)) if(ban_data["keys"]) var/list/keys = splittext(ban_data["keys"], ",") @@ -49,6 +44,7 @@ SUBSYSTEM_DEF(sticky_ban) matched_ckey.linked_stickyban = new_sticky.id matched_ckey.save() + matched_ckey.detach() if(ban_data["whitelist"]) var/list/keys = splittext(ban_data["whitelist"], ",") @@ -60,6 +56,7 @@ SUBSYSTEM_DEF(sticky_ban) whitelisted_ckey.whitelisted = TRUE whitelisted_ckey.save() + whitelisted_ckey.detach() if(ban_data["computer_id"]) var/list/cids = splittext(ban_data["computer_id"], ",") @@ -70,6 +67,7 @@ SUBSYSTEM_DEF(sticky_ban) matched_cid.linked_stickyban = new_sticky.id matched_cid.save() + matched_cid.detach() if(ban_data["IP"]) var/list/ips = splittext(ban_data["IP"], ",") @@ -80,5 +78,7 @@ SUBSYSTEM_DEF(sticky_ban) matched_ip.linked_stickyban = new_sticky.id matched_ip.save() + matched_ip.detach() + world.SetConfig("ban", new_sticky.identifier, null) diff --git a/code/datums/entities/player_sticky_ban.dm b/code/datums/entities/player_sticky_ban.dm index 6b90242faeae..6de4f68bb009 100644 --- a/code/datums/entities/player_sticky_ban.dm +++ b/code/datums/entities/player_sticky_ban.dm @@ -1,9 +1,9 @@ /datum/entity/stickyban - var/ckey + var/identifier var/reason var/message var/date - var/sticky + var/sticky = TRUE var/linked_permaban @@ -11,7 +11,7 @@ entity_type = /datum/entity/stickyban table_name = "stickyban" field_types = list( - "ckey" = DB_FIELDTYPE_STRING_LARGE, + "identifier" = DB_FIELDTYPE_STRING_LARGE, "reason" = DB_FIELDTYPE_STRING_LARGE, "message" = DB_FIELDTYPE_STRING_LARGE, "date" = DB_FIELDTYPE_STRING_LARGE, From d712d26766d49f8b137126f14921a94481804d5b Mon Sep 17 00:00:00 2001 From: harryob <55142896+harryob@users.noreply.github.com> Date: Thu, 21 Sep 2023 08:36:42 +0100 Subject: [PATCH 03/44] perma --- code/controllers/subsystem/stickyban.dm | 23 ++++++++++++++++++++++- code/datums/entities/player_sticky_ban.dm | 2 -- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index d5a96c50c5a2..3cc48afda749 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -18,6 +18,10 @@ SUBSYSTEM_DEF(stickyban) world.SetConfig("ban", existing_ban, null) /datum/controller/subsystem/stickyban/proc/import_sticky(identifier, list/ban_data) + if(ban_data["type"] == "sticky") + handle_old_perma(identifier, ban_data) + return + if(!ban_data["message"]) ban_data["message"] = "Evasion" @@ -26,7 +30,6 @@ SUBSYSTEM_DEF(stickyban) new_sticky.reason = ban_data["reason"] new_sticky.message = ban_data["message"] - new_sticky.sticky = ban_data["type"] == "sticky" ? TRUE : FALSE new_sticky.date = "LEGACY" new_sticky.save() @@ -82,3 +85,21 @@ SUBSYSTEM_DEF(stickyban) world.SetConfig("ban", new_sticky.identifier, null) +/proc/handle_old_perma(identifier, list/ban_data) + var/list/keys_to_ban = list() + + keys_to_ban += splittext(ban_data["keys"], ",") + + var/list/keys = splittext(ban_data["whitelist"], ",") + for(var/key in keys) + keys_to_ban -= key + + for(var/key in keys_to_ban) + var/datum/entity/player/player_entity = get_player_from_key(key) + if(player_entity) + continue + + player_entity.is_permabanned = TRUE + player_entity.permaban_admin = "AdminBot" + player_entity.permaban_date = "IMPORT" + player_entity.permaban_reason = ban_data["message"] diff --git a/code/datums/entities/player_sticky_ban.dm b/code/datums/entities/player_sticky_ban.dm index 6de4f68bb009..3f94befea585 100644 --- a/code/datums/entities/player_sticky_ban.dm +++ b/code/datums/entities/player_sticky_ban.dm @@ -3,7 +3,6 @@ var/reason var/message var/date - var/sticky = TRUE var/linked_permaban @@ -15,7 +14,6 @@ "reason" = DB_FIELDTYPE_STRING_LARGE, "message" = DB_FIELDTYPE_STRING_LARGE, "date" = DB_FIELDTYPE_STRING_LARGE, - "sticky" = DB_FIELDTYPE_INT, "linked_permaban" = DB_FIELDTYPE_BIGINT, ) From 0684ac15aae4728cfbfaa6c3b1d766d61dddecd2 Mon Sep 17 00:00:00 2001 From: harryob Date: Thu, 12 Oct 2023 21:06:36 +0100 Subject: [PATCH 04/44] no more default ban pager --- code/modules/admin/IsBanned.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index bf6d8e261ab3..66782ab74d67 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -35,10 +35,6 @@ // wait for database to be ready . = P.check_ban(computer_id, address) - if(.) - return . - - return ..() //default pager ban stuff #endif From 6fdfc0a231764ddacff76fcafa21ee44de288913 Mon Sep 17 00:00:00 2001 From: harryob Date: Thu, 1 Feb 2024 11:44:59 +0000 Subject: [PATCH 05/44] improvmens --- code/controllers/subsystem/stickyban.dm | 23 +++++++++++++---------- code/datums/entities/player.dm | 8 ++++++++ code/game/world.dm | 11 ----------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 3cc48afda749..8e722dea03f5 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -6,19 +6,23 @@ SUBSYSTEM_DEF(stickyban) var/list/active_sticky /datum/controller/subsystem/stickyban/Initialize() + set waitfor = FALSE + + WAIT_DB_READY + var/list/all_bans = world.GetConfig("ban") for(var/existing_ban in all_bans) var/list/ban_data = params2list(world.GetConfig("ban", existing_ban)) if(!ban_data["database_ban"]) - import_sticky(existing_ban, ban_data) + INVOKE_ASYNC(src, PROC_REF(import_sticky), existing_ban, ban_data) continue world.SetConfig("ban", existing_ban, null) /datum/controller/subsystem/stickyban/proc/import_sticky(identifier, list/ban_data) - if(ban_data["type"] == "sticky") + if(ban_data["type"] != "sticky") handle_old_perma(identifier, ban_data) return @@ -43,7 +47,7 @@ SUBSYSTEM_DEF(stickyban) for(var/key in keys) var/datum/entity/stickyban_matched_ckey/matched_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) - matched_ckey.ckey = key + matched_ckey.ckey = ckey(key) matched_ckey.linked_stickyban = new_sticky.id matched_ckey.save() @@ -54,7 +58,7 @@ SUBSYSTEM_DEF(stickyban) for(var/key in keys) var/datum/entity/stickyban_matched_ckey/whitelisted_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) - whitelisted_ckey.ckey = key + whitelisted_ckey.ckey = ckey(key) whitelisted_ckey.linked_stickyban = new_sticky.id whitelisted_ckey.whitelisted = TRUE @@ -92,14 +96,13 @@ SUBSYSTEM_DEF(stickyban) var/list/keys = splittext(ban_data["whitelist"], ",") for(var/key in keys) - keys_to_ban -= key + keys_to_ban -= ckey(key) for(var/key in keys_to_ban) var/datum/entity/player/player_entity = get_player_from_key(key) - if(player_entity) + if(!player_entity) continue - player_entity.is_permabanned = TRUE - player_entity.permaban_admin = "AdminBot" - player_entity.permaban_date = "IMPORT" - player_entity.permaban_reason = ban_data["message"] + INVOKE_ASYNC(player_entity, TYPE_PROC_REF(/datum/entity/player, add_perma_ban), ban_data["message"]) + + world.SetConfig("ban", identifier, null) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 2973a174858f..7a0566b8dad5 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -305,6 +305,14 @@ BSQL_PROTECT_DATUM(/datum/entity/player) return TRUE +/datum/entity/player/proc/add_perma_ban(reason, datum/entity/player/banner) + is_permabanned = TRUE + permaban_date = "[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]" + permaban_reason = reason + + save() + sync() + /datum/entity/player/proc/auto_unban() if(!is_time_banned) return diff --git a/code/game/world.dm b/code/game/world.dm index 41b8dc7b6cad..dd050e334fb1 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -87,17 +87,6 @@ GLOBAL_LIST_INIT(reboot_sfx, file2list("config/reboot_sfx.txt")) if(CONFIG_GET(flag/ToRban)) ToRban_autoupdate() - // If the server's configured for local testing, get everything set up ASAP. - // Shamelessly stolen from the test manager's host_tests() proc - if(testing_locally) - GLOB.master_mode = "Extended" - - // Wait for the game ticker to initialize - while(!SSticker.initialized) - sleep(10) - - // Start the game ASAP - SSticker.request_start() return /proc/start_logging() From 5695927d69368bc3ae94bdc8ab6f091cb2b5f395 Mon Sep 17 00:00:00 2001 From: harryob Date: Thu, 1 Feb 2024 18:57:40 +0000 Subject: [PATCH 06/44] done ? --- code/controllers/subsystem/stickyban.dm | 152 ++++++++++++++----- code/datums/entities/player.dm | 52 +++---- code/datums/entities/player_sticky_ban.dm | 76 +++++++++- code/modules/admin/NewBan.dm | 32 +++- code/modules/admin/admin_verbs.dm | 5 +- code/modules/admin/stickyban.dm | 65 ++++++-- code/modules/admin/tabs/admin_tab.dm | 6 + code/modules/admin/topic/topic.dm | 172 ++++++++++++++++++++++ code/modules/client/client_procs.dm | 3 + 9 files changed, 471 insertions(+), 92 deletions(-) diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 8e722dea03f5..9e0ce05c25bc 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -3,8 +3,6 @@ SUBSYSTEM_DEF(stickyban) init_order = SS_INIT_STICKY flags = SS_NO_FIRE - var/list/active_sticky - /datum/controller/subsystem/stickyban/Initialize() set waitfor = FALSE @@ -21,6 +19,110 @@ SUBSYSTEM_DEF(stickyban) world.SetConfig("ban", existing_ban, null) +/datum/controller/subsystem/stickyban/proc/match_sticky(existing_ban_id, ckey, address, computer_id) + if(!existing_ban_id) + return + + if(ckey) + var/datum/view_record/stickyban_matched_ckey/matched_ckey = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_AND( + DB_COMP("linked_stickyban", DB_EQUALS, existing_ban_id), + DB_COMP("ckey", DB_EQUALS, ckey) + ) + ) + + if(!length(matched_ckey)) + add_matched_ckey(existing_ban_id, ckey) + + if(address) + var/datum/view_record/stickyban_matched_ip/matched_ip = DB_VIEW(/datum/view_record/stickyban_matched_ip, + DB_AND( + DB_COMP("linked_stickyban", DB_EQUALS, existing_ban_id), + DB_COMP("ip", DB_EQUALS, address) + ) + ) + + if(!length(matched_ip)) + add_matched_ip(existing_ban_id, address) + + if(computer_id) + var/datum/view_record/stickyban_matched_cid/matched_cid = DB_VIEW(/datum/view_record/stickyban_matched_cid, + DB_AND( + DB_COMP("linked_stickyban", DB_EQUALS, existing_ban_id), + DB_COMP("cid", DB_EQUALS, computer_id) + ) + ) + + if(!length(matched_cid)) + add_matched_ip(existing_ban_id, computer_id) + +/datum/controller/subsystem/stickyban/proc/add_stickyban(identifier, reason, message, datum/entity/player/banning_admin, override_date) + var/datum/entity/stickyban/new_sticky = DB_ENTITY(/datum/entity/stickyban) + new_sticky.identifier = identifier + + new_sticky.reason = reason + new_sticky.message = message + + if(banning_admin) + new_sticky.adminid = banning_admin.id + + new_sticky.date = override_date ? override_date : "[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]" + new_sticky.save() + + return new_sticky + + +/datum/controller/subsystem/stickyban/proc/add_matched_ckey(existing_ban_id, key) + var/datum/entity/stickyban_matched_ckey/matched_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) + + matched_ckey.ckey = ckey(key) + matched_ckey.linked_stickyban = existing_ban_id + + matched_ckey.save() + +/datum/controller/subsystem/stickyban/proc/add_matched_ip(existing_ban_id, ip) + var/datum/entity/stickyban_matched_ip/matched_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip) + + matched_ip.ip = ip + matched_ip.linked_stickyban = existing_ban_id + + matched_ip.save() + +/datum/controller/subsystem/stickyban/proc/add_matched_cid(existing_ban_id, cid) + var/datum/entity/stickyban_matched_cid/matched_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid) + + matched_cid.cid = cid + matched_cid.linked_stickyban = existing_ban_id + + matched_cid.save() + +/datum/controller/subsystem/stickyban/proc/whitelist_ckey(existing_ban_id, key) + key = ckey(key) + + if(!key) + return + + var/id_to_select + + var/list/datum/view_record/stickyban_matched_ckey/existing_matches = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_AND( + DB_COMP("linked_stickyban", DB_EQUALS, existing_ban_id), + DB_COMP("ckey", DB_EQUALS, key) + ) + ) + + if(length(existing_matches)) + var/datum/view_record/stickyban_matched_ckey/match = existing_matches[1] + id_to_select = match.id + + var/datum/entity/stickyban_matched_ckey/whitelisted_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey, id_to_select) + + whitelisted_ckey.ckey = key + whitelisted_ckey.linked_stickyban = existing_ban_id + whitelisted_ckey.whitelisted = TRUE + + whitelisted_ckey.save() + /datum/controller/subsystem/stickyban/proc/import_sticky(identifier, list/ban_data) if(ban_data["type"] != "sticky") handle_old_perma(identifier, ban_data) @@ -29,63 +131,33 @@ SUBSYSTEM_DEF(stickyban) if(!ban_data["message"]) ban_data["message"] = "Evasion" - var/datum/entity/stickyban/new_sticky = DB_ENTITY(/datum/entity/stickyban) - new_sticky.identifier = identifier - - new_sticky.reason = ban_data["reason"] - new_sticky.message = ban_data["message"] - - new_sticky.date = "LEGACY" - new_sticky.save() - new_sticky.detach() + add_stickyban(identifier, ban_data["reason"], ban_data["message"], override_date = "LEGACY") /datum/entity_meta/stickyban/on_insert(datum/entity/stickyban/new_sticky) var/list/ban_data = params2list(world.GetConfig("ban", new_sticky.identifier)) + if(!length(ban_data)) + return + if(ban_data["keys"]) var/list/keys = splittext(ban_data["keys"], ",") for(var/key in keys) - var/datum/entity/stickyban_matched_ckey/matched_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) - - matched_ckey.ckey = ckey(key) - matched_ckey.linked_stickyban = new_sticky.id - - matched_ckey.save() - matched_ckey.detach() + SSstickyban.add_matched_ckey(new_sticky.id, key) if(ban_data["whitelist"]) var/list/keys = splittext(ban_data["whitelist"], ",") for(var/key in keys) - var/datum/entity/stickyban_matched_ckey/whitelisted_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey) - - whitelisted_ckey.ckey = ckey(key) - whitelisted_ckey.linked_stickyban = new_sticky.id - whitelisted_ckey.whitelisted = TRUE - - whitelisted_ckey.save() - whitelisted_ckey.detach() + SSstickyban.whitelist_ckey(new_sticky.id, key) if(ban_data["computer_id"]) var/list/cids = splittext(ban_data["computer_id"], ",") for(var/cid in cids) - var/datum/entity/stickyban_matched_cid/matched_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid) - - matched_cid.cid = cid - matched_cid.linked_stickyban = new_sticky.id - - matched_cid.save() - matched_cid.detach() + SSstickyban.add_matched_cid(new_sticky.id, cid) if(ban_data["IP"]) var/list/ips = splittext(ban_data["IP"], ",") for(var/ip in ips) - var/datum/entity/stickyban_matched_ip/matched_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip) - - matched_ip.ip = ip - matched_ip.linked_stickyban = new_sticky.id - - matched_ip.save() - matched_ip.detach() + SSstickyban.add_matched_ip(new_sticky.id, ip) world.SetConfig("ban", new_sticky.identifier, null) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 7a0566b8dad5..7d5b51391762 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -458,43 +458,27 @@ BSQL_PROTECT_DATUM(/datum/entity/player) /datum/entity/player/proc/check_ban(computer_id, address) . = list() - var/list/linked_bans = check_for_sticky_ban(address, computer_id) - if(islist(linked_bans)) - var/datum/view_record/stickyban_list_view/SLW = LAZYACCESS(linked_bans, 1) - if(SLW) - var/reason = "" - - if(SLW.address == address) - reason += "IP Address Matches; " - if(SLW.computer_id == computer_id) - reason += "CID Matches; " - if(SLW.ckey == ckey) - reason += "Ckey Matches; " - - var/source_id = SLW.linked_stickyban - var/source_reason = SLW.linked_reason - var/source_ckey = SLW.linked_ckey - if(!source_id) - source_id = "[SLW.entry_id]" - source_reason = SLW.reason - source_ckey = SLW.ckey - - log_access("Failed Login: [ckey] [last_known_cid] [last_known_ip] - Stickybanned (Linked to [source_ckey]; Reason: [source_reason])") - message_admins("Failed Login: [ckey] (IP: [last_known_ip], CID: [last_known_cid]) - Stickybanned (Linked to ckey [source_ckey]; Reason: [source_reason])") - - DB_FILTER(/datum/entity/player_sticky_ban, - DB_AND( - DB_COMP("ckey", DB_EQUALS, ckey), - DB_COMP("address", DB_EQUALS, address), - DB_COMP("computer_id", DB_EQUALS, computer_id) - ), CALLBACK(src, PROC_REF(process_stickyban), address, computer_id, source_id, reason, null)) - - .["desc"] = "\nReason: Stickybanned\nExpires: PERMANENT" - .["reason"] = "ckey/id" - return . + var/list/datum/view_record/stickyban/all_stickies = check_for_sticky_ban(ckey, address, computer_id) + if(islist(all_stickies)) + var/datum/view_record/stickyban/sticky = all_stickies[1] + + log_access("Failed Login: [ckey] [last_known_cid] [last_known_ip] - Stickybanned (Reason: [sticky.reason])") + message_admins("Failed Login: [ckey] (IP: [last_known_ip], CID: [last_known_cid]) - Stickybanned (Reason: [sticky.reason])") + + var/appeal + if(CONFIG_GET(string/banappeals)) + appeal = "\nFor more information on your ban, or to appeal, head to [CONFIG_GET(string/banappeals)]" + + .["desc"] = "\nReason: Stickybanned - [sticky.reason]\n[appeal]" + .["reason"] = "ckey/id" + + SSstickyban.match_sticky(sticky.id, ckey, address, computer_id) + return + if(!is_time_banned && !is_permabanned) return null + var/appeal if(CONFIG_GET(string/banappeals)) appeal = "\nFor more information on your ban, or to appeal, head to [CONFIG_GET(string/banappeals)]" diff --git a/code/datums/entities/player_sticky_ban.dm b/code/datums/entities/player_sticky_ban.dm index 3f94befea585..3182872aa3d0 100644 --- a/code/datums/entities/player_sticky_ban.dm +++ b/code/datums/entities/player_sticky_ban.dm @@ -3,8 +3,8 @@ var/reason var/message var/date - - var/linked_permaban + var/active = TRUE + var/adminid /datum/entity_meta/stickyban entity_type = /datum/entity/stickyban @@ -14,9 +14,33 @@ "reason" = DB_FIELDTYPE_STRING_LARGE, "message" = DB_FIELDTYPE_STRING_LARGE, "date" = DB_FIELDTYPE_STRING_LARGE, - "linked_permaban" = DB_FIELDTYPE_BIGINT, + "active" = DB_FIELDTYPE_INT, + "adminid" = DB_FIELDTYPE_BIGINT, ) +/datum/view_record/stickyban + var/id + var/identifier + var/reason + var/message + var/date + var/active + var/adminid + +/datum/entity_view_meta/stickyban + root_record_type = /datum/entity/stickyban + destination_entity = /datum/view_record/stickyban + fields = list( + "id", + "identifier", + "reason", + "message", + "date", + "active", + "adminid", + ) + + /datum/entity/stickyban_matched_ckey var/ckey var/linked_stickyban @@ -31,6 +55,23 @@ "whitelisted" = DB_FIELDTYPE_INT, ) +/datum/view_record/stickyban_matched_ckey + var/id + var/ckey + var/linked_stickyban + var/whitelisted + +/datum/entity_view_meta/stickyban_matched_ckey + root_record_type = /datum/entity/stickyban_matched_ckey + destination_entity = /datum/view_record/stickyban_matched_ckey + fields = list( + "id", + "ckey", + "linked_stickyban", + "whitelisted", + ) + + /datum/entity/stickyban_matched_cid var/cid var/linked_stickyban @@ -43,6 +84,21 @@ "linked_stickyban" = DB_FIELDTYPE_BIGINT, ) +/datum/view_record/stickyban_matched_cid + var/id + var/cid + var/linked_stickyban + +/datum/entity_view_meta/stickyban_matched_cid + root_record_type = /datum/entity/stickyban_matched_cid + destination_entity = /datum/view_record/stickyban_matched_cid + fields = list( + "id", + "cid", + "linked_stickyban" + ) + + /datum/entity/stickyban_matched_ip var/ip var/linked_stickyban @@ -55,6 +111,20 @@ "linked_stickyban" = DB_FIELDTYPE_BIGINT, ) +/datum/view_record/stickyban_matched_ip + var/id + var/ip + var/linked_stickyban + +/datum/entity_view_meta/stickyban_matched_ip + root_record_type = /datum/entity/stickyban_matched_ip + destination_entity = /datum/view_record/stickyban_matched_ip + fields = list( + "id", + "ip", + "linked_stickyban" + ) + /datum/entity/player_sticky_ban var/player_id var/admin_id diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 7dca354129ff..536091a95ec8 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -180,15 +180,43 @@ GLOBAL_DATUM(Banlist, /savefile) expiry = "Removal Pending" else expiry = "Permaban" - var/unban_link = "(U)" + var/unban_link + if(ban.is_permabanned) + unban_link = "(UP)" + else + unban_link = "(UT)" dat += "[unban_link] Key: [ban.ckey]ComputerID: [ban.last_known_cid]IP: [ban.last_known_ip] [expiry](By: [ban.admin])(Reason: [ban.reason])" dat += "" - var/dat_header = "
Bans: (U) = Unban" + var/dat_header = "
Bans: (UP) = Unban Perma (UT) = Unban Timed" dat_header += " - Ban Listing
[dat]" show_browser(usr, dat_header, "Unban Panel", "unbanp", "size=875x400") +/datum/admins/proc/stickypanel() + var/add_sticky = "Add Sticky Ban" + + var/data = "
Sticky Bans: [add_sticky]
" + + var/list/datum/view_record/stickyban/stickies = DB_VIEW(/datum/view_record/stickyban, + DB_COMP("active", DB_EQUALS, TRUE) + ) + + for(var/datum/view_record/stickyban/current_sticky in stickies) + var/whitelist_link = "(WHITELIST)" + var/remove_sticky_link = "(REMOVE)" + var/add_to_sticky_link = "(ADD)" + + var/impacted_ckey_link = "CKEYs" + var/impacted_ip_link = "IPs" + var/impacted_cid_link = "CIDs" + + data += "" + + data += "
[whitelist_link][remove_sticky_link][add_to_sticky_link]Identifier: [current_sticky.identifier]Reason: [current_sticky.reason]Message: [current_sticky.message] View: [impacted_ckey_link][impacted_ip_link][impacted_cid_link]
" + + show_browser(owner, data, "Stickyban Panel", "sticky", "size=875x400") + //////////////////////////////////// DEBUG //////////////////////////////////// /proc/CreateBans() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 56002d139599..4ff1160a8864 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -96,8 +96,9 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list( )) GLOBAL_LIST_INIT(admin_verbs_ban, list( - /client/proc/unban_panel - // /client/proc/jobbans // Disabled temporarily due to 15-30 second lag spikes. Don't forget the comma in the line above when uncommenting this! + /client/proc/unban_panel, + /client/proc/stickyban_panel, + // /client/proc/jobbans // Disabled temporarily due to 15-30 second lag spikes. )) GLOBAL_LIST_INIT(admin_verbs_sounds, list( diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 69793a599596..c8f241bf3e03 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -49,18 +49,61 @@ stickyban_internal(ckey, address, computer_id, reason, source_id, banning_admin) -/datum/entity/player/proc/check_for_sticky_ban(address, computer_id) - var/list/datum/view_record/stickyban_list_view/SBLW = DB_VIEW(/datum/view_record/stickyban_list_view, - DB_OR( +/proc/check_for_sticky_ban(ckey, address, computer_id) + var/list/stickyban_ids = list() + + var/list/datum/view_record/stickyban_matched_ckey/ckeys = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_AND( DB_COMP("ckey", DB_EQUALS, ckey), - DB_COMP("address", DB_EQUALS, address), - DB_COMP("computer_id", DB_EQUALS, computer_id) - )) + DB_COMP("whitelisted", DB_EQUALS, FALSE) + ) + ) - if(length(SBLW) == 0) - return + for(var/datum/view_record/stickyban_matched_ckey/matched_ckey as anything in ckeys) + stickyban_ids += matched_ckey.linked_stickyban - if(stickyban_whitelisted) - return + var/list/datum/view_record/stickyban_matched_cid/cids = DB_VIEW(/datum/view_record/stickyban_matched_cid, + DB_COMP("cid", DB_EQUALS, computer_id) + ) + + for(var/datum/view_record/stickyban_matched_cid/matched_cid as anything in cids) + stickyban_ids += matched_cid.linked_stickyban + + var/list/datum/view_record/stickyban_matched_cid/ips = DB_VIEW(/datum/view_record/stickyban_matched_ip, + DB_COMP("ip", DB_EQUALS, address) + ) + + for(var/datum/view_record/stickyban_matched_ip/matched_ip as anything in ips) + stickyban_ids += matched_ip.linked_stickyban + + if(!length(stickyban_ids)) + return FALSE + + var/list/datum/view_record/stickyban/stickies = DB_VIEW(/datum/view_record/stickyban, + DB_AND( + DB_COMP("id", DB_IN, stickyban_ids), + DB_COMP("active", DB_EQUALS, TRUE) + ) + ) + + for(var/datum/view_record/stickyban/current_sticky in stickies) + var/list/datum/view_record/stickyban_matched_ckey/whitelisted_ckeys = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_AND( + DB_COMP("linked_stickyban", DB_EQUALS, current_sticky.id), + DB_COMP("ckey", DB_EQUALS, ckey), + DB_COMP("whitelisted", DB_EQUALS, TRUE), + ) + ) + + if(length(whitelisted_ckeys)) + stickies -= current_sticky + + if(!length(stickies)) + return FALSE + + return stickies + +/client/verb/check_stickyban() + check_for_sticky_ban(input("ckey"), input("ip"), input("id")) - return SBLW + to_world("boowah") diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index 8dce41ac8235..356762b5edd7 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -53,6 +53,12 @@ admin_holder.unbanpanel() return +/client/proc/stickyban_panel() + set name = "Stickyban Panel" + set category = "Admin.Panels" + + admin_holder?.stickypanel() + /client/proc/player_panel_new() set name = "Player Panel" set category = "Admin.Panels" diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index b1cab3603af8..ddddca81653b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -229,6 +229,178 @@ alert(usr, "This ban has already been lifted / does not exist.", "Error", "Ok") unbanpanel() + else if(href_list["unban_perma"]) + var/datum/entity/player/unban_player = get_player_from_key(href_list["unban_perma"]) + if(!(tgui_alert(owner, "Do you want to unban [unban_player.ckey]? They are currently permabanned for: [unban_player.permaban_reason], since [unban_player.permaban_date].", "Unban Player", list("Yes", "No")) == "Yes")) + return + + if(!unban_player.is_permabanned) + to_chat(owner, "The player is not currently permabanned.") + + unban_player.is_permabanned = FALSE + unban_player.permaban_admin_id = null + unban_player.permaban_date = null + unban_player.permaban_reason = null + + unban_player.save() + + log_and_message_admins("[key_name_admin(owner)] has removed the permanent ban on [unban_player.ckey].") + + else if(href_list["sticky"]) + if(href_list["new_sticky"]) + var/identifier = tgui_input_text(owner, "Name of the primary CKEY you are adding a stickyban to.", "BuildABan") + var/reason = tgui_input_text(owner, "What's the reason for the ban? This is shown internally, and not displayed in notes and ban messages.", "BuildABan") + var/message = tgui_input_text(owner, "What message should be given to the impacted users?", "BuildABan") + + var/datum/entity/stickyban/new_sticky = SSstickyban.add_stickyban(identifier, reason, message) + + if(new_sticky) + var/list/impacted_ckeys = splittext(tgui_input_text(owner, "Which CKEYs should be impacted by this ban? Include the primary ckey, separated by semicolons.", "BuildABan", "player1;player2;player3"), ";") + + for(var/ckey in impacted_ckeys) + SSstickyban.add_matched_ckey(new_sticky.id, ckey) + + var/list/impacted_cids = splittext(tgui_input_text(owner, "Which CIDs should be impacted by this ban? Separate with semicolons.", "BuildABan", "12345678;87654321"), ";") + for(var/cid in impacted_cids) + SSstickyban.add_matched_cid(new_sticky.id, cid) + + var/list/impacted_ips = splittext(tgui_input_text(owner, "Which IPs should be impacted by this ban? Separate with semicolons.", "BuildABan", "1.1.1.1;8.8.8.8"), ";") + for(var/ip in impacted_ips) + SSstickyban.add_matched_ip(new_sticky.id, ip) + + return + + if(href_list["view_all_ckeys"]) + var/list/datum/view_record/stickyban_matched_ckey/all_ckeys = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_COMP("linked_stickyban", DB_EQUALS, href_list["sticky"]) + ) + + var/list/keys = list() + for(var/datum/view_record/stickyban_matched_ckey/match as anything in all_ckeys) + keys += match.ckey + + show_browser(owner, english_list(keys), "Stickyban Keys", "stickykeys") + return + + if(href_list["view_all_cids"]) + var/list/datum/view_record/stickyban_matched_cid/all_cids = DB_VIEW(/datum/view_record/stickyban_matched_cid, + DB_COMP("linked_stickyban", DB_EQUALS, href_list["sticky"]) + ) + + var/list/cids = list() + for(var/datum/view_record/stickyban_matched_cid/match as anything in all_cids) + cids += match.cid + + show_browser(owner, english_list(cids), "Stickyban CIDs", "stickycids") + return + + if(href_list["view_all_ips"]) + var/list/datum/view_record/stickyban_matched_ip/all_ips = DB_VIEW(/datum/view_record/stickyban_matched_ip, + DB_COMP("linked_stickyban", DB_EQUALS, href_list["sticky"]) + ) + + var/list/ips = list() + for(var/datum/view_record/stickyban_matched_ip/match as anything in all_ips) + ips += match.ip + + show_browser(owner, english_list(ips), "Stickyban IPs", "stickycips") + return + + var/datum/entity/stickyban/sticky = DB_ENTITY(/datum/entity/stickyban, href_list["sticky"]) + if(!sticky) + return + + sticky.sync() + + if(href_list["whitelist_ckey"]) + var/ckey_to_whitelist = ckey(tgui_input_text(owner, "What CKEY should be whitelisted? Editing stickyban: [sticky.identifier]")) + if(!ckey_to_whitelist) + return + + SSstickyban.whitelist_ckey(sticky.id, ckey_to_whitelist) + + if(href_list["add"]) + var/option = tgui_input_list(owner, "What do you want to add?", "AddABan", list("CID", "CKEY", "IP")) + if(!option) + return + + var/to_add = tgui_input_text(owner, "Provide the [option] to add to the stickyban.", "AddABan") + if(!to_add) + return + + switch(option) + if("CID") + SSstickyban.add_matched_cid(sticky.id, to_add) + if("CKEY") + SSstickyban.add_matched_ckey(sticky.id, to_add) + if("IP") + SSstickyban.add_matched_ip(sticky.id, to_add) + + + if(href_list["remove"]) + var/option = tgui_input_list(owner, "What do you want to remove?", "DelABan", list("Entire Stickyban", "CID", "CKEY", "IP")) + switch(option) + if("Entire Stickyban") + if(!(tgui_alert(owner, "Are you sure you want to remove this stickyban? Identifier: [sticky.identifier] Reason: [sticky.reason]", "Confirm", list("Yes", "No")) == "Yes")) + return + + sticky.active = FALSE + sticky.save() + + if("CID") + var/list/datum/view_record/stickyban_matched_cid/all_cids = DB_VIEW(/datum/view_record/stickyban_matched_cid, + DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) + ) + + var/list/cid_to_record_id = list() + for(var/datum/view_record/stickyban_matched_cid/match in all_cids) + cid_to_record_id["[match.cid]"] = match.id + + var/picked = tgui_input_list(owner, "Which CID to remove?", "DelABan", cid_to_record_id) + if(!picked) + return + + picked = cid_to_record_id[picked] + + var/datum/entity/stickyban_matched_cid/sticky_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid, picked) + sticky_cid.delete() + + if("CKEY") + var/list/datum/view_record/stickyban_matched_ckey/all_ckeys = DB_VIEW(/datum/view_record/stickyban_matched_ckey, + DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) + ) + + var/list/ckey_to_record_id = list() + for(var/datum/view_record/stickyban_matched_ckey/match in all_ckeys) + ckey_to_record_id["[match.ckey]"] = match.id + + var/picked = tgui_input_list(owner, "Which CKEY to remove?", "DelABan", ckey_to_record_id) + if(!picked) + return + + picked = ckey_to_record_id[picked] + + var/datum/entity/stickyban_matched_ckey/sticky_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey, picked) + sticky_ckey.delete() + + if("IP") + var/list/datum/view_record/stickyban_matched_ip/all_ips = DB_VIEW(/datum/view_record/stickyban_matched_ip, + DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) + ) + + var/list/ip_to_record_id = list() + for(var/datum/view_record/stickyban_matched_ip/match in all_ips) + ip_to_record_id["[match.ip]"] = match.id + + var/picked = tgui_input_list(owner, "Which IP to remove?", "DelABan", ip_to_record_id) + if(!picked) + return + + picked = ip_to_record_id[picked] + + var/datum/entity/stickyban_matched_ip/sticky_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip, picked) + sticky_ip.delete() + else if(href_list["warn"]) usr.client.warn(href_list["warn"]) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 44820444a955..3c7c052837ad 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -299,6 +299,9 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( if(!(connection in list("seeker", "web"))) //Invalid connection type. return null +// if(world.IsBanned(key, address, computer_id)) +// qdel(src, TRUE) + GLOB.clients += src GLOB.directory[ckey] = src From 7ff604205c311facbf634059ee650f3950c35f7c Mon Sep 17 00:00:00 2001 From: harryob Date: Thu, 1 Feb 2024 19:50:37 +0000 Subject: [PATCH 07/44] player panel modifications --- code/datums/entities/player.dm | 10 ++++- code/modules/admin/NewBan.dm | 42 +++++++++++++++++++ .../admin/player_panel/actions/punish.dm | 36 ++++++++++++++++ code/modules/admin/topic/topic.dm | 29 +++++++++---- code/modules/client/client_procs.dm | 3 -- tgui/packages/tgui/interfaces/PlayerPanel.jsx | 23 +++++++++- 6 files changed, 131 insertions(+), 12 deletions(-) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 7d5b51391762..bddcebc5a495 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -310,8 +310,16 @@ BSQL_PROTECT_DATUM(/datum/entity/player) permaban_date = "[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]" permaban_reason = reason + log_and_message_admins("[key_name_admin(banner.owning_client)] has permanently banned [ckey] for [reason].") + + add_note("Permanently banned | [reason].", FALSE, NOTE_ADMIN, TRUE) + + if(owning_client) + to_chat_forced(owning_client, SPAN_LARGE("You have been permanently banned by [banner.ckey].\nReason: [reason].")) + to_chat_forced(owning_client, SPAN_LARGE("This is a permanent ban. It will not be removed.")) + QDEL_NULL(owning_client) + save() - sync() /datum/entity/player/proc/auto_unban() if(!is_time_banned) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 536091a95ec8..dab48c5363cb 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -279,3 +279,45 @@ GLOBAL_DATUM(Banlist, /savefile) if(P.is_time_banned && alert(usr, "Ban already exists. Proceed?", "Confirmation", "Yes", "No") != "Yes") return P.add_timed_ban(reason, mins) + +/client/proc/cmd_admin_do_stickyban(identifier, reason, message, list/impacted_ckeys, list/impacted_cids, list/impacted_ips) + if(!identifier) + identifier = tgui_input_text(src, "Name of the primary CKEY you are adding a stickyban to.", "BuildABan") + + if(!reason) + reason = tgui_input_text(src, "What's the reason for the ban? This is shown internally, and not displayed in notes and ban messages.", "BuildABan") + + if(!message) + message = tgui_input_text(src, "What message should be given to the impacted users?", "BuildABan") + + var/datum/entity/stickyban/new_sticky = SSstickyban.add_stickyban(identifier, reason, message, player_data) + + if(!new_sticky) + to_chat(src, SPAN_ADMIN("Failed to apply stickyban.")) + return + + if(!length(impacted_ckeys)) + impacted_ckeys = splittext(tgui_input_text(src, "Which CKEYs should be impacted by this ban? Include the primary ckey, separated by semicolons.", "BuildABan", "player1;player2;player3"), ";") + + for(var/ckey in impacted_ckeys) + SSstickyban.add_matched_ckey(new_sticky.id, ckey) + + if(!length(impacted_cids)) + impacted_cids = splittext(tgui_input_text(src, "Which CIDs should be impacted by this ban? Separate with semicolons.", "BuildABan", "12345678;87654321"), ";") + + for(var/cid in impacted_cids) + SSstickyban.add_matched_cid(new_sticky.id, cid) + + if(!length(impacted_ips)) + impacted_ips = splittext(tgui_input_text(src, "Which IPs should be impacted by this ban? Separate with semicolons.", "BuildABan", "1.1.1.1;8.8.8.8"), ";") + + if(!impacted_ips) + return + + for(var/ip in impacted_ips) + SSstickyban.add_matched_ip(new_sticky.id, ip) + + log_admin("STICKYBAN: Identifier: [identifier] Reason: [reason] Message: [message] CKEYs: [english_list(impacted_ckeys)] IPs: [english_list(impacted_ips)] CIDs: [english_list(impacted_cids)]") + + + log_and_message_admins("[key_name_admin(src)] has added a new stickyban with the identifier '[identifier]'.") diff --git a/code/modules/admin/player_panel/actions/punish.dm b/code/modules/admin/player_panel/actions/punish.dm index 576de30ae7ff..b24e295a09de 100644 --- a/code/modules/admin/player_panel/actions/punish.dm +++ b/code/modules/admin/player_panel/actions/punish.dm @@ -45,6 +45,42 @@ return TRUE +/datum/player_action/permanent_ban + action_tag = "permanent_ban" + name = "Permanent Ban" + permissions_required = R_BAN + +/datum/player_action/permanent_ban/act(client/user, mob/target, list/params) + var/reason = tgui_input_text(user, "Why are you permanently banning this user?", "Permanent Ban") + if(!reason) + return + + var/datum/entity/player/target_entity = target.client?.player_data + if(!target_entity) + target_entity = get_player_from_key(target.ckey || target.persistent_ckey) + + if(!target_entity) + return + + target_entity.add_perma_ban(reason, user.player_data) + +/datum/player_action/sticky_ban + action_tag = "sticky_ban" + name = "Sticky Ban" + permissions_required = R_BAN + +/datum/player_action/sticky_ban/act(client/user, mob/target, list/params) + var/persistent_ip = target.client?.address + var/persistent_cid = target.client?.computer_id + + if(!persistent_cid || !persistent_ip) + var/datum/entity/player/player = get_player_from_key(target.persistent_ckey) + persistent_cid = player.last_known_cid + persistent_ip = player.last_known_ip + + + user.cmd_admin_do_stickyban(target.ckey, impacted_ckeys = list(target.ckey), impacted_cids = list(persistent_cid), impacted_ips = list(persistent_ip)) + /datum/player_action/mute action_tag = "mob_mute" name = "Mute" diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index ddddca81653b..372d4f203c13 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -252,7 +252,7 @@ var/reason = tgui_input_text(owner, "What's the reason for the ban? This is shown internally, and not displayed in notes and ban messages.", "BuildABan") var/message = tgui_input_text(owner, "What message should be given to the impacted users?", "BuildABan") - var/datum/entity/stickyban/new_sticky = SSstickyban.add_stickyban(identifier, reason, message) + var/datum/entity/stickyban/new_sticky = SSstickyban.add_stickyban(identifier, reason, message, owner.player_data) if(new_sticky) var/list/impacted_ckeys = splittext(tgui_input_text(owner, "Which CKEYs should be impacted by this ban? Include the primary ckey, separated by semicolons.", "BuildABan", "player1;player2;player3"), ";") @@ -268,6 +268,10 @@ for(var/ip in impacted_ips) SSstickyban.add_matched_ip(new_sticky.id, ip) + log_admin("STICKYBAN: Identifier: [identifier] Reason: [reason] Message: [message] CKEYs: [english_list(impacted_ckeys)] IPs: [english_list(impacted_ips)] CIDs: [english_list(impacted_cids)]") + + log_and_message_admins("[key_name_admin(owner)] has added a new stickyban with the identifier '[identifier]'.") + return if(href_list["view_all_ckeys"]) @@ -318,6 +322,7 @@ return SSstickyban.whitelist_ckey(sticky.id, ckey_to_whitelist) + log_and_message_admins("[key_name_admin(owner)] has whitelisted [ckey_to_whitelist] against stickyban [sticky.identifier].") if(href_list["add"]) var/option = tgui_input_list(owner, "What do you want to add?", "AddABan", list("CID", "CKEY", "IP")) @@ -336,6 +341,8 @@ if("IP") SSstickyban.add_matched_ip(sticky.id, to_add) + log_and_message_admins("[key_name_admin(owner)] has added a [option] ([to_add]) to stickyban [sticky.identifier].") + if(href_list["remove"]) var/option = tgui_input_list(owner, "What do you want to remove?", "DelABan", list("Entire Stickyban", "CID", "CKEY", "IP")) @@ -347,6 +354,8 @@ sticky.active = FALSE sticky.save() + log_and_message_admins("[key_name_admin(owner)] has deactivated stickyban [sticky.identifier].") + if("CID") var/list/datum/view_record/stickyban_matched_cid/all_cids = DB_VIEW(/datum/view_record/stickyban_matched_cid, DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) @@ -360,11 +369,13 @@ if(!picked) return - picked = cid_to_record_id[picked] + var/selected = cid_to_record_id[picked] - var/datum/entity/stickyban_matched_cid/sticky_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid, picked) + var/datum/entity/stickyban_matched_cid/sticky_cid = DB_ENTITY(/datum/entity/stickyban_matched_cid, selected) sticky_cid.delete() + log_and_message_admins("[key_name_admin(owner)] has removed a CID ([picked]) from stickyban [sticky.identifier].") + if("CKEY") var/list/datum/view_record/stickyban_matched_ckey/all_ckeys = DB_VIEW(/datum/view_record/stickyban_matched_ckey, DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) @@ -378,11 +389,13 @@ if(!picked) return - picked = ckey_to_record_id[picked] + var/selected = ckey_to_record_id[picked] - var/datum/entity/stickyban_matched_ckey/sticky_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey, picked) + var/datum/entity/stickyban_matched_ckey/sticky_ckey = DB_ENTITY(/datum/entity/stickyban_matched_ckey, selected) sticky_ckey.delete() + log_and_message_admins("[key_name_admin(owner)] has removed a CID ([picked]) from stickyban [sticky.identifier].") + if("IP") var/list/datum/view_record/stickyban_matched_ip/all_ips = DB_VIEW(/datum/view_record/stickyban_matched_ip, DB_COMP("linked_stickyban", DB_EQUALS, sticky.id) @@ -396,11 +409,13 @@ if(!picked) return - picked = ip_to_record_id[picked] + var/selected = ip_to_record_id[picked] - var/datum/entity/stickyban_matched_ip/sticky_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip, picked) + var/datum/entity/stickyban_matched_ip/sticky_ip = DB_ENTITY(/datum/entity/stickyban_matched_ip, selected) sticky_ip.delete() + log_and_message_admins("[key_name_admin(owner)] has removed an IP ([picked]) from stickyban [sticky.identifier].") + else if(href_list["warn"]) usr.client.warn(href_list["warn"]) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 3c7c052837ad..44820444a955 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -299,9 +299,6 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( if(!(connection in list("seeker", "web"))) //Invalid connection type. return null -// if(world.IsBanned(key, address, computer_id)) -// qdel(src, TRUE) - GLOB.clients += src GLOB.directory[ckey] = src diff --git a/tgui/packages/tgui/interfaces/PlayerPanel.jsx b/tgui/packages/tgui/interfaces/PlayerPanel.jsx index 85f73b581c67..98f487ce3230 100644 --- a/tgui/packages/tgui/interfaces/PlayerPanel.jsx +++ b/tgui/packages/tgui/interfaces/PlayerPanel.jsx @@ -348,7 +348,7 @@ const PunishmentActions = (props) => { width="100%" icon="gavel" color="red" - content="Ban" + content="Timed Ban" disabled={!hasPermission(data, 'mob_ban')} onClick={() => act('mob_ban')} /> @@ -372,6 +372,27 @@ const PunishmentActions = (props) => { +
+ + act('permanent_ban')} + /> + act('sticky_ban')} + /> + +
+