refactoring: all protocol models now work with c++ classes

This commit is contained in:
vladimir.kuznetsov 2025-07-03 10:20:01 +08:00
parent 65f60ab922
commit d766a001e3
25 changed files with 301 additions and 295 deletions

View file

@ -40,4 +40,19 @@ QJsonObject CloakProtocolConfig::toJson() const
} }
return json; 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();
} }

View file

@ -28,6 +28,9 @@ public:
QJsonObject toJson() const override; QJsonObject toJson() const override;
bool hasEqualServerSettings(const CloakProtocolConfig &other) const;
void clearClientSettings();
cloak::ServerProtocolConfig serverProtocolConfig; cloak::ServerProtocolConfig serverProtocolConfig;
cloak::ClientProtocolConfig clientProtocolConfig; cloak::ClientProtocolConfig clientProtocolConfig;
}; };

View file

@ -1,20 +1,22 @@
#include "openvpnProtocolConfig.h" #include "openvpnProtocolConfig.h"
#include <QJsonDocument>
#include "protocols/protocols_defs.h" #include "protocols/protocols_defs.h"
#include <QJsonDocument>
using namespace amnezia; 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.subnetAddress = protocolConfigObject.value(config_key::subnet_address).toString();
serverProtocolConfig.transportProto = protocolConfigObject.value(config_key::transport_proto).toString(); serverProtocolConfig.transportProto = protocolConfigObject.value(config_key::transport_proto).toString();
serverProtocolConfig.port = protocolConfigObject.value(config_key::port).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.hash = protocolConfigObject.value(config_key::hash).toString();
serverProtocolConfig.cipher = protocolConfigObject.value(config_key::cipher).toString(); serverProtocolConfig.cipher = protocolConfigObject.value(config_key::cipher).toString();
serverProtocolConfig.tlsAuth = protocolConfigObject.value(config_key::tls_auth).toString(); serverProtocolConfig.tlsAuth = protocolConfigObject.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth);
serverProtocolConfig.blockOutsideDns = protocolConfigObject.value(config_key::block_outside_dns).toString(); serverProtocolConfig.blockOutsideDns =
protocolConfigObject.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns);
serverProtocolConfig.additionalClientConfig = protocolConfigObject.value(config_key::additional_client_config).toString(); serverProtocolConfig.additionalClientConfig = protocolConfigObject.value(config_key::additional_client_config).toString();
serverProtocolConfig.additionalServerConfig = protocolConfigObject.value(config_key::additional_server_config).toString(); serverProtocolConfig.additionalServerConfig = protocolConfigObject.value(config_key::additional_server_config).toString();
@ -42,21 +44,15 @@ QJsonObject OpenVpnProtocolConfig::toJson() const
if (!serverProtocolConfig.port.isEmpty()) { if (!serverProtocolConfig.port.isEmpty()) {
json[config_key::port] = serverProtocolConfig.port; 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()) { if (!serverProtocolConfig.hash.isEmpty()) {
json[config_key::hash] = serverProtocolConfig.hash; json[config_key::hash] = serverProtocolConfig.hash;
} }
if (!serverProtocolConfig.cipher.isEmpty()) { if (!serverProtocolConfig.cipher.isEmpty()) {
json[config_key::cipher] = serverProtocolConfig.cipher; json[config_key::cipher] = serverProtocolConfig.cipher;
} }
if (!serverProtocolConfig.tlsAuth.isEmpty()) { json[config_key::tls_auth] = serverProtocolConfig.tlsAuth;
json[config_key::tls_auth] = serverProtocolConfig.tlsAuth; json[config_key::block_outside_dns] = serverProtocolConfig.blockOutsideDns;
}
if (!serverProtocolConfig.blockOutsideDns.isEmpty()) {
json[config_key::block_outside_dns] = serverProtocolConfig.blockOutsideDns;
}
if (!serverProtocolConfig.additionalClientConfig.isEmpty()) { if (!serverProtocolConfig.additionalClientConfig.isEmpty()) {
json[config_key::additional_client_config] = serverProtocolConfig.additionalClientConfig; json[config_key::additional_client_config] = serverProtocolConfig.additionalClientConfig;
} }
@ -80,4 +76,25 @@ QJsonObject OpenVpnProtocolConfig::toJson() const
} }
return json; 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();
}

View file

@ -13,11 +13,11 @@ namespace openvpn
QString subnetAddress; QString subnetAddress;
QString transportProto; QString transportProto;
QString port; QString port;
QString ncpDisable; bool ncpDisable;
QString hash; QString hash;
QString cipher; QString cipher;
QString tlsAuth; bool tlsAuth;
QString blockOutsideDns; bool blockOutsideDns;
QString additionalClientConfig; QString additionalClientConfig;
QString additionalServerConfig; QString additionalServerConfig;
}; };
@ -39,6 +39,9 @@ public:
QJsonObject toJson() const override; QJsonObject toJson() const override;
bool hasEqualServerSettings(const OpenVpnProtocolConfig &other) const;
void clearClientSettings();
openvpn::ServerProtocolConfig serverProtocolConfig; openvpn::ServerProtocolConfig serverProtocolConfig;
openvpn::ClientProtocolConfig clientProtocolConfig; openvpn::ClientProtocolConfig clientProtocolConfig;
}; };

