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;
}
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;
bool hasEqualServerSettings(const CloakProtocolConfig &other) const;
void clearClientSettings();
cloak::ServerProtocolConfig serverProtocolConfig;
cloak::ClientProtocolConfig clientProtocolConfig;
};

View file

@ -1,20 +1,22 @@
#include "openvpnProtocolConfig.h"
#include <QJsonDocument>
#include "protocols/protocols_defs.h"
#include <QJsonDocument>
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();
}

View file

@ -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;
};

View file

@ -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<ProtocolConfig>
case Proto::OpenVpn: {
auto thisConfig = qSharedPointerCast<OpenVpnProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<OpenVpnProtocolConfig>(other);
return false;
return thisConfig->hasEqualServerSettings(*otherConfig.data());
}
case Proto::WireGuard: {
auto thisConfig = qSharedPointerCast<WireGuardProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<WireGuardProtocolConfig>(other);
return false;
return thisConfig->hasEqualServerSettings(*otherConfig.data());
}
case Proto::ShadowSocks: {
auto thisConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<ShadowsocksProtocolConfig>(other);
return false;
return thisConfig->hasEqualServerSettings(*otherConfig.data());
}
case Proto::Cloak: {
auto thisConfig = qSharedPointerCast<CloakProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<CloakProtocolConfig>(other);
return false;
return thisConfig->hasEqualServerSettings(*otherConfig.data());
}
case Proto::Xray: {
auto thisConfig = qSharedPointerCast<XrayProtocolConfig>(QSharedPointer<ProtocolConfig>(this));
auto otherConfig = qSharedPointerCast<XrayProtocolConfig>(other);
return false;
return thisConfig->hasEqualServerSettings(*otherConfig.data());
}
case Proto::Awg: {
auto thisConfig = qSharedPointerCast<AwgProtocolConfig>(QSharedPointer<ProtocolConfig>(this));

View file

@ -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();
}

View file

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

View file

@ -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();
}

View file

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

View file

@ -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();
}

View file

@ -28,6 +28,9 @@ public:
QJsonObject toJson() const override;
bool hasEqualServerSettings(const XrayProtocolConfig &other) const;
void clearClientSettings();
xray::ServerProtocolConfig serverProtocolConfig;
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 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<AwgProtocolConfig>(newProtoConfig);
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;
}
}

View file

@ -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<DockerContainer>(m_processedContainerIndex));
}
QJsonObject ContainersModel::getContainerConfig(const int containerIndex)
{
return qvariant_cast<QJsonObject>(data(index(containerIndex), ConfigRole));
}
bool ContainersModel::isSupportedByCurrentPlatform(const int containerIndex)
{
return qvariant_cast<bool>(data(index(containerIndex), IsSupportedRole));
@ -117,7 +106,6 @@ QHash<int, QByteArray> ContainersModel::roleNames() const
roles[DetailedDescriptionRole] = "detailedDescription";
roles[ServiceTypeRole] = "serviceType";
roles[DockerContainerRole] = "dockerContainer";
roles[ConfigRole] = "config";
roles[IsEasySetupContainerRole] = "isEasySetupContainer";
roles[EasySetupHeaderRole] = "easySetupHeader";

View file

@ -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);

View file

@ -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<ProtocolConfig> CloakConfigModel::getConfig()
{
m_fullConfig.insert(config_key::cloak, m_protocolConfig);
return m_fullConfig;
if (m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig)) {
m_newCloakProtocolConfig.clearClientSettings();
}
return QSharedPointer<CloakProtocolConfig>::create(m_newCloakProtocolConfig);
}
bool CloakConfigModel::isServerSettingsEqual()
{
return m_oldCloakProtocolConfig.hasEqualServerSettings(m_newCloakProtocolConfig);
}
QHash<int, QByteArray> CloakConfigModel::roleNames() const
@ -76,3 +77,4 @@ QHash<int, QByteArray> CloakConfigModel::roleNames() const
return roles;
}

View file

@ -5,6 +5,7 @@
#include <QJsonObject>
#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<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected:
QHash<int, QByteArray> roleNames() const override;
private:
DockerContainer m_container;
QJsonObject m_protocolConfig;
QJsonObject m_fullConfig;
CloakProtocolConfig m_newCloakProtocolConfig;
CloakProtocolConfig m_oldCloakProtocolConfig;
};
#endif // CLOAKCONFIGMODEL_H

View file

@ -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<ProtocolConfig> OpenVpnConfigModel::getConfig()
{
m_fullConfig.insert(config_key::openvpn, m_protocolConfig);
return m_fullConfig;
if (m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig)) {
m_newOpenVpnProtocolConfig.clearClientSettings();
}
return QSharedPointer<OpenVpnProtocolConfig>::create(m_newOpenVpnProtocolConfig);
}
bool OpenVpnConfigModel::isServerSettingsEqual()
{
return m_oldOpenVpnProtocolConfig.hasEqualServerSettings(m_newOpenVpnProtocolConfig);
}
QHash<int, QByteArray> OpenVpnConfigModel::roleNames() const

View file

