From b7e24345dd6bb75cb680091019986ee05e3bc69e Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Wed, 6 May 2026 20:27:56 -0400 Subject: [PATCH] Upload relayconf.cpp --- src/wg/relayconf.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/wg/relayconf.cpp diff --git a/src/wg/relayconf.cpp b/src/wg/relayconf.cpp new file mode 100644 index 0000000..362a82a --- /dev/null +++ b/src/wg/relayconf.cpp @@ -0,0 +1,91 @@ +#include "relayconf.h" + +#include +#include +#include +#include +#include + +namespace wg { + +static std::string trim(const std::string &s) { + const char *ws = " \t\r\n"; + size_t start = s.find_first_not_of(ws); + if (start == std::string::npos) return {}; + size_t end = s.find_last_not_of(ws); + return s.substr(start, end - start + 1); +} + +bool parseRelayConf(const std::string &path, RelayConf &conf, std::string &errOut) { + std::ifstream file(path); + if (!file.is_open()) { + errOut = "Cannot open relay.conf: " + path; + return false; + } + + std::string line; + int lineNum = 0; + + while (std::getline(file, line)) { + ++lineNum; + std::string trimmed = trim(line); + + // Skip blank lines and comments + if (trimmed.empty() || trimmed[0] == '#') continue; + + size_t eq = trimmed.find('='); + if (eq == std::string::npos) { + errOut = "relay.conf line " + std::to_string(lineNum) + ": missing '='"; + return false; + } + + std::string key = trim(trimmed.substr(0, eq)); + std::string value = trim(trimmed.substr(eq + 1)); + + if (key == "server_address") conf.server_address = value; + else if (key == "private_key") conf.private_key = value; + else if (key == "server_public_key") conf.server_public_key = value; + else if (key == "relay_token") conf.relay_token = value; + else if (key == "relay_host") conf.relay_host = value; + else if (key == "server_port") { + try { conf.server_port = std::stoi(value); } + catch (...) { + errOut = "relay.conf line " + std::to_string(lineNum) + ": invalid server_port"; + return false; + } + } + else if (key == "relay_port") { + try { conf.relay_port = std::stoi(value); } + catch (...) { + errOut = "relay.conf line " + std::to_string(lineNum) + ": invalid relay_port"; + return false; + } + } + // Unknown keys are silently ignored for forward compatibility + } + + // Validate required fields + if (conf.server_address.empty()) { errOut = "relay.conf: missing server_address"; return false; } + if (conf.private_key.empty()) { errOut = "relay.conf: missing private_key"; return false; } + if (conf.server_public_key.empty()) { errOut = "relay.conf: missing server_public_key"; return false; } + if (conf.relay_token.empty()) { errOut = "relay.conf: missing relay_token"; return false; } + + // Default relay_host from server_address if not set + if (conf.relay_host.empty()) { + conf.relay_host = "https://" + conf.server_address; + } + + return true; +} + +std::string defaultRelayConfPath() { +#ifdef _WIN32 + const char *pd = std::getenv("PROGRAMDATA"); + std::string base = pd ? pd : "C:\\ProgramData"; + return base + "\\Artemis\\relay.conf"; +#else + return "/etc/artemis/relay.conf"; +#endif +} + +} // namespace wg