View file

@ -5,6 +5,7 @@
#include "core/models/protocols/openvpnProtocolConfig.h" #include "core/models/protocols/openvpnProtocolConfig.h"
#include "core/models/protocols/protocolConfig.h" #include "core/models/protocols/protocolConfig.h"
#include "core/models/protocols/shadowsocksProtocolConfig.h" #include "core/models/protocols/shadowsocksProtocolConfig.h"
#include "core/models/protocols/wireguardProtocolConfig.h"
#include "core/models/protocols/xrayProtocolConfig.h" #include "core/models/protocols/xrayProtocolConfig.h"
#include "protocols/protocols_defs.h" #include "protocols/protocols_defs.h"
@ -38,27 +39,27 @@ bool ProtocolConfig::isServerSettingsEqual(const QSharedPointer<ProtocolConfig>
case Proto::OpenVpn: { case Proto::OpenVpn: {
auto thisConfig = qSharedPointerCast<OpenVpnProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<OpenVpnProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<OpenVpnProtocolConfig>(other); auto otherConfig = qSharedPointerCast<OpenVpnProtocolConfig>(other);
return false; return thisConfig->hasEqualServerSettings(*otherConfig.data());
} }
case Proto::WireGuard: { case Proto::WireGuard: {
auto thisConfig = qSharedPointerCast<WireGuardProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<WireGuardProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<WireGuardProtocolConfig>(other); auto otherConfig = qSharedPointerCast<WireGuardProtocolConfig>(other);
return false; return thisConfig->hasEqualServerSettings(*otherConfig.data());
} }
case Proto::ShadowSocks: { case Proto::ShadowSocks: {
auto thisConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(other); auto otherConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(other);
return false; return thisConfig->hasEqualServerSettings(*otherConfig.data());
} }
case Proto::Cloak: { case Proto::Cloak: {
auto thisConfig = qSharedPointerCast<CloakProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<CloakProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<CloakProtocolConfig>(other); auto otherConfig = qSharedPointerCast<CloakProtocolConfig>(other);
return false; return thisConfig->hasEqualServerSettings(*otherConfig.data());
} }
case Proto::Xray: { case Proto::Xray: {
auto thisConfig = qSharedPointerCast<XrayProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<XrayProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<XrayProtocolConfig>(other); auto otherConfig = qSharedPointerCast<XrayProtocolConfig>(other);
return false; return thisConfig->hasEqualServerSettings(*otherConfig.data());
} }
case Proto::Awg: { case Proto::Awg: {
auto thisConfig = qSharedPointerCast<AwgProtocolConfig>(QSharedPointer<ProtocolConfig>(this)); auto thisConfig = qSharedPointerCast<AwgProtocolConfig>(QSharedPointer<ProtocolConfig>(this));

View file

@ -36,4 +36,18 @@ QJsonObject ShadowsocksProtocolConfig::toJson() const
} }
return json; 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();
} }

View file

@ -27,6 +27,9 @@ public:
QJsonObject toJson() const override; QJsonObject toJson() const override;
bool hasEqualServerSettings(const ShadowsocksProtocolConfig &other) const;
void clearClientSettings();
shadowsocks::ServerProtocolConfig serverProtocolConfig; shadowsocks::ServerProtocolConfig serverProtocolConfig;
shadowsocks::ClientProtocolConfig clientProtocolConfig; shadowsocks::ClientProtocolConfig clientProtocolConfig;
}; };

View file

@ -118,3 +118,17 @@ QJsonObject WireGuardProtocolConfig::toJson() const
return json; 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();
}

View file

@ -51,6 +51,9 @@ public:
QJsonObject toJson() const override; QJsonObject toJson() const override;
bool hasEqualServerSettings(const WireGuardProtocolConfig &other) const;
void clearClientSettings();
wireguard::ServerProtocolConfig serverProtocolConfig; wireguard::ServerProtocolConfig serverProtocolConfig;
wireguard::ClientProtocolConfig clientProtocolConfig; wireguard::ClientProtocolConfig clientProtocolConfig;
}; };

View file

@ -40,4 +40,19 @@ QJsonObject XrayProtocolConfig::toJson() const
} }
return json; 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();
} }

View file

@ -28,6 +28,9 @@ public:
QJsonObject toJson() const override; QJsonObject toJson() const override;
bool hasEqualServerSettings(const XrayProtocolConfig &other) const;
void clearClientSettings();
xray::ServerProtocolConfig serverProtocolConfig; xray::ServerProtocolConfig serverProtocolConfig;
xray::ClientProtocolConfig clientProtocolConfig; xray::ClientProtocolConfig clientProtocolConfig;
}; };

