Fix RelayReg API: heartbeat/unregisterHost now require wgIP per relay contract

This commit is contained in:
Zac Gaetano 2026-05-07 00:18:24 -04:00
parent 7bb3ef95ec
commit 66b4721b34

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
// src/wg/relayreg.h DragonRelay HTTP registration client for Artemis. // src/wg/relayreg.h - DragonRelay HTTP registration client for Artemis.
// //
// Artemis (the Sunshine fork) uses this to: // Artemis (the Sunshine fork) uses this to:
// 1. Authenticate with the DragonRelay server (POST /api/auth/login) // 1. Authenticate with the DragonRelay server (POST /api/auth/login)
@ -10,6 +10,10 @@
// //
// Built on libcurl (synchronous, no event loop dependency). // Built on libcurl (synchronous, no event loop dependency).
// The caller is responsible for starting heartbeats in a background thread. // The caller is responsible for starting heartbeats in a background thread.
//
// IMPORTANT: heartbeat() and unregisterHost() require the local WireGuard IP
// (wgIP) so the relay can validate ownership. The relay rejects requests
// without this field with HTTP 400.
#include "displayinfo.h" #include "displayinfo.h"
@ -52,12 +56,8 @@ public:
// ── VPN provisioning ────────────────────────────────────────────────────── // ── VPN provisioning ──────────────────────────────────────────────────────
// Request a new WireGuard peer from DragonRelay.
// deviceName is appended to username: "user@devicename".
// Returns false and sets errOut on failure.
bool provisionVPN(const std::string &deviceName, VPNConf &out, std::string &errOut); bool provisionVPN(const std::string &deviceName, VPNConf &out, std::string &errOut);
// Delete a previously provisioned peer (cleanup on re-provision or shutdown).
bool deleteVPNPeer(const std::string &peerId, std::string &errOut); bool deleteVPNPeer(const std::string &peerId, std::string &errOut);
// ── Host registration ───────────────────────────────────────────────────── // ── Host registration ─────────────────────────────────────────────────────
@ -72,19 +72,18 @@ public:
std::string &errOut); std::string &errOut);
// Must be called every ~60 seconds to keep the host visible (5-min TTL). // Must be called every ~60 seconds to keep the host visible (5-min TTL).
bool heartbeat(std::string &errOut); // wgIP is required so the relay can validate ownership.
bool heartbeat(const std::string &wgIP, std::string &errOut);
// Called on Artemis shutdown. // Called on Artemis shutdown.
bool unregisterHost(std::string &errOut); // wgIP is required so the relay can validate ownership.
bool unregisterHost(const std::string &wgIP, std::string &errOut);
private: private:
std::string m_base; std::string m_base;
std::string m_jwt; std::string m_jwt;
LogFn m_log; LogFn m_log;
// Perform a JSON HTTP request. method: "GET","POST","PUT","DELETE".
// body: JSON string to send (empty = no body).
// Returns HTTP status code; responseOut is set to the response body.
int request(const std::string &method, int request(const std::string &method,
const std::string &path, const std::string &path,
const std::string &body, const std::string &body,