// node_config.h — Simplified INI config manager for embedded uTun node #ifndef NODE_CONFIG_H #define NODE_CONFIG_H #include #include #include #include struct NodeClient { QString name; QString pubKeyHex; QString serverName; QString remoteAddr; }; class NodeConfig { public: explicit NodeConfig(const QString& path); bool exists() const; bool create(const QString& nodeName, quint16 listenPort); bool load(); bool save(); bool saveFull(); QString nodeName() const { return m_nodeName; } void setNodeName(const QString& n) { m_nodeName = n; } QString nodeId() const { return m_nodeId; } QString pubKey() const { return m_pubKey; } QString privKey() const { return m_privKey; } uint64_t nodeIdU64() const; QList> servers() const { return m_servers; } QList clients() const { return m_clients; } QString controlAddr() const { return m_controlAddr; } void setControlAddr(const QString& a) { m_controlAddr = a; } quint16 controlPort() const; void setControlPort(quint16 p); bool autoSockets() const { return m_autoSockets; } void setAutoSockets(bool v) { m_autoSockets = v; } QString filePath() const { return m_path; } /* GUI settings (from [gui] section) */ QString dbPath() const { return m_dbPath; } void setDbPath(const QString& p) { m_dbPath = p; } QString debugFile() const { return m_debugFile; } void setDebugFile(const QString& p) { m_debugFile = p; } QString debugLevel() const { return m_debugLevel; } QString debugCategories() const { return m_debugCategories; } /* Config validation errors (collected during load()) */ bool hasErrors() const { return !m_errors.isEmpty(); } const QStringList& errors() const { return m_errors; } /* Identity generation (public for fixing invalid keys) */ void generateIdentity(); private: QString m_path; QString m_nodeName; QString m_nodeId; QString m_pubKey; QString m_privKey; QList> m_servers; QList m_clients; QString m_controlAddr; bool m_autoSockets = true; QString m_dbPath; QString m_debugFile; QString m_debugLevel; QString m_debugCategories; QStringList m_errors; }; #endif // NODE_CONFIG_H