View file

@ -80,7 +80,7 @@ void InstallController::install(DockerContainer container, int port, TransportPr
int s1 = QRandomGenerator::global()->bounded(15, 150); int s1 = QRandomGenerator::global()->bounded(15, 150);
int s2 = 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); s2 = QRandomGenerator::global()->bounded(15, 150);
} }
@ -935,6 +935,11 @@ bool InstallController::isUpdateDockerContainerRequired(const DockerContainer co
auto oldConfig = qSharedPointerCast<AwgProtocolConfig>(newProtoConfig); auto oldConfig = qSharedPointerCast<AwgProtocolConfig>(newProtoConfig);
return !newConfig->hasEqualServerSettings(*oldConfig.data()); return !newConfig->hasEqualServerSettings(*oldConfig.data());
} }
case Proto::WireGuard: {
auto newConfig = qSharedPointerCast<WireGuardProtocolConfig>(oldProtoConfig);
auto oldConfig = qSharedPointerCast<WireGuardProtocolConfig>(newProtoConfig);
return !newConfig->hasEqualServerSettings(*oldConfig.data());
}
default: return true; default: return true;
} }
} }

View file

@ -24,12 +24,6 @@ QVariant ContainersModel::data(const QModelIndex &index, int role) const
case NameRole: return ContainerProps::containerHumanNames().value(container); case NameRole: return ContainerProps::containerHumanNames().value(container);
case DescriptionRole: return ContainerProps::containerDescriptions().value(container); case DescriptionRole: return ContainerProps::containerDescriptions().value(container);
case DetailedDescriptionRole: return ContainerProps::containerDetailedDescriptions().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 ServiceTypeRole: return ContainerProps::containerService(container);
case DockerContainerRole: return container; case DockerContainerRole: return container;
case IsEasySetupContainerRole: return ContainerProps::isEasySetupContainer(container); case IsEasySetupContainerRole: return ContainerProps::isEasySetupContainer(container);
@ -74,11 +68,6 @@ QString ContainersModel::getProcessedContainerName()
return ContainerProps::containerHumanNames().value(static_cast<DockerContainer>(m_processedContainerIndex)); return ContainerProps::containerHumanNames().value(static_cast<DockerContainer>(m_processedContainerIndex));
} }
QJsonObject ContainersModel::getContainerConfig(const int containerIndex)
{
return qvariant_cast<QJsonObject>(data(index(containerIndex), ConfigRole));
}
bool ContainersModel::isSupportedByCurrentPlatform(const int containerIndex) bool ContainersModel::isSupportedByCurrentPlatform(const int containerIndex)
{ {
return qvariant_cast<bool>(data(index(containerIndex), IsSupportedRole)); return qvariant_cast<bool>(data(index(containerIndex), IsSupportedRole));
@ -117,7 +106,6 @@ QHash<int, QByteArray> ContainersModel::roleNames() const
roles[DetailedDescriptionRole] = "detailedDescription"; roles[DetailedDescriptionRole] = "detailedDescription";
roles[ServiceTypeRole] = "serviceType"; roles[ServiceTypeRole] = "serviceType";
roles[DockerContainerRole] = "dockerContainer"; roles[DockerContainerRole] = "dockerContainer";
roles[ConfigRole] = "config";
roles[IsEasySetupContainerRole] = "isEasySetupContainer"; roles[IsEasySetupContainerRole] = "isEasySetupContainer";
roles[EasySetupHeaderRole] = "easySetupHeader"; roles[EasySetupHeaderRole] = "easySetupHeader";

View file

@ -18,7 +18,6 @@ public:
DescriptionRole, DescriptionRole,
DetailedDescriptionRole, DetailedDescriptionRole,
ServiceTypeRole, ServiceTypeRole,
ConfigRole,
DockerContainerRole, DockerContainerRole,
IsEasySetupContainerRole, IsEasySetupContainerRole,
@ -48,8 +47,6 @@ public slots:
QString getProcessedContainerName(); QString getProcessedContainerName();
QJsonObject getContainerConfig(const int containerIndex);
bool isSupportedByCurrentPlatform(const int containerIndex); bool isSupportedByCurrentPlatform(const int containerIndex);
bool isServiceContainer(const int containerIndex); bool isServiceContainer(const int containerIndex);

View file

@ -2,7 +2,10 @@
#include "protocols/protocols_defs.h" #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) { switch (role) {
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_newCloakProtocolConfig.serverProtocolConfig.port = value.toString(); break;
case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; case Roles::CipherRole: m_newCloakProtocolConfig.serverProtocolConfig.cipher = value.toString(); break;
case Roles::SiteRole: m_protocolConfig.insert(config_key::site, value.toString()); break; case Roles::SiteRole: m_newCloakProtocolConfig.serverProtocolConfig.site = value.toString(); break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -35,35 +38,33 @@ QVariant CloakConfigModel::data(const QModelIndex &index, int role) const
} }
switch (role) { switch (role) {
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::cloak::defaultPort); case Roles::PortRole: return m_newCloakProtocolConfig.serverProtocolConfig.port;
case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::cloak::defaultCipher); case Roles::CipherRole: return m_newCloakProtocolConfig.serverProtocolConfig.cipher;
case Roles::SiteRole: return m_protocolConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite); case Roles::SiteRole: return m_newCloakProtocolConfig.serverProtocolConfig.site;
} }
return QVariant(); return QVariant();
} }
void CloakConfigModel::updateModel(const QJsonObject &config) void CloakConfigModel::updateModel(const CloakProtocolConfig cloakProtocolConfig)
{ {
beginResetModel(); beginResetModel();
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_newCloakProtocolConfig = cloakProtocolConfig;
m_oldCloakProtocolConfig = cloakProtocolConfig;
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));
endResetModel(); endResetModel();
} }
QJsonObject CloakConfigModel::getConfig() QSharedPointer<ProtocolConfig> CloakConfigModel::getConfig()
{ {
m_fullConfig.insert(config_key::cloak, m_protocolConfig); if (m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig)) {
return m_fullConfig; m_newCloakProtocolConfig.clearClientSettings();
}
return QSharedPointer<CloakProtocolConfig>::create(m_newCloakProtocolConfig);
}
bool CloakConfigModel::isServerSettingsEqual()
{
return m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig);
} }
QHash<int, QByteArray> CloakConfigModel::roleNames() const QHash<int, QByteArray> CloakConfigModel::roleNames() const
@ -76,3 +77,4 @@ QHash<int, QByteArray> CloakConfigModel::roleNames() const
return roles; return roles;
} }