@ -5,6 +5,7 @@
#include <QJsonObject>
#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<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected:
QHash<int, QByteArray> roleNames() const override;
private:
DockerContainer m_container;
QJsonObject m_protocolConfig;
QJsonObject m_fullConfig;
OpenVpnProtocolConfig m_newOpenVpnProtocolConfig;
OpenVpnProtocolConfig m_oldOpenVpnProtocolConfig;
};
#endif // OPENVPNCONFIGMODEL_H

View file

@ -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<ProtocolConfig> ShadowSocksConfigModel::getConfig()
{
m_fullConfig.insert(config_key::shadowsocks, m_protocolConfig);
return m_fullConfig;
if (m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig)) {
m_newShadowsocksProtocolConfig.clearClientSettings();
}
return QSharedPointer<ShadowsocksProtocolConfig>::create(m_newShadowsocksProtocolConfig);
}
bool ShadowSocksConfigModel::isServerSettingsEqual()
{
return m_oldShadowsocksProtocolConfig.hasEqualServerSettings(m_newShadowsocksProtocolConfig);
}
QHash<int, QByteArray> ShadowSocksConfigModel::roleNames() const
@ -77,3 +78,4 @@ QHash<int, QByteArray> ShadowSocksConfigModel::roleNames() const
return roles;
}

View file

@ -5,6 +5,7 @@
#include <QJsonObject>
#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<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected:
QHash<int, QByteArray> roleNames() const override;
private:
DockerContainer m_container;
QJsonObject m_protocolConfig;
QJsonObject m_fullConfig;
ShadowsocksProtocolConfig m_newShadowsocksProtocolConfig;
ShadowsocksProtocolConfig m_oldShadowsocksProtocolConfig;
};
#endif // SHADOWSOCKSCONFIGMODEL_H

View file

@ -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<ProtocolConfig> 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<WireGuardProtocolConfig>::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<int, QByteArray> WireGuardConfigModel::roleNames() const
@ -105,29 +79,3 @@ QHash<int, QByteArray> 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;
}

View file

@ -5,19 +5,7 @@
#include <QJsonObject>
#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<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
@ -47,10 +35,8 @@ protected:
QHash<int, QByteArray> 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

View file

@ -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<ProtocolConfig> XrayConfigModel::getConfig()
{
m_fullConfig.insert(config_key::xray, m_protocolConfig);
return m_fullConfig;
if (m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig)) {
m_newXrayProtocolConfig.clearClientSettings();
}
return QSharedPointer<XrayProtocolConfig>::create(m_newXrayProtocolConfig);
}
bool XrayConfigModel::isServerSettingsEqual()
{
return m_oldXrayProtocolConfig.hasEqualServerSettings(m_newXrayProtocolConfig);
}
QHash<int, QByteArray> XrayConfigModel::roleNames() const
@ -73,3 +74,4 @@ QHash<int, QByteArray> XrayConfigModel::roleNames() const
return roles;
}

View file

@ -5,6 +5,7 @@
#include <QJsonObject>
#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<ProtocolConfig> getConfig();
bool isServerSettingsEqual();
protected:
QHash<int, QByteArray> roleNames() const override;
private:
DockerContainer m_container;
QJsonObject m_protocolConfig;
QJsonObject m_fullConfig;
XrayProtocolConfig m_newXrayProtocolConfig;
XrayProtocolConfig m_oldXrayProtocolConfig;
};
#endif // XRAYCONFIGMODEL_H

View file

@ -16,7 +16,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer<OpenVpnConfigModel> &openVpn
const QSharedPointer<CloakConfigModel> &cloakConfigModel,
const QSharedPointer<WireGuardConfigModel> &wireGuardConfigModel,
const QSharedPointer<AwgConfigModel> &awgConfigModel, const QSharedPointer<XrayConfigModel> &xrayConfigModel,
#ifdef Q_OS_WINDOWS
const QSharedPointer<Ikev2ConfigModel> &ikev2ConfigModel,
#endif
const QSharedPointer<SftpConfigModel> &sftpConfigModel,
const QSharedPointer<Socks5ProxyConfigModel> &socks5ProxyConfigModel, QObject *parent)
: QAbstractListModel(parent),
@ -26,7 +28,9 @@ ProtocolsModel::ProtocolsModel(const QSharedPointer<OpenVpnConfigModel> &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<OpenVpnProtocolConfig>(protocolConfig).data()); break;
case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(*qSharedPointerCast<ShadowsocksProtocolConfig>(protocolConfig).data()); break;
case Proto::Cloak: m_cloakConfigModel->updateModel(*qSharedPointerCast<CloakProtocolConfig>(protocolConfig).data()); break;
case Proto::WireGuard: m_wireGuardConfigModel->updateModel(*qSharedPointerCast<WireGuardProtocolConfig>(protocolConfig).data()); break;
case Proto::Awg: m_awgConfigModel->updateModel(*qSharedPointerCast<AwgProtocolConfig>(protocolConfig).data()); break;
case Proto::Xray: m_xrayConfigModel->updateModel(*qSharedPointerCast<XrayProtocolConfig>(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<AwgProtocolConfig>(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<SftpConfigModel>(protocolConfig).data()); break;
// case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(*qSharedPointerCast<Socks>(protocolConfig).data()); break;
default: break;
}
}
@ -134,17 +138,17 @@ QMap<QString, QSharedPointer<ProtocolConfig>> 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;
}
}