// 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(); 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; } bool addServer(const QString& name, const QString& addr); bool removeServer(const QString& name); QList clients() const { return m_clients; } bool addClient(const QString& name, const QString& pubKeyHex, const QString& serverName, const QString& remoteAddr); bool removeClient(const QString& name); QString controlAddr() const { return m_controlAddr; } void setControlAddr(const QString& a) { m_controlAddr = a; } quint16 controlPort() const; void setControlPort(quint16 p); QString filePath() const { return m_path; } /* GUI settings (from [gui] section) */ QString dbPath() const { return m_dbPath; } QString debugFile() const { return m_debugFile; } 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; QString m_dbPath; QString m_debugFile; QString m_debugLevel; QString m_debugCategories; QStringList m_errors; }; #endif // NODE_CONFIG_H