View file

@ -5,6 +5,7 @@
#include <QJsonObject> #include <QJsonObject>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/models/protocols/cloakProtocolConfig.h"
class CloakConfigModel : public QAbstractListModel class CloakConfigModel : public QAbstractListModel
{ {
@ -25,16 +26,17 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots: public slots:
void updateModel(const QJsonObject &config); void updateModel(const CloakProtocolConfig cloakProtocolConfig);
QJsonObject getConfig(); QSharedPointer<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected: protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
DockerContainer m_container; CloakProtocolConfig m_newCloakProtocolConfig;
QJsonObject m_protocolConfig; CloakProtocolConfig m_oldCloakProtocolConfig;
QJsonObject m_fullConfig;
}; };
#endif // CLOAKCONFIGMODEL_H #endif // CLOAKCONFIGMODEL_H

View file

@ -2,7 +2,10 @@
#include "protocols/protocols_defs.h" #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) { switch (role) {
case Roles::SubnetAddressRole: m_protocolConfig.insert(amnezia::config_key::subnet_address, value.toString()); break; case Roles::SubnetAddressRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.subnetAddress = value.toString(); break;
case Roles::TransportProtoRole: m_protocolConfig.insert(config_key::transport_proto, value.toString()); break; case Roles::TransportProtoRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.transportProto = value.toString(); break;
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.port = value.toString(); break;
case Roles::AutoNegotiateEncryprionRole: m_protocolConfig.insert(config_key::ncp_disable, !value.toBool()); break; case Roles::AutoNegotiateEncryprionRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.ncpDisable = !value.toBool(); break;
case Roles::HashRole: m_protocolConfig.insert(config_key::hash, value.toString()); break; case Roles::HashRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.hash = value.toString(); break;
case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; case Roles::CipherRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.cipher = value.toString(); break;
case Roles::TlsAuthRole: m_protocolConfig.insert(config_key::tls_auth, value.toBool()); break; case Roles::TlsAuthRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.tlsAuth = value.toBool(); break;
case Roles::BlockDnsRole: m_protocolConfig.insert(config_key::block_outside_dns, value.toBool()); break; case Roles::BlockDnsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.blockOutsideDns = value.toBool(); break;
case Roles::AdditionalClientCommandsRole: m_protocolConfig.insert(config_key::additional_client_config, value.toString()); break; case Roles::AdditionalClientCommandsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalClientConfig = value.toString(); break;
case Roles::AdditionalServerCommandsRole: m_protocolConfig.insert(config_key::additional_server_config, value.toString()); break; case Roles::AdditionalServerCommandsRole: m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalServerConfig = value.toString(); break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -42,72 +45,42 @@ QVariant OpenVpnConfigModel::data(const QModelIndex &index, int role) const
} }
switch (role) { switch (role) {
case Roles::SubnetAddressRole: case Roles::SubnetAddressRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.subnetAddress;
return m_protocolConfig.value(amnezia::config_key::subnet_address).toString(amnezia::protocols::openvpn::defaultSubnetAddress); case Roles::TransportProtoRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.transportProto;
case Roles::TransportProtoRole: case Roles::PortRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.port;
return m_protocolConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto); case Roles::AutoNegotiateEncryprionRole: return !m_newOpenVpnProtocolConfig.serverProtocolConfig.ncpDisable;
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::openvpn::defaultPort); case Roles::HashRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.hash;
case Roles::AutoNegotiateEncryprionRole: case Roles::CipherRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.cipher;
return !m_protocolConfig.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable); case Roles::TlsAuthRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.tlsAuth;
case Roles::HashRole: return m_protocolConfig.value(config_key::hash).toString(protocols::openvpn::defaultHash); case Roles::BlockDnsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.blockOutsideDns;
case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher); case Roles::AdditionalClientCommandsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalClientConfig;
case Roles::TlsAuthRole: return m_protocolConfig.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth); case Roles::AdditionalServerCommandsRole: return m_newOpenVpnProtocolConfig.serverProtocolConfig.additionalServerConfig;
case Roles::BlockDnsRole: case Roles::IsPortEditable: return true; // TODO: implement container check if needed
return m_protocolConfig.value(config_key::block_outside_dns).toBool(protocols::openvpn::defaultBlockOutsideDns); case Roles::IsTransportProtoEditable: return true; // TODO: implement container check if needed
case Roles::AdditionalClientCommandsRole: case Roles::HasRemoveButton: return true; // TODO: implement container check if needed
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(); return QVariant();
} }
void OpenVpnConfigModel::updateModel(const QJsonObject &config) void OpenVpnConfigModel::updateModel(const OpenVpnProtocolConfig openVpnProtocolConfig)
{ {
beginResetModel(); beginResetModel();
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_newOpenVpnProtocolConfig = openVpnProtocolConfig;
m_oldOpenVpnProtocolConfig = openVpnProtocolConfig;
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));
endResetModel(); endResetModel();
} }
QJsonObject OpenVpnConfigModel::getConfig() QSharedPointer<ProtocolConfig> OpenVpnConfigModel::getConfig()
{ {
m_fullConfig.insert(config_key::openvpn, m_protocolConfig); if (m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig)) {
return m_fullConfig; m_newOpenVpnProtocolConfig.clearClientSettings();
}
return QSharedPointer<OpenVpnProtocolConfig>::create(m_newOpenVpnProtocolConfig);
}
bool OpenVpnConfigModel::isServerSettingsEqual()
{
return m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig);
} }
QHash<int, QByteArray> OpenVpnConfigModel::roleNames() const QHash<int, QByteArray> OpenVpnConfigModel::roleNames() const

