Harden TeamSync config parsing

This commit is contained in:
2026-06-11 22:00:23 -04:00
parent c4fb18b3b4
commit bf3c9c08e6
+19 -8
View File
@@ -1,8 +1,10 @@
#include "TeamSync.hh" #include "TeamSync.hh"
#include <cstddef> #include <cstddef>
#include <cstdint>
#include <cstdio> #include <cstdio>
#include <mutex> #include <mutex>
#include <stdexcept>
namespace TeamSync { namespace TeamSync {
@@ -57,27 +59,36 @@ void configure_from_json(const phosg::JSON& json) {
cfg.source_region = json.get_string("SourceRegion", ""); cfg.source_region = json.get_string("SourceRegion", "");
cfg.source_ship = json.get_string("SourceShip", ""); cfg.source_ship = json.get_string("SourceShip", "");
if (cfg.source_region.empty() && cfg.source_ship.empty() && !legacy_region.empty()) { const std::string identity_source = !cfg.source.empty() ? cfg.source : legacy_region;
size_t dash_offset = legacy_region.find('-'); if (cfg.source_region.empty() && cfg.source_ship.empty() && !identity_source.empty()) {
size_t dash_offset = identity_source.find('-');
if (dash_offset != std::string::npos) { if (dash_offset != std::string::npos) {
cfg.source_region = legacy_region.substr(0, dash_offset); cfg.source_region = identity_source.substr(0, dash_offset);
cfg.source_ship = legacy_region.substr(dash_offset + 1); cfg.source_ship = identity_source.substr(dash_offset + 1);
} else { } else {
cfg.source_region = legacy_region; cfg.source_region = identity_source;
} }
} }
cfg.coordinator_url = json.get_string("CoordinatorURL", ""); cfg.coordinator_url = json.get_string("CoordinatorURL", "");
cfg.shared_secret = json.get_string("SharedSecret", ""); cfg.shared_secret = json.get_string("SharedSecret", "");
cfg.request_timeout_usecs = json.get_int("RequestTimeoutUsecs", 3000000);
if (cfg.request_timeout_usecs < 100000) { int64_t request_timeout_usecs = json.get_int("RequestTimeoutUsecs", 3000000);
cfg.request_timeout_usecs = 100000; if (request_timeout_usecs < 100000) {
request_timeout_usecs = 100000;
} else if (request_timeout_usecs > 30000000) {
request_timeout_usecs = 30000000;
} }
cfg.request_timeout_usecs = static_cast<uint64_t>(request_timeout_usecs);
cfg.relay_team_chat = json.get_bool("RelayTeamChat", false); cfg.relay_team_chat = json.get_bool("RelayTeamChat", false);
cfg.relay_team_points = json.get_bool("RelayTeamPoints", false); cfg.relay_team_points = json.get_bool("RelayTeamPoints", false);
cfg.relay_team_actions = json.get_bool("RelayTeamActions", false); cfg.relay_team_actions = json.get_bool("RelayTeamActions", false);
if (cfg.enabled && (cfg.source_region.empty() || cfg.source_ship.empty())) {
throw std::runtime_error("TeamSync requires SourceRegion and SourceShip, or Source/Region in region-ship form");
}
configure(cfg); configure(cfg);
} }