From d766a001e3eb8d20f9bb4ce644b9c7534aae5373 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 3 Jul 2025 10:20:01 +0800 Subject: [PATCH] refactoring: all protocol models now work with c++ classes --- .../models/protocols/cloakProtocolConfig.cpp | 15 +++ .../models/protocols/cloakProtocolConfig.h | 3 + .../protocols/openvpnProtocolConfig.cpp | 47 +++++--- .../models/protocols/openvpnProtocolConfig.h | 9 +- .../core/models/protocols/protocolConfig.cpp | 11 +- .../protocols/shadowsocksProtocolConfig.cpp | 14 +++ .../protocols/shadowsocksProtocolConfig.h | 3 + .../protocols/wireguardProtocolConfig.cpp | 14 +++ .../protocols/wireguardProtocolConfig.h | 3 + .../models/protocols/xrayProtocolConfig.cpp | 15 +++ .../models/protocols/xrayProtocolConfig.h | 3 + client/ui/controllers/installController.cpp | 7 +- client/ui/models/containers_model.cpp | 12 -- client/ui/models/containers_model.h | 3 - .../ui/models/protocols/cloakConfigModel.cpp | 46 ++++---- client/ui/models/protocols/cloakConfigModel.h | 12 +- .../models/protocols/openvpnConfigModel.cpp | 107 +++++++----------- .../ui/models/protocols/openvpnConfigModel.h | 12 +- .../protocols/shadowsocksConfigModel.cpp | 46 ++++---- .../models/protocols/shadowsocksConfigModel.h | 12 +- .../models/protocols/wireguardConfigModel.cpp | 88 +++----------- .../models/protocols/wireguardConfigModel.h | 24 +--- .../ui/models/protocols/xrayConfigModel.cpp | 42 +++---- client/ui/models/protocols/xrayConfigModel.h | 12 +- client/ui/models/protocols_model.cpp | 36 +++--- 25 files changed, 301 insertions(+), 295 deletions(-) diff --git a/client/core/models/protocols/cloakProtocolConfig.cpp b/client/core/models/protocols/cloakProtocolConfig.cpp index b32e652e..c5dd916a 100644 --- a/client/core/models/protocols/cloakProtocolConfig.cpp +++ b/client/core/models/protocols/cloakProtocolConfig.cpp @@ -40,4 +40,19 @@ QJsonObject CloakProtocolConfig::toJson() const } return json; +} + +bool CloakProtocolConfig::hasEqualServerSettings(const CloakProtocolConfig &other) const +{ + if (serverProtocolConfig.port != other.serverProtocolConfig.port || + serverProtocolConfig.cipher != other.serverProtocolConfig.cipher || + serverProtocolConfig.site != other.serverProtocolConfig.site) { + return false; + } + return true; +} + +void CloakProtocolConfig::clearClientSettings() +{ + clientProtocolConfig = cloak::ClientProtocolConfig(); } diff --git a/client/core/models/protocols/cloakProtocolConfig.h b/client/core/models/protocols/cloakProtocolConfig.h index 191e3f2d..f82dc34e 100644 --- a/client/core/models/protocols/cloakProtocolConfig.h +++ b/client/core/models/protocols/cloakProtocolConfig.h @@ -28,6 +28,9 @@ public: QJsonObject toJson() const override; + bool hasEqualServerSettings(const CloakProtocolConfig &other) const; + void clearClientSettings(); + cloak::ServerProtocolConfig serverProtocolConfig; cloak::ClientProtocolConfig clientProtocolConfig; }; diff --git a/client/core/models/protocols/openvpnProtocolConfig.cpp b/client/core/models/protocols/openvpnProtocolConfig.cpp index cf994566..4b4c8e85 100644 --- a/client/core/models/protocols/openvpnProtocolConfig.cpp +++ b/client/core/models/protocols/openvpnProtocolConfig.cpp @@ -1,20 +1,22 @@ #include "openvpnProtocolConfig.h" -#include #include "protocols/protocols_defs.h" +#include using namespace amnezia; -OpenVpnProtocolConfig::OpenVpnProtocolConfig(const QJsonObject &protocolConfigObject, const QString &protocolName) : ProtocolConfig(protocolName) +OpenVpnProtocolConfig::OpenVpnProtocolConfig(const QJsonObject &protocolConfigObject, const QString &protocolName) + : ProtocolConfig(protocolName) { serverProtocolConfig.subnetAddress = protocolConfigObject.value(config_key::subnet_address).toString(); serverProtocolConfig.transportProto = protocolConfigObject.value(config_key::transport_proto).toString(); serverProtocolConfig.port = protocolConfigObject.value(config_key::port).toString(); - serverProtocolConfig.ncpDisable = protocolConfigObject.value(config_key::ncp_disable).toString(); + serverProtocolConfig.ncpDisable = protocolConfigObject.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable); serverProtocolConfig.hash = protocolConfigObject.value(config_key::hash).toString(); serverProtocolConfig.cipher = protocolConfigObject.value(config_key::cipher).toString(); - serverProtocolConfig.tlsAuth = protocolConfigObject.value(config_key::tls_auth).toString(); - serverProtocolConfig.blockOutsideDns = protocolConfigObject.value(config_key::block_outside_dns).toString(); + serverProtocolConfig.tlsAuth = protocolConfigObject.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth); + serverProtocolConfig.blockOutsideDns = + protocolConfigObject.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns); serverProtocolConfig.additionalClientConfig = protocolConfigObject.value(config_key::additional_client_config).toString(); serverProtocolConfig.additionalServerConfig = protocolConfigObject.value(config_key::additional_server_config).toString(); @@ -42,21 +44,15 @@ QJsonObject OpenVpnProtocolConfig::toJson() const if (!serverProtocolConfig.port.isEmpty()) { json[config_key::port] = serverProtocolConfig.port; } - if (!serverProtocolConfig.ncpDisable.isEmpty()) { - json[config_key::ncp_disable] = serverProtocolConfig.ncpDisable; - } + json[config_key::ncp_disable] = serverProtocolConfig.ncpDisable; if (!serverProtocolConfig.hash.isEmpty()) { json[config_key::hash] = serverProtocolConfig.hash; } if (!serverProtocolConfig.cipher.isEmpty()) { json[config_key::cipher] = serverProtocolConfig.cipher; } - if (!serverProtocolConfig.tlsAuth.isEmpty()) { - json[config_key::tls_auth] = serverProtocolConfig.tlsAuth; - } - if (!serverProtocolConfig.blockOutsideDns.isEmpty()) { - json[config_key::block_outside_dns] = serverProtocolConfig.blockOutsideDns; - } + json[config_key::tls_auth] = serverProtocolConfig.tlsAuth; + json[config_key::block_outside_dns] = serverProtocolConfig.blockOutsideDns; if (!serverProtocolConfig.additionalClientConfig.isEmpty()) { json[config_key::additional_client_config] = serverProtocolConfig.additionalClientConfig; } @@ -80,4 +76,25 @@ QJsonObject OpenVpnProtocolConfig::toJson() const } return json; -} +} + +bool OpenVpnProtocolConfig::hasEqualServerSettings(const OpenVpnProtocolConfig &other) const +{ + if (serverProtocolConfig.subnetAddress != other.serverProtocolConfig.subnetAddress + || serverProtocolConfig.transportProto != other.serverProtocolConfig.transportProto + || serverProtocolConfig.port != other.serverProtocolConfig.port + || serverProtocolConfig.ncpDisable != other.serverProtocolConfig.ncpDisable + || serverProtocolConfig.hash != other.serverProtocolConfig.hash || serverProtocolConfig.cipher != other.serverProtocolConfig.cipher + || serverProtocolConfig.tlsAuth != other.serverProtocolConfig.tlsAuth + || serverProtocolConfig.blockOutsideDns != other.serverProtocolConfig.blockOutsideDns + || serverProtocolConfig.additionalClientConfig != other.serverProtocolConfig.additionalClientConfig + || serverProtocolConfig.additionalServerConfig != other.serverProtocolConfig.additionalServerConfig) { + return false; + } + return true; +} + +void OpenVpnProtocolConfig::clearClientSettings() +{ + clientProtocolConfig = openvpn::ClientProtocolConfig(); +} diff --git a/client/core/models/protocols/openvpnProtocolConfig.h b/client/core/models/protocols/openvpnProtocolConfig.h index 0e6d4e6a..89d44754 100644 --- a/client/core/models/protocols/openvpnProtocolConfig.h +++ b/client/core/models/protocols/openvpnProtocolConfig.h @@ -13,11 +13,11 @@ namespace openvpn QString subnetAddress; QString transportProto; QString port; - QString ncpDisable; + bool ncpDisable; QString hash; QString cipher; - QString tlsAuth; - QString blockOutsideDns; + bool tlsAuth; + bool blockOutsideDns; QString additionalClientConfig; QString additionalServerConfig; }; @@ -39,6 +39,9 @@ public: QJsonObject toJson() const override; + bool hasEqualServerSettings(const OpenVpnProtocolConfig &other) const; + void clearClientSettings(); + openvpn::ServerProtocolConfig serverProtocolConfig; openvpn::ClientProtocolConfig clientProtocolConfig; }; diff --git a/client/core/models/protocols/protocolConfig.cpp b/client/core/models/protocols/protocolConfig.cpp index 16e3ea9f..eb96c936 100644 --- a/client/core/models/protocols/protocolConfig.cpp +++ b/client/core/models/protocols/protocolConfig.cpp @@ -5,6 +5,7 @@ #include "core/models/protocols/openvpnProtocolConfig.h" #include "core/models/protocols/protocolConfig.h" #include "core/models/protocols/shadowsocksProtocolConfig.h" +#include "core/models/protocols/wireguardProtocolConfig.h" #include "core/models/protocols/xrayProtocolConfig.h" #include "protocols/protocols_defs.h" @@ -38,27 +39,27 @@ bool ProtocolConfig::isServerSettingsEqual(const QSharedPointer case Proto::OpenVpn: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); auto otherConfig = qSharedPointerCast(other); - return false; + return thisConfig->hasEqualServerSettings(*otherConfig.data()); } case Proto::WireGuard: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); auto otherConfig = qSharedPointerCast(other); - return false; + return thisConfig->hasEqualServerSettings(*otherConfig.data()); } case Proto::ShadowSocks: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); auto otherConfig = qSharedPointerCast(other); - return false; + return thisConfig->hasEqualServerSettings(*otherConfig.data()); } case Proto::Cloak: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); auto otherConfig = qSharedPointerCast(other); - return false; + return thisConfig->hasEqualServerSettings(*otherConfig.data()); } case Proto::Xray: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); auto otherConfig = qSharedPointerCast(other); - return false; + return thisConfig->hasEqualServerSettings(*otherConfig.data()); } case Proto::Awg: { auto thisConfig = qSharedPointerCast(QSharedPointer(this)); diff --git a/client/core/models/protocols/shadowsocksProtocolConfig.cpp b/client/core/models/protocols/shadowsocksProtocolConfig.cpp index e5f9b978..30539a9b 100644 --- a/client/core/models/protocols/shadowsocksProtocolConfig.cpp +++ b/client/core/models/protocols/shadowsocksProtocolConfig.cpp @@ -36,4 +36,18 @@ QJsonObject ShadowsocksProtocolConfig::toJson() const } return json; +} + +bool ShadowsocksProtocolConfig::hasEqualServerSettings(const ShadowsocksProtocolConfig &other) const +{ + if (serverProtocolConfig.port != other.serverProtocolConfig.port || + serverProtocolConfig.cipher != other.serverProtocolConfig.cipher) { + return false; + } + return true; +} + +void ShadowsocksProtocolConfig::clearClientSettings() +{ + clientProtocolConfig = shadowsocks::ClientProtocolConfig(); } diff --git a/client/core/models/protocols/shadowsocksProtocolConfig.h b/client/core/models/protocols/shadowsocksProtocolConfig.h index 3c615f8a..1b7480f8 100644 --- a/client/core/models/protocols/shadowsocksProtocolConfig.h +++ b/client/core/models/protocols/shadowsocksProtocolConfig.h @@ -27,6 +27,9 @@ public: QJsonObject toJson() const override; + bool hasEqualServerSettings(const ShadowsocksProtocolConfig &other) const; + void clearClientSettings(); + shadowsocks::ServerProtocolConfig serverProtocolConfig; shadowsocks::ClientProtocolConfig clientProtocolConfig; }; diff --git a/client/core/models/protocols/wireguardProtocolConfig.cpp b/client/core/models/protocols/wireguardProtocolConfig.cpp index 602cbce5..c44173d2 100644 --- a/client/core/models/protocols/wireguardProtocolConfig.cpp +++ b/client/core/models/protocols/wireguardProtocolConfig.cpp @@ -118,3 +118,17 @@ QJsonObject WireGuardProtocolConfig::toJson() const return json; } + +bool WireGuardProtocolConfig::hasEqualServerSettings(const WireGuardProtocolConfig &other) const +{ + if (serverProtocolConfig.subnetAddress != other.serverProtocolConfig.subnetAddress || + serverProtocolConfig.port != other.serverProtocolConfig.port) { + return false; + } + return true; +} + +void WireGuardProtocolConfig::clearClientSettings() +{ + clientProtocolConfig = wireguard::ClientProtocolConfig(); +} diff --git a/client/core/models/protocols/wireguardProtocolConfig.h b/client/core/models/protocols/wireguardProtocolConfig.h index acefafe2..7d3f6620 100644 --- a/client/core/models/protocols/wireguardProtocolConfig.h +++ b/client/core/models/protocols/wireguardProtocolConfig.h @@ -51,6 +51,9 @@ public: QJsonObject toJson() const override; + bool hasEqualServerSettings(const WireGuardProtocolConfig &other) const; + void clearClientSettings(); + wireguard::ServerProtocolConfig serverProtocolConfig; wireguard::ClientProtocolConfig clientProtocolConfig; }; diff --git a/client/core/models/protocols/xrayProtocolConfig.cpp b/client/core/models/protocols/xrayProtocolConfig.cpp index 32ad108a..00127031 100644 --- a/client/core/models/protocols/xrayProtocolConfig.cpp +++ b/client/core/models/protocols/xrayProtocolConfig.cpp @@ -40,4 +40,19 @@ QJsonObject XrayProtocolConfig::toJson() const } return json; +} + +bool XrayProtocolConfig::hasEqualServerSettings(const XrayProtocolConfig &other) const +{ + if (serverProtocolConfig.site != other.serverProtocolConfig.site || + serverProtocolConfig.port != other.serverProtocolConfig.port || + serverProtocolConfig.transportProto != other.serverProtocolConfig.transportProto) { + return false; + } + return true; +} + +void XrayProtocolConfig::clearClientSettings() +{ + clientProtocolConfig = xray::ClientProtocolConfig(); } diff --git a/client/core/models/protocols/xrayProtocolConfig.h b/client/core/models/protocols/xrayProtocolConfig.h index 87023954..941816fe 100644 --- a/client/core/models/protocols/xrayProtocolConfig.h +++ b/client/core/models/protocols/xrayProtocolConfig.h @@ -28,6 +28,9 @@ public: QJsonObject toJson() const override; + bool hasEqualServerSettings(const XrayProtocolConfig &other) const; + void clearClientSettings(); + xray::ServerProtocolConfig serverProtocolConfig; xray::ClientProtocolConfig clientProtocolConfig; }; diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 80ef5090..c12beb2d 100755 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -80,7 +80,7 @@ void InstallController::install(DockerContainer container, int port, TransportPr int s1 = QRandomGenerator::global()->bounded(15, 150); int s2 = QRandomGenerator::global()->bounded(15, 150); - while (s1 + AwgConstant::messageInitiationSize == s2 + AwgConstant::messageResponseSize) { + while (s1 + awg::messageInitiationSize == s2 + awg::messageResponseSize) { s2 = QRandomGenerator::global()->bounded(15, 150); } @@ -935,6 +935,11 @@ bool InstallController::isUpdateDockerContainerRequired(const DockerContainer co auto oldConfig = qSharedPointerCast(newProtoConfig); return !newConfig->hasEqualServerSettings(*oldConfig.data()); } + case Proto::WireGuard: { + auto newConfig = qSharedPointerCast(oldProtoConfig); + auto oldConfig = qSharedPointerCast(newProtoConfig); + return !newConfig->hasEqualServerSettings(*oldConfig.data()); + } default: return true; } } diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index 817004ae..fa92088d 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -24,12 +24,6 @@ QVariant ContainersModel::data(const QModelIndex &index, int role) const case NameRole: return ContainerProps::containerHumanNames().value(container); case DescriptionRole: return ContainerProps::containerDescriptions().value(container); case DetailedDescriptionRole: return ContainerProps::containerDetailedDescriptions().value(container); - case ConfigRole: { - if (container == DockerContainer::None) { - return QJsonObject(); - } - return m_containers.value(container); - } case ServiceTypeRole: return ContainerProps::containerService(container); case DockerContainerRole: return container; case IsEasySetupContainerRole: return ContainerProps::isEasySetupContainer(container); @@ -74,11 +68,6 @@ QString ContainersModel::getProcessedContainerName() return ContainerProps::containerHumanNames().value(static_cast(m_processedContainerIndex)); } -QJsonObject ContainersModel::getContainerConfig(const int containerIndex) -{ - return qvariant_cast(data(index(containerIndex), ConfigRole)); -} - bool ContainersModel::isSupportedByCurrentPlatform(const int containerIndex) { return qvariant_cast(data(index(containerIndex), IsSupportedRole)); @@ -117,7 +106,6 @@ QHash ContainersModel::roleNames() const roles[DetailedDescriptionRole] = "detailedDescription"; roles[ServiceTypeRole] = "serviceType"; roles[DockerContainerRole] = "dockerContainer"; - roles[ConfigRole] = "config"; roles[IsEasySetupContainerRole] = "isEasySetupContainer"; roles[EasySetupHeaderRole] = "easySetupHeader"; diff --git a/client/ui/models/containers_model.h b/client/ui/models/containers_model.h index 9d1407a1..d471c58a 100644 --- a/client/ui/models/containers_model.h +++ b/client/ui/models/containers_model.h @@ -18,7 +18,6 @@ public: DescriptionRole, DetailedDescriptionRole, ServiceTypeRole, - ConfigRole, DockerContainerRole, IsEasySetupContainerRole, @@ -48,8 +47,6 @@ public slots: QString getProcessedContainerName(); - QJsonObject getContainerConfig(const int containerIndex); - bool isSupportedByCurrentPlatform(const int containerIndex); bool isServiceContainer(const int containerIndex); diff --git a/client/ui/models/protocols/cloakConfigModel.cpp b/client/ui/models/protocols/cloakConfigModel.cpp index a9f06f4d..321ec9e6 100644 --- a/client/ui/models/protocols/cloakConfigModel.cpp +++ b/client/ui/models/protocols/cloakConfigModel.cpp @@ -2,7 +2,10 @@ #include "protocols/protocols_defs.h" -CloakConfigModel::CloakConfigModel(QObject *parent) : QAbstractListModel(parent) +CloakConfigModel::CloakConfigModel(QObject *parent) + : QAbstractListModel(parent), + m_newCloakProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::Cloak)), + m_oldCloakProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::Cloak)) { } @@ -19,9 +22,9 @@ bool CloakConfigModel::setData(const QModelIndex &index, const QVariant &value, } switch (role) { - case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; - case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; - case Roles::SiteRole: m_protocolConfig.insert(config_key::site, value.toString()); break; + case Roles::PortRole: m_newCloakProtocolConfig.serverProtocolConfig.port = value.toString(); break; + case Roles::CipherRole: m_newCloakProtocolConfig.serverProtocolConfig.cipher = value.toString(); break; + case Roles::SiteRole: m_newCloakProtocolConfig.serverProtocolConfig.site = value.toString(); break; } emit dataChanged(index, index, QList { role }); @@ -35,35 +38,33 @@ QVariant CloakConfigModel::data(const QModelIndex &index, int role) const } switch (role) { - case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::cloak::defaultPort); - case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::cloak::defaultCipher); - case Roles::SiteRole: return m_protocolConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite); + case Roles::PortRole: return m_newCloakProtocolConfig.serverProtocolConfig.port; + case Roles::CipherRole: return m_newCloakProtocolConfig.serverProtocolConfig.cipher; + case Roles::SiteRole: return m_newCloakProtocolConfig.serverProtocolConfig.site; } return QVariant(); } -void CloakConfigModel::updateModel(const QJsonObject &config) +void CloakConfigModel::updateModel(const CloakProtocolConfig cloakProtocolConfig) { beginResetModel(); - m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); - - m_fullConfig = config; - QJsonObject protocolConfig = config.value(config_key::cloak).toObject(); - - auto defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Cloak), Proto::Cloak); - m_protocolConfig.insert(config_key::transport_proto, protocolConfig.value(config_key::transport_proto).toString(defaultTransportProto)); - m_protocolConfig.insert(config_key::cipher, protocolConfig.value(config_key::cipher).toString(protocols::cloak::defaultCipher)); - m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString(protocols::cloak::defaultPort)); - m_protocolConfig.insert(config_key::site, protocolConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite)); - + m_newCloakProtocolConfig = cloakProtocolConfig; + m_oldCloakProtocolConfig = cloakProtocolConfig; endResetModel(); } -QJsonObject CloakConfigModel::getConfig() +QSharedPointer CloakConfigModel::getConfig() { - m_fullConfig.insert(config_key::cloak, m_protocolConfig); - return m_fullConfig; + if (m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig)) { + m_newCloakProtocolConfig.clearClientSettings(); + } + return QSharedPointer::create(m_newCloakProtocolConfig); +} + +bool CloakConfigModel::isServerSettingsEqual() +{ + return m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig); } QHash CloakConfigModel::roleNames() const @@ -76,3 +77,4 @@ QHash CloakConfigModel::roleNames() const return roles; } + diff --git a/client/ui/models/protocols/cloakConfigModel.h b/client/ui/models/protocols/cloakConfigModel.h index 31ff8c53..8de8d305 100644 --- a/client/ui/models/protocols/cloakConfigModel.h +++ b/client/ui/models/protocols/cloakConfigModel.h @@ -5,6 +5,7 @@ #include #include "containers/containers_defs.h" +#include "core/models/protocols/cloakProtocolConfig.h" class CloakConfigModel : public QAbstractListModel { @@ -25,16 +26,17 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void updateModel(const QJsonObject &config); - QJsonObject getConfig(); + void updateModel(const CloakProtocolConfig cloakProtocolConfig); + QSharedPointer getConfig(); + + bool isServerSettingsEqual(); protected: QHash roleNames() const override; private: - DockerContainer m_container; - QJsonObject m_protocolConfig; - QJsonObject m_fullConfig; + CloakProtocolConfig m_newCloakProtocolConfig; + CloakProtocolConfig m_oldCloakProtocolConfig; }; #endif // CLOAKCONFIGMODEL_H diff --git a/client/ui/models/protocols/openvpnConfigModel.cpp b/client/ui/models/protocols/openvpnConfigModel.cpp index a04c2b1a..96f46ba0 100644 --- a/client/ui/models/protocols/openvpnConfigModel.cpp +++ b/client/ui/models/protocols/openvpnConfigModel.cpp @@ -2,7 +2,10 @@ #include "protocols/protocols_defs.h" -OpenVpnConfigModel::OpenVpnConfigModel(QObject *parent) : QAbstractListModel(parent) +OpenVpnConfigModel::OpenVpnConfigModel(QObject *parent) + : QAbstractListModel(parent), + m_newOpenVpnProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::OpenVpn)), + m_oldOpenVpnProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::OpenVpn)) { } @@ -19,16 +22,16 @@ bool OpenVpnConfigModel::setData(const QModelIndex &index, const QVariant &value } 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; + case Roles::SubnetAddressRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.subnetAddress = value.toString(); break; + case Roles::TransportProtoRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.transportProto = value.toString(); break; + case Roles::PortRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.port = value.toString(); break; + case Roles::AutoNegotiateEncryprionRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.ncpDisable = !value.toBool(); break; + case Roles::HashRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.hash = value.toString(); break; + case Roles::CipherRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.cipher = value.toString(); break; + case Roles::TlsAuthRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.tlsAuth = value.toBool(); break; + case Roles::BlockDnsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.blockOutsideDns = value.toBool(); break; + case Roles::AdditionalClientCommandsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalClientConfig = value.toString(); break; + case Roles::AdditionalServerCommandsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalServerConfig = value.toString(); break; } emit dataChanged(index, index, QList { role }); @@ -42,72 +45,42 @@ QVariant OpenVpnConfigModel::data(const QModelIndex &index, int role) const } 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; + case Roles::SubnetAddressRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.subnetAddress; + case Roles::TransportProtoRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.transportProto; + case Roles::PortRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.port; + case Roles::AutoNegotiateEncryprionRole: return !m_newOpenVpnProtocolConfig.serverProtocolConfig.ncpDisable; + case Roles::HashRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.hash; + case Roles::CipherRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.cipher; + case Roles::TlsAuthRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.tlsAuth; + case Roles::BlockDnsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.blockOutsideDns; + case Roles::AdditionalClientCommandsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalClientConfig; + case Roles::AdditionalServerCommandsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalServerConfig; + case Roles::IsPortEditable: return true; // TODO: implement container check if needed + case Roles::IsTransportProtoEditable: return true; // TODO: implement container check if needed + case Roles::HasRemoveButton: return true; // TODO: implement container check if needed } return QVariant(); } -void OpenVpnConfigModel::updateModel(const QJsonObject &config) +void OpenVpnConfigModel::updateModel(const OpenVpnProtocolConfig openVpnProtocolConfig) { beginResetModel(); - m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); - - m_fullConfig = config; - QJsonObject protocolConfig = config.value(config_key::openvpn).toObject(); - - m_protocolConfig.insert( - config_key::subnet_address, - protocolConfig.value(amnezia::config_key::subnet_address).toString(amnezia::protocols::openvpn::defaultSubnetAddress)); - - QString transportProto; - if (m_container == DockerContainer::OpenVpn) { - transportProto = protocolConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto); - } else { - transportProto = "tcp"; - } - - m_protocolConfig.insert(config_key::transport_proto, transportProto); - - m_protocolConfig.insert(config_key::ncp_disable, - protocolConfig.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable)); - m_protocolConfig.insert(config_key::cipher, protocolConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher)); - m_protocolConfig.insert(config_key::hash, protocolConfig.value(config_key::hash).toString(protocols::openvpn::defaultHash)); - m_protocolConfig.insert(config_key::block_outside_dns, - protocolConfig.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns)); - m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString(protocols::openvpn::defaultPort)); - m_protocolConfig.insert(config_key::tls_auth, protocolConfig.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth)); - m_protocolConfig.insert( - config_key::additional_client_config, - protocolConfig.value(config_key::additional_client_config).toString(protocols::openvpn::defaultAdditionalClientConfig)); - m_protocolConfig.insert( - config_key::additional_server_config, - protocolConfig.value(config_key::additional_server_config).toString(protocols::openvpn::defaultAdditionalServerConfig)); - + m_newOpenVpnProtocolConfig = openVpnProtocolConfig; + m_oldOpenVpnProtocolConfig = openVpnProtocolConfig; endResetModel(); } -QJsonObject OpenVpnConfigModel::getConfig() +QSharedPointer OpenVpnConfigModel::getConfig() { - m_fullConfig.insert(config_key::openvpn, m_protocolConfig); - return m_fullConfig; + if (m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig)) { + m_newOpenVpnProtocolConfig.clearClientSettings(); + } + return QSharedPointer::create(m_newOpenVpnProtocolConfig); +} + +bool OpenVpnConfigModel::isServerSettingsEqual() +{ + return m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig); } QHash OpenVpnConfigModel::roleNames() const diff --git a/client/ui/models/protocols/openvpnConfigModel.h b/client/ui/models/protocols/openvpnConfigModel.h index 0357700c..0105c926 100644 --- a/client/ui/models/protocols/openvpnConfigModel.h +++ b/client/ui/models/protocols/openvpnConfigModel.h @@ -5,6 +5,7 @@ #include #include "containers/containers_defs.h" +#include "core/models/protocols/openvpnProtocolConfig.h" class OpenVpnConfigModel : public QAbstractListModel { @@ -37,16 +38,17 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void updateModel(const QJsonObject &config); - QJsonObject getConfig(); + void updateModel(const OpenVpnProtocolConfig openVpnProtocolConfig); + QSharedPointer getConfig(); + + bool isServerSettingsEqual(); protected: QHash roleNames() const override; private: - DockerContainer m_container; - QJsonObject m_protocolConfig; - QJsonObject m_fullConfig; + OpenVpnProtocolConfig m_newOpenVpnProtocolConfig; + OpenVpnProtocolConfig m_oldOpenVpnProtocolConfig; }; #endif // OPENVPNCONFIGMODEL_H diff --git a/client/ui/models/protocols/shadowsocksConfigModel.cpp b/client/ui/models/protocols/shadowsocksConfigModel.cpp index 769bef20..064bd070 100644 --- a/client/ui/models/protocols/shadowsocksConfigModel.cpp +++ b/client/ui/models/protocols/shadowsocksConfigModel.cpp @@ -2,7 +2,10 @@ #include "protocols/protocols_defs.h" -ShadowSocksConfigModel::ShadowSocksConfigModel(QObject *parent) : QAbstractListModel(parent) +ShadowSocksConfigModel::ShadowSocksConfigModel(QObject *parent) + : QAbstractListModel(parent), + m_newShadowsocksProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::ShadowSocks)), + m_oldShadowsocksProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::ShadowSocks)) { } @@ -19,8 +22,8 @@ bool ShadowSocksConfigModel::setData(const QModelIndex &index, const QVariant &v } switch (role) { - case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; - case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; + case Roles::PortRole: m_newShadowsocksProtocolConfig.serverProtocolConfig.port = value.toString(); break; + case Roles::CipherRole: m_newShadowsocksProtocolConfig.serverProtocolConfig.cipher = value.toString(); break; } emit dataChanged(index, index, QList { role }); @@ -34,36 +37,34 @@ QVariant ShadowSocksConfigModel::data(const QModelIndex &index, int role) const } switch (role) { - case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort); - case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher); - case Roles::IsPortEditableRole: return m_container == DockerContainer::ShadowSocks ? true : false; - case Roles::IsCipherEditableRole: return m_container == DockerContainer::ShadowSocks ? true : false; + case Roles::PortRole: return m_newShadowsocksProtocolConfig.serverProtocolConfig.port; + case Roles::CipherRole: return m_newShadowsocksProtocolConfig.serverProtocolConfig.cipher; + case Roles::IsPortEditableRole: return true; // TODO: implement container check if needed + case Roles::IsCipherEditableRole: return true; // TODO: implement container check if needed } return QVariant(); } -void ShadowSocksConfigModel::updateModel(const QJsonObject &config) +void ShadowSocksConfigModel::updateModel(const ShadowsocksProtocolConfig shadowsocksProtocolConfig) { beginResetModel(); - m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); - - m_fullConfig = config; - QJsonObject protocolConfig = config.value(config_key::shadowsocks).toObject(); - - auto defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::ShadowSocks), Proto::ShadowSocks); - m_protocolConfig.insert(config_key::transport_proto, - protocolConfig.value(config_key::transport_proto).toString(defaultTransportProto)); - m_protocolConfig.insert(config_key::cipher, protocolConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher)); - m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort)); - + m_newShadowsocksProtocolConfig = shadowsocksProtocolConfig; + m_oldShadowsocksProtocolConfig = shadowsocksProtocolConfig; endResetModel(); } -QJsonObject ShadowSocksConfigModel::getConfig() +QSharedPointer ShadowSocksConfigModel::getConfig() { - m_fullConfig.insert(config_key::shadowsocks, m_protocolConfig); - return m_fullConfig; + if (m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig)) { + m_newShadowsocksProtocolConfig.clearClientSettings(); + } + return QSharedPointer::create(m_newShadowsocksProtocolConfig); +} + +bool ShadowSocksConfigModel::isServerSettingsEqual() +{ + return m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig); } QHash ShadowSocksConfigModel::roleNames() const @@ -77,3 +78,4 @@ QHash ShadowSocksConfigModel::roleNames() const return roles; } + diff --git a/client/ui/models/protocols/shadowsocksConfigModel.h b/client/ui/models/protocols/shadowsocksConfigModel.h index 566df768..21b05b31 100644 --- a/client/ui/models/protocols/shadowsocksConfigModel.h +++ b/client/ui/models/protocols/shadowsocksConfigModel.h @@ -5,6 +5,7 @@ #include #include "containers/containers_defs.h" +#include "core/models/protocols/shadowsocksProtocolConfig.h" class ShadowSocksConfigModel : public QAbstractListModel { @@ -26,16 +27,17 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void updateModel(const QJsonObject &config); - QJsonObject getConfig(); + void updateModel(const ShadowsocksProtocolConfig shadowsocksProtocolConfig); + QSharedPointer getConfig(); + + bool isServerSettingsEqual(); protected: QHash roleNames() const override; private: - DockerContainer m_container; - QJsonObject m_protocolConfig; - QJsonObject m_fullConfig; + ShadowsocksProtocolConfig m_newShadowsocksProtocolConfig; + ShadowsocksProtocolConfig m_oldShadowsocksProtocolConfig; }; #endif // SHADOWSOCKSCONFIGMODEL_H diff --git a/client/ui/models/protocols/wireguardConfigModel.cpp b/client/ui/models/protocols/wireguardConfigModel.cpp index 1c8e1341..a8b02272 100644 --- a/client/ui/models/protocols/wireguardConfigModel.cpp +++ b/client/ui/models/protocols/wireguardConfigModel.cpp @@ -4,7 +4,10 @@ #include "protocols/protocols_defs.h" -WireGuardConfigModel::WireGuardConfigModel(QObject *parent) : QAbstractListModel(parent) +WireGuardConfigModel::WireGuardConfigModel(QObject *parent) + : QAbstractListModel(parent), + m_newWireGuardProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::WireGuard)), + m_oldWireGuardProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::WireGuard)) { } @@ -21,9 +24,9 @@ bool WireGuardConfigModel::setData(const QModelIndex &index, const QVariant &val } switch (role) { - case Roles::SubnetAddressRole: m_serverProtocolConfig.insert(config_key::subnet_address, value.toString()); break; - case Roles::PortRole: m_serverProtocolConfig.insert(config_key::port, value.toString()); break; - case Roles::ClientMtuRole: m_clientProtocolConfig.insert(config_key::mtu, value.toString()); break; + case Roles::SubnetAddressRole: m_newWireGuardProtocolConfig.serverProtocolConfig.subnetAddress = value.toString(); break; + case Roles::PortRole: m_newWireGuardProtocolConfig.serverProtocolConfig.port = value.toString(); break; + case Roles::ClientMtuRole: m_newWireGuardProtocolConfig.clientProtocolConfig.wireGuardData.mtu = value.toString(); break; } emit dataChanged(index, index, QList { role }); @@ -37,62 +40,33 @@ QVariant WireGuardConfigModel::data(const QModelIndex &index, int role) const } switch (role) { - case Roles::SubnetAddressRole: return m_serverProtocolConfig.value(config_key::subnet_address).toString(); - case Roles::PortRole: return m_serverProtocolConfig.value(config_key::port).toString(); - case Roles::ClientMtuRole: return m_clientProtocolConfig.value(config_key::mtu); + case Roles::SubnetAddressRole: return m_newWireGuardProtocolConfig.serverProtocolConfig.subnetAddress; + case Roles::PortRole: return m_newWireGuardProtocolConfig.serverProtocolConfig.port; + case Roles::ClientMtuRole: return m_newWireGuardProtocolConfig.clientProtocolConfig.wireGuardData.mtu; } return QVariant(); } -void WireGuardConfigModel::updateModel(const QJsonObject &config) +void WireGuardConfigModel::updateModel(const WireGuardProtocolConfig wireGuardProtocolConfig) { beginResetModel(); - m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); - - m_fullConfig = config; - QJsonObject serverProtocolConfig = config.value(config_key::wireguard).toObject(); - - auto defaultTransportProto = - ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::WireGuard), Proto::WireGuard); - m_serverProtocolConfig.insert(config_key::transport_proto, - serverProtocolConfig.value(config_key::transport_proto).toString(defaultTransportProto)); - m_serverProtocolConfig[config_key::last_config] = serverProtocolConfig.value(config_key::last_config); - m_serverProtocolConfig[config_key::subnet_address] = serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress); - m_serverProtocolConfig[config_key::port] = serverProtocolConfig.value(config_key::port).toString(protocols::wireguard::defaultPort); - - auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString(); - QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object(); - m_clientProtocolConfig[config_key::mtu] = clientProtocolConfig[config_key::mtu].toString(protocols::wireguard::defaultMtu); - + m_newWireGuardProtocolConfig = wireGuardProtocolConfig; + m_oldWireGuardProtocolConfig = wireGuardProtocolConfig; endResetModel(); } -QJsonObject WireGuardConfigModel::getConfig() +QSharedPointer WireGuardConfigModel::getConfig() { - const WgConfig oldConfig(m_fullConfig.value(config_key::wireguard).toObject()); - const WgConfig newConfig(m_serverProtocolConfig); - - if (!oldConfig.hasEqualServerSettings(newConfig)) { - m_serverProtocolConfig.remove(config_key::last_config); - } else { - auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString(); - QJsonObject jsonConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object(); - jsonConfig[config_key::mtu] = m_clientProtocolConfig[config_key::mtu]; - - m_serverProtocolConfig[config_key::last_config] = QString(QJsonDocument(jsonConfig).toJson()); + if (m_oldWireGuardProtocolConfig.hasEqualServerSettings(m_newWireGuardProtocolConfig)) { + m_newWireGuardProtocolConfig.clearClientSettings(); } - - m_fullConfig.insert(config_key::wireguard, m_serverProtocolConfig); - return m_fullConfig; + return QSharedPointer::create(m_newWireGuardProtocolConfig); } bool WireGuardConfigModel::isServerSettingsEqual() { - const WgConfig oldConfig(m_fullConfig.value(config_key::wireguard).toObject()); - const WgConfig newConfig(m_serverProtocolConfig); - - return oldConfig.hasEqualServerSettings(newConfig); + return m_oldWireGuardProtocolConfig.hasEqualServerSettings(m_newWireGuardProtocolConfig); } QHash WireGuardConfigModel::roleNames() const @@ -105,29 +79,3 @@ QHash WireGuardConfigModel::roleNames() const return roles; } - -WgConfig::WgConfig(const QJsonObject &serverProtocolConfig) -{ - auto lastConfig = serverProtocolConfig.value(config_key::last_config).toString(); - QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object(); - clientMtu = clientProtocolConfig[config_key::mtu].toString(protocols::wireguard::defaultMtu); - - subnetAddress = serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress); - port = serverProtocolConfig.value(config_key::port).toString(protocols::wireguard::defaultPort); -} - -bool WgConfig::hasEqualServerSettings(const WgConfig &other) const -{ - if (subnetAddress != other.subnetAddress || port != other.port) { - return false; - } - return true; -} - -bool WgConfig::hasEqualClientSettings(const WgConfig &other) const -{ - if (clientMtu != other.clientMtu) { - return false; - } - return true; -} diff --git a/client/ui/models/protocols/wireguardConfigModel.h b/client/ui/models/protocols/wireguardConfigModel.h index b1ce2d61..9010d9b4 100644 --- a/client/ui/models/protocols/wireguardConfigModel.h +++ b/client/ui/models/protocols/wireguardConfigModel.h @@ -5,19 +5,7 @@ #include #include "containers/containers_defs.h" - -struct WgConfig -{ - WgConfig(const QJsonObject &jsonConfig); - - QString subnetAddress; - QString port; - QString clientMtu; - - bool hasEqualServerSettings(const WgConfig &other) const; - bool hasEqualClientSettings(const WgConfig &other) const; - -}; +#include "core/models/protocols/wireguardProtocolConfig.h" class WireGuardConfigModel : public QAbstractListModel { @@ -38,8 +26,8 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void updateModel(const QJsonObject &config); - QJsonObject getConfig(); + void updateModel(const WireGuardProtocolConfig wireGuardProtocolConfig); + QSharedPointer getConfig(); bool isServerSettingsEqual(); @@ -47,10 +35,8 @@ protected: QHash roleNames() const override; private: - DockerContainer m_container; - QJsonObject m_serverProtocolConfig; - QJsonObject m_clientProtocolConfig; - QJsonObject m_fullConfig; + WireGuardProtocolConfig m_newWireGuardProtocolConfig; + WireGuardProtocolConfig m_oldWireGuardProtocolConfig; }; #endif // WIREGUARDCONFIGMODEL_H diff --git a/client/ui/models/protocols/xrayConfigModel.cpp b/client/ui/models/protocols/xrayConfigModel.cpp index 3917b544..fdcf15e3 100644 --- a/client/ui/models/protocols/xrayConfigModel.cpp +++ b/client/ui/models/protocols/xrayConfigModel.cpp @@ -2,7 +2,10 @@ #include "protocols/protocols_defs.h" -XrayConfigModel::XrayConfigModel(QObject *parent) : QAbstractListModel(parent) +XrayConfigModel::XrayConfigModel(QObject *parent) + : QAbstractListModel(parent), + m_newXrayProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::Xray)), + m_oldXrayProtocolConfig(QJsonObject(), ProtocolProps::protoToString(Proto::Xray)) { } @@ -19,8 +22,8 @@ bool XrayConfigModel::setData(const QModelIndex &index, const QVariant &value, i } switch (role) { - case Roles::SiteRole: m_protocolConfig.insert(config_key::site, value.toString()); break; - case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; + case Roles::SiteRole: m_newXrayProtocolConfig.serverProtocolConfig.site = value.toString(); break; + case Roles::PortRole: m_newXrayProtocolConfig.serverProtocolConfig.port = value.toString(); break; } emit dataChanged(index, index, QList { role }); @@ -34,34 +37,32 @@ QVariant XrayConfigModel::data(const QModelIndex &index, int role) const } switch (role) { - case Roles::SiteRole: return m_protocolConfig.value(config_key::site).toString(protocols::xray::defaultSite); - case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::xray::defaultPort); + case Roles::SiteRole: return m_newXrayProtocolConfig.serverProtocolConfig.site; + case Roles::PortRole: return m_newXrayProtocolConfig.serverProtocolConfig.port; } return QVariant(); } -void XrayConfigModel::updateModel(const QJsonObject &config) +void XrayConfigModel::updateModel(const XrayProtocolConfig xrayProtocolConfig) { beginResetModel(); - m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); - - m_fullConfig = config; - QJsonObject protocolConfig = config.value(config_key::xray).toObject(); - - auto defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Xray), Proto::Xray); - m_protocolConfig.insert(config_key::transport_proto, - protocolConfig.value(config_key::transport_proto).toString(defaultTransportProto)); - m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString(protocols::xray::defaultPort)); - m_protocolConfig.insert(config_key::site, protocolConfig.value(config_key::site).toString(protocols::xray::defaultSite)); - + m_newXrayProtocolConfig = xrayProtocolConfig; + m_oldXrayProtocolConfig = xrayProtocolConfig; endResetModel(); } -QJsonObject XrayConfigModel::getConfig() +QSharedPointer XrayConfigModel::getConfig() { - m_fullConfig.insert(config_key::xray, m_protocolConfig); - return m_fullConfig; + if (m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig)) { + m_newXrayProtocolConfig.clearClientSettings(); + } + return QSharedPointer::create(m_newXrayProtocolConfig); +} + +bool XrayConfigModel::isServerSettingsEqual() +{ + return m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig); } QHash XrayConfigModel::roleNames() const @@ -73,3 +74,4 @@ QHash XrayConfigModel::roleNames() const return roles; } + diff --git a/client/ui/models/protocols/xrayConfigModel.h b/client/ui/models/protocols/xrayConfigModel.h index 41aac589..519d7fb4 100644 --- a/client/ui/models/protocols/xrayConfigModel.h +++ b/client/ui/models/protocols/xrayConfigModel.h @@ -5,6 +5,7 @@ #include #include "containers/containers_defs.h" +#include "core/models/protocols/xrayProtocolConfig.h" class XrayConfigModel : public QAbstractListModel { @@ -24,16 +25,17 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - void updateModel(const QJsonObject &config); - QJsonObject getConfig(); + void updateModel(const XrayProtocolConfig xrayProtocolConfig); + QSharedPointer getConfig(); + + bool isServerSettingsEqual(); protected: QHash roleNames() const override; private: - DockerContainer m_container; - QJsonObject m_protocolConfig; - QJsonObject m_fullConfig; + XrayProtocolConfig m_newXrayProtocolConfig; + XrayProtocolConfig m_oldXrayProtocolConfig; }; #endif // XRAYCONFIGMODEL_H diff --git a/client/ui/models/protocols_model.cpp b/client/ui/models/protocols_model.cpp index 6a996ec0..add32488 100644 --- a/client/ui/models/protocols_model.cpp +++ b/client/ui/models/protocols_model.cpp @@ -16,7 +16,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer &openVpn const QSharedPointer &cloakConfigModel, const QSharedPointer &wireGuardConfigModel, const QSharedPointer &awgConfigModel, const QSharedPointer &xrayConfigModel, +#ifdef Q_OS_WINDOWS const QSharedPointer &ikev2ConfigModel, +#endif const QSharedPointer &sftpConfigModel, const QSharedPointer &socks5ProxyConfigModel, QObject *parent) : QAbstractListModel(parent), @@ -26,7 +28,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer &openVpn m_wireGuardConfigModel(wireGuardConfigModel), m_awgConfigModel(awgConfigModel), m_xrayConfigModel(xrayConfigModel), +#ifdef Q_OS_WINDOWS m_ikev2ConfigModel(ikev2ConfigModel), +#endif m_sftpConfigModel(sftpConfigModel), m_socks5ProxyConfigModel(socks5ProxyConfigModel) { @@ -111,18 +115,18 @@ void ProtocolsModel::updateProtocolModel(amnezia::Proto protocol) } switch (protocol) { - case Proto::OpenVpn: m_openVpnConfigModel->updateModel(config); break; - case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break; - case Proto::Cloak: m_cloakConfigModel->updateModel(config); break; - case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); break; - case Proto::Awg: m_awgConfigModel->updateModel(config); break; - case Proto::Xray: m_xrayConfigModel->updateModel(config); break; + case Proto::OpenVpn: m_openVpnConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + case Proto::Cloak: m_cloakConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + case Proto::WireGuard: m_wireGuardConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + case Proto::Awg: m_awgConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + case Proto::Xray: m_xrayConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; #ifdef Q_OS_WINDOWS case Proto::Ikev2: - case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break; + case Proto::L2tp: m_ikev2ConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; #endif - case Proto::Sftp: m_sftpConfigModel->updateModel(config); break; - case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break; + // case Proto::Sftp: m_sftpConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; + // case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(*qSharedPointerCast(protocolConfig).data()); break; default: break; } } @@ -134,17 +138,17 @@ QMap> ProtocolsModel::getProtocolConfigs for (const auto &config : m_protocolConfigs) { switch (ProtocolProps::protoFromString(config->protocolName)) { case Proto::OpenVpn: protocolConfigs.insert(config->protocolName, m_openVpnConfigModel->getConfig()); break; - case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break; - case Proto::Cloak: m_cloakConfigModel->updateModel(config); break; - case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); break; + case Proto::ShadowSocks: protocolConfigs.insert(config->protocolName, m_shadowSocksConfigModel->getConfig()); break; + case Proto::Cloak: protocolConfigs.insert(config->protocolName, m_cloakConfigModel->getConfig()); break; + case Proto::WireGuard: protocolConfigs.insert(config->protocolName, m_wireGuardConfigModel->getConfig()); break; case Proto::Awg: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break; - case Proto::Xray: m_xrayConfigModel->updateModel(config); break; + case Proto::Xray: protocolConfigs.insert(config->protocolName, m_xrayConfigModel->getConfig()); break; #ifdef Q_OS_WINDOWS case Proto::Ikev2: - case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break; + case Proto::L2tp: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break; #endif - case Proto::Sftp: m_sftpConfigModel->updateModel(config); break; - case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break; + // case Proto::Sftp: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break; + // case Proto::Socks5Proxy: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break; default: break; } }