View file

@ -5,6 +5,7 @@
#include <QJsonObject> #include <QJsonObject>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/models/protocols/openvpnProtocolConfig.h"
class OpenVpnConfigModel : public QAbstractListModel class OpenVpnConfigModel : public QAbstractListModel
{ {
@ -37,16 +38,17 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots: public slots:
void updateModel(const QJsonObject &config); void updateModel(const OpenVpnProtocolConfig openVpnProtocolConfig);
QJsonObject getConfig(); QSharedPointer<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected: protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
DockerContainer m_container; OpenVpnProtocolConfig m_newOpenVpnProtocolConfig;
QJsonObject m_protocolConfig; OpenVpnProtocolConfig m_oldOpenVpnProtocolConfig;
QJsonObject m_fullConfig;
}; };
#endif // OPENVPNCONFIGMODEL_H #endif // OPENVPNCONFIGMODEL_H

View file

@ -2,7 +2,10 @@
#include "protocols/protocols_defs.h" #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) { switch (role) {
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_newShadowsocksProtocolConfig.serverProtocolConfig.port = value.toString(); break;
case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; case Roles::CipherRole: m_newShadowsocksProtocolConfig.serverProtocolConfig.cipher = value.toString(); break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -34,36 +37,34 @@ QVariant ShadowSocksConfigModel::data(const QModelIndex &index, int role) const
} }
switch (role) { switch (role) {
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort); case Roles::PortRole: return m_newShadowsocksProtocolConfig.serverProtocolConfig.port;
case Roles::CipherRole: return m_protocolConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher); case Roles::CipherRole: return m_newShadowsocksProtocolConfig.serverProtocolConfig.cipher;
case Roles::IsPortEditableRole: return m_container == DockerContainer::ShadowSocks ? true : false; case Roles::IsPortEditableRole: return true; // TODO: implement container check if needed
case Roles::IsCipherEditableRole: return m_container == DockerContainer::ShadowSocks ? true : false; case Roles::IsCipherEditableRole: return true; // TODO: implement container check if needed
} }
return QVariant(); return QVariant();
} }
void ShadowSocksConfigModel::updateModel(const QJsonObject &config) void ShadowSocksConfigModel::updateModel(const ShadowsocksProtocolConfig shadowsocksProtocolConfig)
{ {
beginResetModel(); beginResetModel();
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_newShadowsocksProtocolConfig = shadowsocksProtocolConfig;
m_oldShadowsocksProtocolConfig = shadowsocksProtocolConfig;
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));
endResetModel(); endResetModel();
} }
QJsonObject ShadowSocksConfigModel::getConfig() QSharedPointer<ProtocolConfig> ShadowSocksConfigModel::getConfig()
{ {
m_fullConfig.insert(config_key::shadowsocks, m_protocolConfig); if (m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig)) {
return m_fullConfig; m_newShadowsocksProtocolConfig.clearClientSettings();
}
return QSharedPointer<ShadowsocksProtocolConfig>::create(m_newShadowsocksProtocolConfig);
}
bool ShadowSocksConfigModel::isServerSettingsEqual()
{
return m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig);
} }
QHash<int, QByteArray> ShadowSocksConfigModel::roleNames() const QHash<int, QByteArray> ShadowSocksConfigModel::roleNames() const
@ -77,3 +78,4 @@ QHash<int, QByteArray> ShadowSocksConfigModel::roleNames() const
return roles; return roles;
} }

