From 7d75166b7bf680dadc5b98f5a84d134f5a32f1b5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 15 May 2020 23:20:34 -0700 Subject: [PATCH] tgs 5.1.1 --- code/modules/tgs/core/core.dm | 22 ++++++++++++++++----- code/modules/tgs/core/datum.dm | 4 +++- code/modules/tgs/v3210/api.dm | 2 +- code/modules/tgs/v4/api.dm | 5 +---- code/modules/tgs/v5/_defines.dm | 7 +++++-- code/modules/tgs/v5/api.dm | 34 ++++++++++++++++++++++++++------- code/modules/tgs/v5/undef.dm | 3 +++ 7 files changed, 57 insertions(+), 20 deletions(-) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 144f33926f..a74c9bbab2 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -1,11 +1,17 @@ /world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) var/current_api = TGS_READ_GLOBAL(tgs) if(current_api) - TGS_ERROR_LOG("TgsNew(): TGS API datum already set ([current_api])! Was TgsNew() called more than once?") + TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?") + return + + if(!(minimum_required_security_level in list(TGS_SECURITY_ULTRASAFE, TGS_SECURITY_SAFE, TGS_SECURITY_TRUSTED))) + TGS_ERROR_LOG("Invalid minimum_required_security_level: [minimum_required_security_level]!") return #ifdef TGS_V3_API - minimum_required_security_level = TGS_SECURITY_TRUSTED + if(minimum_required_security_level != TGS_SECURITY_TRUSTED) + TGS_WARNING_LOG("V3 DMAPI requires trusted security!") + minimum_required_security_level = TGS_SECURITY_TRUSTED #endif var/raw_parameter = world.params[TGS_VERSION_PARAMETER] if(!raw_parameter) @@ -13,7 +19,7 @@ var/datum/tgs_version/version = new(raw_parameter) if(!version.Valid(FALSE)) - TGS_ERROR_LOG("Failed to validate TGS version parameter: [raw_parameter]!") + TGS_ERROR_LOG("Failed to validate DMAPI version parameter: [raw_parameter]!") return var/api_datum @@ -21,6 +27,7 @@ if(3) #ifndef TGS_V3_API TGS_ERROR_LOG("Detected V3 API but TGS_V3_API isn't defined!") + return #else switch(version.minor) if(2) @@ -43,11 +50,16 @@ return TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]") - var/datum/tgs_api/new_api = new api_datum(version) + + if(event_handler && !istype(event_handler)) + TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]") + event_handler = null + + var/datum/tgs_api/new_api = new api_datum(event_handler, version) TGS_WRITE_GLOBAL(tgs, new_api) - var/result = new_api.OnWorldNew(event_handler, minimum_required_security_level) + var/result = new_api.OnWorldNew(minimum_required_security_level) if(!result || result == TGS_UNIMPLEMENTED) TGS_WRITE_GLOBAL(tgs, null) TGS_ERROR_LOG("Failed to activate API!") diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 3adecbb556..ccc75fe344 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -2,9 +2,11 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) /datum/tgs_api var/datum/tgs_version/version + var/datum/tgs_event_handler/event_handler -/datum/tgs_api/New(datum/tgs_version/version) +/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) . = ..() + src.event_handler = event_handler src.version = version /datum/tgs_api/latest diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 5327b9276b..0fc0076c8b 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -56,7 +56,7 @@ /datum/tgs_api/v3210/proc/file2list(filename) return splittext(trim_left(trim_right(file2text(filename))), "\n") -/datum/tgs_api/v3210/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level) //don't use event handling in this version +/datum/tgs_api/v3210/OnWorldNew(minimum_required_security_level) . = FALSE comms_key = world.params[SERVICE_WORLD_PARAM] diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 5c98a1a7a7..ba18aab688 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -43,15 +43,13 @@ var/list/cached_test_merges var/datum/tgs_revision_information/cached_revision - var/datum/tgs_event_handler/event_handler - var/export_lock = FALSE var/list/last_interop_response /datum/tgs_api/v4/ApiVersion() return new /datum/tgs_version("4.0.0.0") -/datum/tgs_api/v4/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level) +/datum/tgs_api/v4/OnWorldNew(minimum_required_security_level) json_path = world.params[TGS4_PARAM_INFO_JSON] if(!json_path) TGS_ERROR_LOG("Missing [TGS4_PARAM_INFO_JSON] world parameter!") @@ -76,7 +74,6 @@ security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] chat_commands_json_path = cached_json["chatCommandsJson"] - src.event_handler = event_handler instance_name = cached_json["instanceName"] ListCustomCommands() diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 1117a1df50..2baf3e12d7 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -60,8 +60,10 @@ #define DMAPI5_TOPIC_COMMAND_CHANGE_PORT 2 #define DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE 3 #define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4 -#define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 4 -#define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 5 +#define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 5 +#define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 6 +#define DMAPI5_TOPIC_COMMAND_HEARTBEAT 7 +#define DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH 8 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -70,6 +72,7 @@ #define DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE "newRebootState" #define DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME "newInstanceName" #define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate" +#define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" #define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 32f80c0ae4..eedefb2877 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -15,18 +15,15 @@ var/datum/tgs_revision_information/revision var/list/chat_channels - var/datum/tgs_event_handler/event_handler - /datum/tgs_api/v5/ApiVersion() - return new /datum/tgs_version("5.0.0") - -/datum/tgs_api/v5/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level) - src.event_handler = event_handler + return new /datum/tgs_version("5.1.1") +/datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) server_port = world.params[DMAPI5_PARAM_SERVER_PORT] access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] var/datum/tgs_version/api_version = ApiVersion() + version = null var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_BRIDGE_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) if(!istype(bridge_response)) TGS_ERROR_LOG("Failed initial bridge request!") @@ -41,9 +38,9 @@ TGS_INFO_LOG("DMAPI validation, exiting...") del(world) + version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] - version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] if(istype(revisionData)) @@ -84,6 +81,10 @@ return TRUE +/datum/tgs_api/v5/proc/RequireInitialBridgeResponse() + while(!version) + sleep(1) + /datum/tgs_api/v5/OnInitializationComplete() Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) @@ -197,6 +198,20 @@ server_port = new_port return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) + return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) + var/new_version_string = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION] + if (!istext(new_version_string)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]") + + var/datum/tgs_version/new_version = new(new_version_string) + if (event_handler) + event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) + + version = new_version + + return TopicResponse() return TopicResponse("Unknown command: [command]") @@ -252,15 +267,18 @@ TGS_ERROR_LOG("Unable to set port to [port]!") /datum/tgs_api/v5/InstanceName() + RequireInitialBridgeResponse() return instance_name /datum/tgs_api/v5/TestMerges() + RequireInitialBridgeResponse() return test_merges /datum/tgs_api/v5/EndProcess() Bridge(DMAPI5_BRIDGE_COMMAND_KILL) /datum/tgs_api/v5/Revision() + RequireInitialBridgeResponse() return revision /datum/tgs_api/v5/ChatBroadcast(message, list/channels) @@ -298,6 +316,7 @@ Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) /datum/tgs_api/v5/ChatChannelInfo() + RequireInitialBridgeResponse() return chat_channels /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) @@ -322,6 +341,7 @@ return channel /datum/tgs_api/v5/SecurityLevel() + RequireInitialBridgeResponse() return security_level /* diff --git a/code/modules/tgs/v5/undef.dm b/code/modules/tgs/v5/undef.dm index 72d673b9b1..b27e3abe95 100644 --- a/code/modules/tgs/v5/undef.dm +++ b/code/modules/tgs/v5/undef.dm @@ -62,6 +62,8 @@ #undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED #undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE #undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE +#undef DMAPI5_TOPIC_COMMAND_HEARTBEAT +#undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE #undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND @@ -70,6 +72,7 @@ #undef DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE #undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME #undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE +#undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE #undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES