From 3393b9739282ffcd83aeb83b855d51867717d14a Mon Sep 17 00:00:00 2001 From: Cyril Anisimov Date: Mon, 16 Jun 2025 01:08:53 +0200 Subject: [PATCH] refactor `OpenVpnConfigModel` --- .../models/protocols/openvpnConfigModel.cpp | 183 ++++++++++-------- .../ui/models/protocols/openvpnConfigModel.h | 97 +++++++--- 2 files changed, 177 insertions(+), 103 deletions(-) diff --git a/client/ui/models/protocols/openvpnConfigModel.cpp b/client/ui/models/protocols/openvpnConfigModel.cpp index a04c2b1a..6c28de4d 100644 --- a/client/ui/models/protocols/openvpnConfigModel.cpp +++ b/client/ui/models/protocols/openvpnConfigModel.cpp @@ -2,72 +2,128 @@ #include "protocols/protocols_defs.h" -OpenVpnConfigModel::OpenVpnConfigModel(QObject *parent) : QAbstractListModel(parent) +OpenVpnConfigModel::OpenVpnConfigModel(QObject *parent) + : QObject(parent) { } -int OpenVpnConfigModel::rowCount(const QModelIndex &parent) const +QString OpenVpnConfigModel::subnetAddress() const { - Q_UNUSED(parent); - return 1; + return m_protocolConfig.value(amnezia::config_key::subnet_address).toString(amnezia::protocols::openvpn::defaultSubnetAddress); } -bool OpenVpnConfigModel::setData(const QModelIndex &index, const QVariant &value, int role) +void OpenVpnConfigModel::setSubnetAddress(const QString &subnetAddress) { - if (!index.isValid() || index.row() < 0 || index.row() >= ContainerProps::allContainers().size()) { - return false; - } - - switch (role) { - case Roles::SubnetAddressRole: m_protocolConfig.insert(amnezia::config_key::subnet_address, value.toString()); break; - case Roles::TransportProtoRole: m_protocolConfig.insert(config_key::transport_proto, value.toString()); break; - case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; - case Roles::AutoNegotiateEncryprionRole: m_protocolConfig.insert(config_key::ncp_disable, !value.toBool()); break; - case Roles::HashRole: m_protocolConfig.insert(config_key::hash, value.toString()); break; - case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; - case Roles::TlsAuthRole: m_protocolConfig.insert(config_key::tls_auth, value.toBool()); break; - case Roles::BlockDnsRole: m_protocolConfig.insert(config_key::block_outside_dns, value.toBool()); break; - case Roles::AdditionalClientCommandsRole: m_protocolConfig.insert(config_key::additional_client_config, value.toString()); break; - case Roles::AdditionalServerCommandsRole: m_protocolConfig.insert(config_key::additional_server_config, value.toString()); break; - } - - emit dataChanged(index, index, QList { role }); - return true; + m_protocolConfig.insert(amnezia::config_key::subnet_address, subnetAddress); } -QVariant OpenVpnConfigModel::data(const QModelIndex &index, int role) const +QString OpenVpnConfigModel::transportProto() const { - if (!index.isValid() || index.row() < 0 || index.row() >= rowCount()) { - return false; - } + return m_protocolConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto); +} - switch (role) { - case Roles::SubnetAddressRole: - return m_protocolConfig.value(amnezia::config_key::subnet_address).toString(amnezia::protocols::openvpn::defaultSubnetAddress); - case Roles::TransportProtoRole: - return m_protocolConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto); - case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::openvpn::defaultPort); - case Roles::AutoNegotiateEncryprionRole: - return !m_protocolConfig.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable); - case Roles::HashRole: return m_protocolConfig.value(config_key::hash).toString(protocols::openvpn::defaultHash); - case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher); - case Roles::TlsAuthRole: return m_protocolConfig.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth); - case Roles::BlockDnsRole: - return m_protocolConfig.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns); - case Roles::AdditionalClientCommandsRole: - return m_protocolConfig.value(config_key::additional_client_config).toString(protocols::openvpn::defaultAdditionalClientConfig); - case Roles::AdditionalServerCommandsRole: - return m_protocolConfig.value(config_key::additional_server_config).toString(protocols::openvpn::defaultAdditionalServerConfig); - case Roles::IsPortEditable: return m_container == DockerContainer::OpenVpn ? true : false; - case Roles::IsTransportProtoEditable: return m_container == DockerContainer::OpenVpn ? true : false; - case Roles::HasRemoveButton: return m_container == DockerContainer::OpenVpn ? true : false; - } - return QVariant(); +void OpenVpnConfigModel::setTransportProto(const QString &transportProto) +{ + m_protocolConfig.insert(config_key::transport_proto, transportProto); +} + +QString OpenVpnConfigModel::port() const +{ + return m_protocolConfig.value(config_key::port).toString(protocols::openvpn::defaultPort); +} + +void OpenVpnConfigModel::setPort(const QString &port) +{ + m_protocolConfig.insert(config_key::port, port); +} + +bool OpenVpnConfigModel::autoNegotiateEncryption() const +{ + return !m_protocolConfig.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable); +} + +void OpenVpnConfigModel::setAutoNegotiateEncryption(bool enabled) +{ + m_protocolConfig.insert(config_key::ncp_disable, !enabled); +} + +QString OpenVpnConfigModel::hash() const +{ + return m_protocolConfig.value(config_key::hash).toString(protocols::openvpn::defaultHash); +} + +void OpenVpnConfigModel::setHash(const QString &hash) +{ + m_protocolConfig.insert(config_key::hash, hash); +} + +QString OpenVpnConfigModel::cipher() const +{ + return m_protocolConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher); +} + +void OpenVpnConfigModel::setCipher(const QString &cipher) +{ + m_protocolConfig.insert(config_key::cipher, cipher); +} + +bool OpenVpnConfigModel::tlsAuth() const +{ + return m_protocolConfig.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth); +} + +void OpenVpnConfigModel::setTlsAuth(bool enabled) +{ + m_protocolConfig.insert(config_key::tls_auth, enabled); +} + +bool OpenVpnConfigModel::blockDns() const +{ + return m_protocolConfig.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns); +} + +void OpenVpnConfigModel::setBlockDns(bool enabled) +{ + m_protocolConfig.insert(config_key::block_outside_dns, enabled); +} + +QString OpenVpnConfigModel::additionalClientCommands() const +{ + return m_protocolConfig.value(config_key::additional_client_config).toString(protocols::openvpn::defaultAdditionalClientConfig); +} + +void OpenVpnConfigModel::setAdditionalClientCommands(const QString &commands) +{ + m_protocolConfig.insert(config_key::additional_client_config, commands); +} + +QString OpenVpnConfigModel::additionalServerCommands() const +{ + return m_protocolConfig.value(config_key::additional_server_config).toString(protocols::openvpn::defaultAdditionalServerConfig); +} + +void OpenVpnConfigModel::setAdditionalServerCommands(const QString &commands) +{ + m_protocolConfig.insert(config_key::additional_server_config, commands); +} + +bool OpenVpnConfigModel::isPortEditable() const +{ + return m_container == DockerContainer::OpenVpn; +} + +bool OpenVpnConfigModel::isTransportProtoEditable() const +{ + return m_container == DockerContainer::OpenVpn; +} + +bool OpenVpnConfigModel::hasRemoveButton() const +{ + return m_container == DockerContainer::OpenVpn; } void OpenVpnConfigModel::updateModel(const QJsonObject &config) { - beginResetModel(); m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_fullConfig = config; @@ -100,8 +156,6 @@ void OpenVpnConfigModel::updateModel(const QJsonObject &config) m_protocolConfig.insert( config_key::additional_server_config, protocolConfig.value(config_key::additional_server_config).toString(protocols::openvpn::defaultAdditionalServerConfig)); - - endResetModel(); } QJsonObject OpenVpnConfigModel::getConfig() @@ -109,26 +163,3 @@ QJsonObject OpenVpnConfigModel::getConfig() m_fullConfig.insert(config_key::openvpn, m_protocolConfig); return m_fullConfig; } - -QHash OpenVpnConfigModel::roleNames() const -{ - QHash roles; - - roles[SubnetAddressRole] = "subnetAddress"; - roles[TransportProtoRole] = "transportProto"; - roles[PortRole] = "port"; - roles[AutoNegotiateEncryprionRole] = "autoNegotiateEncryprion"; - roles[HashRole] = "hash"; - roles[CipherRole] = "cipher"; - roles[TlsAuthRole] = "tlsAuth"; - roles[BlockDnsRole] = "blockDns"; - roles[AdditionalClientCommandsRole] = "additionalClientCommands"; - roles[AdditionalServerCommandsRole] = "additionalServerCommands"; - - roles[IsPortEditable] = "isPortEditable"; - roles[IsTransportProtoEditable] = "isTransportProtoEditable"; - - roles[HasRemoveButton] = "hasRemoveButton"; - - return roles; -} diff --git a/client/ui/models/protocols/openvpnConfigModel.h b/client/ui/models/protocols/openvpnConfigModel.h index 0357700c..e50ee4a3 100644 --- a/client/ui/models/protocols/openvpnConfigModel.h +++ b/client/ui/models/protocols/openvpnConfigModel.h @@ -1,47 +1,90 @@ #ifndef OPENVPNCONFIGMODEL_H #define OPENVPNCONFIGMODEL_H -#include +#include #include #include "containers/containers_defs.h" -class OpenVpnConfigModel : public QAbstractListModel +class OpenVpnConfigModel : public QObject { Q_OBJECT + Q_PROPERTY(QString subnetAddress READ subnetAddress WRITE setSubnetAddress NOTIFY subnetAddressChanged) + Q_PROPERTY(QString transportProto READ transportProto WRITE setTransportProto NOTIFY transportProtoChanged) + Q_PROPERTY(QString port READ port WRITE setPort NOTIFY portChanged) + Q_PROPERTY(bool autoNegotiateEncryption READ autoNegotiateEncryption WRITE setAutoNegotiateEncryption NOTIFY autoNegotiateEncryptionChanged) + Q_PROPERTY(QString hash READ hash WRITE setHash NOTIFY hashChanged) + Q_PROPERTY(QString cipher READ cipher WRITE setCipher NOTIFY cipherChanged) + Q_PROPERTY(bool tlsAuth READ tlsAuth WRITE setTlsAuth NOTIFY tlsAuthChanged) + Q_PROPERTY(bool blockDns READ blockDns WRITE setBlockDns NOTIFY blockDnsChanged) + Q_PROPERTY(QString additionalClientCommands READ additionalClientCommands WRITE setAdditionalClientCommands NOTIFY additionalClientCommandsChanged) + Q_PROPERTY(QString additionalServerCommands READ additionalServerCommands WRITE setAdditionalServerCommands NOTIFY additionalServerCommandsChanged) + Q_PROPERTY(bool isPortEditable READ isPortEditable NOTIFY isPortEditableChanged) + Q_PROPERTY(bool isTransportProtoEditable READ isTransportProtoEditable NOTIFY isTransportProtoEditableChanged) + Q_PROPERTY(bool hasRemoveButton READ hasRemoveButton NOTIFY hasRemoveButtonChanged) public: - enum Roles { - SubnetAddressRole = Qt::UserRole + 1, - TransportProtoRole, - PortRole, - AutoNegotiateEncryprionRole, - HashRole, - CipherRole, - TlsAuthRole, - BlockDnsRole, - AdditionalClientCommandsRole, - AdditionalServerCommandsRole, - - IsPortEditable, - IsTransportProtoEditable, - - HasRemoveButton - }; - explicit OpenVpnConfigModel(QObject *parent = nullptr); + ~OpenVpnConfigModel() override = default; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; + OpenVpnConfigModel(const OpenVpnConfigModel &) = delete; + OpenVpnConfigModel &operator=(const OpenVpnConfigModel &) = delete; + OpenVpnConfigModel(OpenVpnConfigModel &&) = delete; + OpenVpnConfigModel &operator=(OpenVpnConfigModel &&) = delete; - bool setData(const QModelIndex &index, const QVariant &value, int role) override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QString subnetAddress() const; + void setSubnetAddress(const QString &subnetAddress); + + QString transportProto() const; + void setTransportProto(const QString &transportProto); + + QString port() const; + void setPort(const QString &port); + + bool autoNegotiateEncryption() const; + void setAutoNegotiateEncryption(bool enabled); + + QString hash() const; + void setHash(const QString &hash); + + QString cipher() const; + void setCipher(const QString &cipher); + + bool tlsAuth() const; + void setTlsAuth(bool enabled); + + bool blockDns() const; + void setBlockDns(bool enabled); + + QString additionalClientCommands() const; + void setAdditionalClientCommands(const QString &commands); + + QString additionalServerCommands() const; + void setAdditionalServerCommands(const QString &commands); + + bool isPortEditable() const; + bool isTransportProtoEditable() const; + bool hasRemoveButton() const; + + Q_INVOKABLE QJsonObject getConfig(); + +signals: + void subnetAddressChanged(const QString &); + void transportProtoChanged(const QString &); + void portChanged(const QString &); + void autoNegotiateEncryptionChanged(bool); + void hashChanged(const QString &); + void cipherChanged(const QString &); + void tlsAuthChanged(bool); + void blockDnsChanged(bool); + void additionalClientCommandsChanged(const QString &); + void additionalServerCommandsChanged(const QString &); + void isPortEditableChanged(bool); + void isTransportProtoEditableChanged(bool); + void hasRemoveButtonChanged(bool); public slots: void updateModel(const QJsonObject &config); - QJsonObject getConfig(); - -protected: - QHash roleNames() const override; private: DockerContainer m_container;