View file

@ -5,6 +5,7 @@
#include <QJsonObject> #include <QJsonObject>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/models/protocols/shadowsocksProtocolConfig.h"
class ShadowSocksConfigModel : public QAbstractListModel class ShadowSocksConfigModel : public QAbstractListModel
{ {
@ -26,16 +27,17 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots: public slots:
void updateModel(const QJsonObject &config); void updateModel(const ShadowsocksProtocolConfig shadowsocksProtocolConfig);
QJsonObject getConfig(); QSharedPointer<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected: protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
DockerContainer m_container; ShadowsocksProtocolConfig m_newShadowsocksProtocolConfig;
QJsonObject m_protocolConfig; ShadowsocksProtocolConfig m_oldShadowsocksProtocolConfig;
QJsonObject m_fullConfig;
}; };
#endif // SHADOWSOCKSCONFIGMODEL_H #endif // SHADOWSOCKSCONFIGMODEL_H

View file

@ -4,7 +4,10 @@
#include "protocols/protocols_defs.h" #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) { switch (role) {
case Roles::SubnetAddressRole: m_serverProtocolConfig.insert(config_key::subnet_address, value.toString()); break; case Roles::SubnetAddressRole: m_newWireGuardProtocolConfig.serverProtocolConfig.subnetAddress = value.toString(); break;
case Roles::PortRole: m_serverProtocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_newWireGuardProtocolConfig.serverProtocolConfig.port = value.toString(); break;
case Roles::ClientMtuRole: m_clientProtocolConfig.insert(config_key::mtu, value.toString()); break; case Roles::ClientMtuRole: m_newWireGuardProtocolConfig.clientProtocolConfig.wireGuardData.mtu = value.toString(); break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -37,62 +40,33 @@ QVariant WireGuardConfigModel::data(const QModelIndex &index, int role) const
} }
switch (role) { switch (role) {
case Roles::SubnetAddressRole: return m_serverProtocolConfig.value(config_key::subnet_address).toString(); case Roles::SubnetAddressRole: return m_newWireGuardProtocolConfig.serverProtocolConfig.subnetAddress;
case Roles::PortRole: return m_serverProtocolConfig.value(config_key::port).toString(); case Roles::PortRole: return m_newWireGuardProtocolConfig.serverProtocolConfig.port;
case Roles::ClientMtuRole: return m_clientProtocolConfig.value(config_key::mtu); case Roles::ClientMtuRole: return m_newWireGuardProtocolConfig.clientProtocolConfig.wireGuardData.mtu;
} }
return QVariant(); return QVariant();
} }
void WireGuardConfigModel::updateModel(const QJsonObject &config) void WireGuardConfigModel::updateModel(const WireGuardProtocolConfig wireGuardProtocolConfig)
{ {
beginResetModel(); beginResetModel();
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_newWireGuardProtocolConfig = wireGuardProtocolConfig;
m_oldWireGuardProtocolConfig = wireGuardProtocolConfig;
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);
endResetModel(); endResetModel();
} }
QJsonObject WireGuardConfigModel::getConfig() QSharedPointer<ProtocolConfig> WireGuardConfigModel::getConfig()
{ {
const WgConfig oldConfig(m_fullConfig.value(config_key::wireguard).toObject()); if (m_oldWireGuardProtocolConfig.hasEqualServerSettings(m_newWireGuardProtocolConfig)) {
const WgConfig newConfig(m_serverProtocolConfig); m_newWireGuardProtocolConfig.clearClientSettings();
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());
} }
return QSharedPointer<WireGuardProtocolConfig>::create(m_newWireGuardProtocolConfig);
m_fullConfig.insert(config_key::wireguard, m_serverProtocolConfig);
return m_fullConfig;
} }
bool WireGuardConfigModel::isServerSettingsEqual() bool WireGuardConfigModel::isServerSettingsEqual()
{ {
const WgConfig oldConfig(m_fullConfig.value(config_key::wireguard).toObject()); return m_oldWireGuardProtocolConfig.hasEqualServerSettings(m_newWireGuardProtocolConfig);
const WgConfig newConfig(m_serverProtocolConfig);
return oldConfig.hasEqualServerSettings(newConfig);
} }
QHash<int, QByteArray> WireGuardConfigModel::roleNames() const QHash<int, QByteArray> WireGuardConfigModel::roleNames() const
@ -105,29 +79,3 @@ QHash<int, QByteArray> WireGuardConfigModel::roleNames() const
return roles; 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;
}

