// DragonX Wallet - ImGui Edition // Copyright 2024-2026 The Hush Developers // Released under the GPLv3 #pragma once #include namespace dragonx { namespace rpc { /** * @brief Connection configuration */ enum class AuthSource { Missing, ConfigFile, Cookie }; struct ConnectionConfig { std::string host = "127.0.0.1"; std::string port = "21769"; std::string rpcuser; std::string rpcpassword; std::string hush_dir; std::string proxy; // SOCKS5 proxy for Tor bool use_embedded = true; bool use_tls = false; AuthSource auth_source = AuthSource::Missing; }; /** * @brief Manages connection to dragonxd * * Handles auto-detection of DRAGONX.conf, starting embedded daemon, * and connection lifecycle. */ class Connection { public: Connection(); ~Connection(); /** * @brief Auto-detect and load connection config * @return Config from DRAGONX.conf or defaults */ static ConnectionConfig autoDetectConfig(); /** * @brief Get the default DRAGONX.conf location */ static std::string getDefaultConfPath(); /** * @brief Get the default DragonX data directory */ static std::string getDefaultDataDir(); /** * @brief Parse a DRAGONX.conf file * @param path Path to conf file * @return Parsed configuration */ static ConnectionConfig parseConfFile(const std::string& path); /** * @brief Check if Sapling params exist */ static bool verifySaplingParams(); /** * @brief Get the Sapling params directory */ static std::string getSaplingParamsDir(); /** * @brief Create a default DRAGONX.conf file * @param path Path to create the file * @return true if created successfully */ static bool createDefaultConfig(const std::string& path); /** * @brief Ensure exportdir is set in DRAGONX.conf * @param confPath Path to the conf file * @return true if exportdir exists or was added */ static bool ensureExportDir(const std::string& confPath); /** * @brief Ensure wallet encryption flags are set in DRAGONX.conf * @param confPath Path to the conf file * @return true if flags exist or were added */ static bool ensureEncryptionEnabled(const std::string& confPath); /** * @brief Try to read .cookie auth file from the data directory * @param dataDir Path to the daemon data directory * @param user Output: cookie username (__cookie__) * @param password Output: cookie password * @return true if cookie file was read successfully */ static bool readAuthCookie(const std::string& dataDir, std::string& user, std::string& password); /** * @brief Build a cookie-auth retry config from a failed config-auth attempt */ static bool buildCookieAuthConfig(const ConnectionConfig& base, ConnectionConfig& cookieConfig); /** * @brief Whether a host is local enough for plaintext HTTP RPC */ static bool isLocalHost(const std::string& host); /** * @brief Whether this config would send RPC credentials over plaintext to a remote host */ static bool usesPlaintextRemote(const ConnectionConfig& config); static const char* authSourceName(AuthSource source); private: }; } // namespace rpc } // namespace dragonx