diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index 012c3ec9fe..e56ff3f0d1 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -25,4 +25,23 @@ /datum/config_entry/string/medal_hub_address /datum/config_entry/string/medal_hub_password - protection = CONFIG_ENTRY_HIDDEN \ No newline at end of file + protection = CONFIG_ENTRY_HIDDEN + +/datum/config_entry/keyed_list/cross_server_bunker_override + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateAndSet(str_val) + . = ..() + if(.) + var/list/newv = list() + for(var/I in config_entry_value) + newv[replacetext(I, "+", " ")] = config_entry_value[I] + config_entry_value = newv + +/datum/config_entry/keyed_list/cross_server_bunker_override/ValidateListEntry(key_name, key_value) + return key_value != "byond:\\address:port" && ..() + +/datum/config_entry/flag/allow_cross_server_bunker_override + protection = CONFIG_ENTRY_LOCKED diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 30699d36f4..261e423640 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -74,6 +74,25 @@ for(var/client/C in GLOB.clients) C.AnnouncePR(final_composed) +/datum/world_topic/auto_bunker_passthrough + keyword = "auto_bunker_override" + require_comms_key = TRUE + +/datum/world_topic/auto_bunker_passthrough/Run(list/input) + if(!CONFIG_GET(flag/allow_cross_server_bunker_override)) + return "Function Disabled" + var/ckeytobypass = input["ckey"] + var/is_new_ckey = !(ckey(ckeytobypass) in GLOB.bunker_passthrough) + var/sender = input["source"] || "UNKNOWN" + GLOB.bunker_passthrough |= ckey(ckeytobypass) + GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime + SSpersistence.SavePanicBunker() //we can do this every time, it's okay + if(!is_new_ckey) + log_admin("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).") + message_admins("AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).") + send2irc("Panic Bunker", "AUTO BUNKER: [ckeytobypass] given access (incoming comms from [sender]).") + return "Success" + /datum/world_topic/ahelp_relay keyword = "Ahelp" require_comms_key = TRUE diff --git a/code/modules/client/verbs/autobunker.dm b/code/modules/client/verbs/autobunker.dm new file mode 100644 index 0000000000..7fba73bda8 --- /dev/null +++ b/code/modules/client/verbs/autobunker.dm @@ -0,0 +1,34 @@ +/client/verb/bunker_auto_authorize() + set name = "Auto Authorize Panic Bunker" + set desc = "Authorizes your account in the panic bunker of any servers connected to this function." + set category = "OOC" + + world.send_cross_server_bunker_overrides(key, src) + +/world/proc/send_cross_server_bunker_overrides(key, client/C) + var/comms_key = CONFIG_GET(string/comms_key) + if(!comms_key) + return + var/list/message = list() + message["ckey"] = key + message["source"] = "[CONFIG_GET(string/cross_comms_name)]" + message["key"] = comms_key + message["auto_bunker_override"] = TRUE + var/list/servers = CONFIG_GET(keyed_list/cross_server_bunker_override) + if(!length(servers)) + to_chat(C, "AUTOBUNKER: No servers are configured to receive from this one.") + return + var/logtext = "[key] ([key_name(C)]) has initiated an autobunker authentication with linked servers." + message_admins(logtext) + log_admin(logtext) + for(var/name in servers) + var/returned = world.Export("[servers[name]]?[list2params(message)]") + switch(returned) + if("Bad Key") + to_chat(C, "AUTOBuNKER: [name] failed to authenticate with this server.") + if("Function Disabled") + to_chat(C, "AUTOBUNKER: [name] has autobunker receive disabled.") + if("Success") + to_chat(C, "AUTOBUNKER: Successfully authenticated with [name]. Panic bunker bypass granted to [key]..") + else + to_chat(C, "AUTOBUNKER: Unknown error ([name]).") diff --git a/tgstation.dme b/tgstation.dme index 78cce84a0c..21f167de78 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1792,6 +1792,7 @@ #include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\preferences_vr.dm" #include "code\modules\client\verbs\aooc.dm" +#include "code\modules\client\verbs\autobunker.dm" #include "code\modules\client\verbs\etips.dm" #include "code\modules\client\verbs\looc.dm" #include "code\modules\client\verbs\minimap.dm"