View file

@ -5,19 +5,7 @@
#include <QJsonObject> #include <QJsonObject>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/models/protocols/wireguardProtocolConfig.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;
};
class WireGuardConfigModel : public QAbstractListModel class WireGuardConfigModel : public QAbstractListModel
{ {
@ -38,8 +26,8 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots: public slots:
void updateModel(const QJsonObject &config); void updateModel(const WireGuardProtocolConfig wireGuardProtocolConfig);
QJsonObject getConfig(); QSharedPointer<ProtocolConfig> getConfig();
bool isServerSettingsEqual(); bool isServerSettingsEqual();
@ -47,10 +35,8 @@ protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
DockerContainer m_container; WireGuardProtocolConfig m_newWireGuardProtocolConfig;
QJsonObject m_serverProtocolConfig; WireGuardProtocolConfig m_oldWireGuardProtocolConfig;
QJsonObject m_clientProtocolConfig;
QJsonObject m_fullConfig;
}; };
#endif // WIREGUARDCONFIGMODEL_H #endif // WIREGUARDCONFIGMODEL_H

View file

@ -2,7 +2,10 @@
#include "protocols/protocols_defs.h" #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) { switch (role) {
case Roles::SiteRole: m_protocolConfig.insert(config_key::site, value.toString()); break; case Roles::SiteRole: m_newXrayProtocolConfig.serverProtocolConfig.site = value.toString(); break;
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_newXrayProtocolConfig.serverProtocolConfig.port = value.toString(); break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -34,34 +37,32 @@ QVariant XrayConfigModel::data(const QModelIndex &index, int role) const
} }
switch (role) { switch (role) {
case Roles::SiteRole: return m_protocolConfig.value(config_key::site).toString(protocols::xray::defaultSite); case Roles::SiteRole: return m_newXrayProtocolConfig.serverProtocolConfig.site;
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::xray::defaultPort); case Roles::PortRole: return m_newXrayProtocolConfig.serverProtocolConfig.port;
} }
return QVariant(); return QVariant();
} }
void XrayConfigModel::updateModel(const QJsonObject &config) void XrayConfigModel::updateModel(const XrayProtocolConfig xrayProtocolConfig)
{ {
beginResetModel(); beginResetModel();
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_newXrayProtocolConfig = xrayProtocolConfig;
m_oldXrayProtocolConfig = xrayProtocolConfig;
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));
endResetModel(); endResetModel();
} }
QJsonObject XrayConfigModel::getConfig() QSharedPointer<ProtocolConfig> XrayConfigModel::getConfig()
{ {
m_fullConfig.insert(config_key::xray, m_protocolConfig); if (m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig)) {
return m_fullConfig; m_newXrayProtocolConfig.clearClientSettings();
}
return QSharedPointer<XrayProtocolConfig>::create(m_newXrayProtocolConfig);
}
bool XrayConfigModel::isServerSettingsEqual()
{
return m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig);
} }
QHash<int, QByteArray> XrayConfigModel::roleNames() const QHash<int, QByteArray> XrayConfigModel::roleNames() const
@ -73,3 +74,4 @@ QHash<int, QByteArray> XrayConfigModel::roleNames() const
return roles; return roles;
} }

View file

@ -5,6 +5,7 @@
#include <QJsonObject> #include <QJsonObject>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/models/protocols/xrayProtocolConfig.h"
class XrayConfigModel : public QAbstractListModel class XrayConfigModel : public QAbstractListModel
{ {
@ -24,16 +25,17 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
public slots: public slots:
void updateModel(const QJsonObject &config); void updateModel(const XrayProtocolConfig xrayProtocolConfig);
QJsonObject getConfig(); QSharedPointer<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected: protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
DockerContainer m_container; XrayProtocolConfig m_newXrayProtocolConfig;
QJsonObject m_protocolConfig; XrayProtocolConfig m_oldXrayProtocolConfig;
QJsonObject m_fullConfig;
}; };
#endif // XRAYCONFIGMODEL_H #endif // XRAYCONFIGMODEL_H

View file

@ -16,7 +16,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer<OpenVpnConfigModel> &openVpn
const QSharedPointer<CloakConfigModel> &cloakConfigModel, const QSharedPointer<CloakConfigModel> &cloakConfigModel,
const QSharedPointer<WireGuardConfigModel> &wireGuardConfigModel, const QSharedPointer<WireGuardConfigModel> &wireGuardConfigModel,
const QSharedPointer<AwgConfigModel> &awgConfigModel, const QSharedPointer<XrayConfigModel> &xrayConfigModel, const QSharedPointer<AwgConfigModel> &awgConfigModel, const QSharedPointer<XrayConfigModel> &xrayConfigModel,
#ifdef Q_OS_WINDOWS
const QSharedPointer<Ikev2ConfigModel> &ikev2ConfigModel, const QSharedPointer<Ikev2ConfigModel> &ikev2ConfigModel,
#endif
const QSharedPointer<SftpConfigModel> &sftpConfigModel, const QSharedPointer<SftpConfigModel> &sftpConfigModel,
const QSharedPointer<Socks5ProxyConfigModel> &socks5ProxyConfigModel, QObject *parent) const QSharedPointer<Socks5ProxyConfigModel> &socks5ProxyConfigModel, QObject *parent)
: QAbstractListModel(parent), : QAbstractListModel(parent),
@ -26,7 +28,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer<OpenVpnConfigModel> &openVpn
m_wireGuardConfigModel(wireGuardConfigModel), m_wireGuardConfigModel(wireGuardConfigModel),
m_awgConfigModel(awgConfigModel), m_awgConfigModel(awgConfigModel),
m_xrayConfigModel(xrayConfigModel), m_xrayConfigModel(xrayConfigModel),
#ifdef Q_OS_WINDOWS
m_ikev2ConfigModel(ikev2ConfigModel), m_ikev2ConfigModel(ikev2ConfigModel),
#endif
m_sftpConfigModel(sftpConfigModel), m_sftpConfigModel(sftpConfigModel),
m_socks5ProxyConfigModel(socks5ProxyConfigModel) m_socks5ProxyConfigModel(socks5ProxyConfigModel)
{ {
@ -111,18 +115,18 @@ void ProtocolsModel::updateProtocolModel(amnezia::Proto protocol)
} }
switch (protocol) { switch (protocol) {
case Proto::OpenVpn: m_openVpnConfigModel->updateModel(config); break; case Proto::OpenVpn: m_openVpnConfigModel->updateModel(*qSharedPointerCast<OpenVpnProtocolConfig>(protocolConfig).data()); break;
case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break; case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(*qSharedPointerCast<ShadowsocksProtocolConfig>(protocolConfig).data()); break;
case Proto::Cloak: m_cloakConfigModel->updateModel(config); break; case Proto::Cloak: m_cloakConfigModel->updateModel(*qSharedPointerCast<CloakProtocolConfig>(protocolConfig).data()); break;
case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); break; case Proto::WireGuard: m_wireGuardConfigModel->updateModel(*qSharedPointerCast<WireGuardProtocolConfig>(protocolConfig).data()); break;
case Proto::Awg: m_awgConfigModel->updateModel(config); break; case Proto::Awg: m_awgConfigModel->updateModel(*qSharedPointerCast<AwgProtocolConfig>(protocolConfig).data()); break;
case Proto::Xray: m_xrayConfigModel->updateModel(config); break; case Proto::Xray: m_xrayConfigModel->updateModel(*qSharedPointerCast<XrayProtocolConfig>(protocolConfig).data()); break;
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
case Proto::Ikev2: case Proto::Ikev2:
case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break; case Proto::L2tp: m_ikev2ConfigModel->updateModel(*qSharedPointerCast<AwgProtocolConfig>(protocolConfig).data()); break;
#endif #endif
case Proto::Sftp: m_sftpConfigModel->updateModel(config); break; // case Proto::Sftp: m_sftpConfigModel->updateModel(*qSharedPointerCast<SftpConfigModel>(protocolConfig).data()); break;
case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break; // case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(*qSharedPointerCast<Socks>(protocolConfig).data()); break;
default: break; default: break;
} }
} }
@ -134,17 +138,17 @@ QMap<QString, QSharedPointer<ProtocolConfig>> ProtocolsModel::getProtocolConfigs
for (const auto &config : m_protocolConfigs) { for (const auto &config : m_protocolConfigs) {
switch (ProtocolProps::protoFromString(config->protocolName)) { switch (ProtocolProps::protoFromString(config->protocolName)) {
case Proto::OpenVpn: protocolConfigs.insert(config->protocolName, m_openVpnConfigModel->getConfig()); break; case Proto::OpenVpn: protocolConfigs.insert(config->protocolName, m_openVpnConfigModel->getConfig()); break;
case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break; case Proto::ShadowSocks: protocolConfigs.insert(config->protocolName, m_shadowSocksConfigModel->getConfig()); break;
case Proto::Cloak: m_cloakConfigModel->updateModel(config); break; case Proto::Cloak: protocolConfigs.insert(config->protocolName, m_cloakConfigModel->getConfig()); break;
case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); 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::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 #ifdef Q_OS_WINDOWS
case Proto::Ikev2: case Proto::Ikev2:
case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break; case Proto::L2tp: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break;
#endif #endif
case Proto::Sftp: m_sftpConfigModel->updateModel(config); break; // case Proto::Sftp: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break;
case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break; // case Proto::Socks5Proxy: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break;
default: break; default: break;
} }
} }