diff --git a/client/ui/models/protocols/awgConfigModel.cpp b/client/ui/models/protocols/awgConfigModel.cpp index 860c8395..5a6a3798 100644 --- a/client/ui/models/protocols/awgConfigModel.cpp +++ b/client/ui/models/protocols/awgConfigModel.cpp @@ -4,6 +4,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + AwgConfigModel::AwgConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -90,40 +92,45 @@ void AwgConfigModel::updateModel(const QJsonObject &config) QJsonObject serverProtocolConfig = config.value(config_key::awg).toObject(); - auto defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Awg), Proto::Awg); - 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::awg::defaultPort); - m_serverProtocolConfig[config_key::junkPacketCount] = - serverProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount); - m_serverProtocolConfig[config_key::junkPacketMinSize] = - serverProtocolConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize); - m_serverProtocolConfig[config_key::junkPacketMaxSize] = - serverProtocolConfig.value(config_key::junkPacketMaxSize).toString(protocols::awg::defaultJunkPacketMaxSize); - m_serverProtocolConfig[config_key::initPacketJunkSize] = - serverProtocolConfig.value(config_key::initPacketJunkSize).toString(protocols::awg::defaultInitPacketJunkSize); - m_serverProtocolConfig[config_key::responsePacketJunkSize] = - serverProtocolConfig.value(config_key::responsePacketJunkSize).toString(protocols::awg::defaultResponsePacketJunkSize); - m_serverProtocolConfig[config_key::initPacketMagicHeader] = - serverProtocolConfig.value(config_key::initPacketMagicHeader).toString(protocols::awg::defaultInitPacketMagicHeader); - m_serverProtocolConfig[config_key::responsePacketMagicHeader] = - serverProtocolConfig.value(config_key::responsePacketMagicHeader).toString(protocols::awg::defaultResponsePacketMagicHeader); - m_serverProtocolConfig[config_key::underloadPacketMagicHeader] = - serverProtocolConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader); - m_serverProtocolConfig[config_key::transportPacketMagicHeader] = - serverProtocolConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader); + const auto defaultTransportProto = + ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Awg), Proto::Awg); - auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString(); + updateConfig(serverProtocolConfig, config_key::transport_proto, defaultTransportProto.toUtf8().constData()); + m_serverProtocolConfig[config_key::last_config] = serverProtocolConfig.value(config_key::last_config); + + const std::pair serverDefaults[] = { + { config_key::subnet_address, protocols::wireguard::defaultSubnetAddress }, + { config_key::port, protocols::wireguard::defaultPort }, + { config_key::junkPacketCount, protocols::awg::defaultJunkPacketCount }, + { config_key::junkPacketMinSize, protocols::awg::defaultJunkPacketMinSize }, + { config_key::junkPacketMaxSize, protocols::awg::defaultJunkPacketMaxSize }, + { config_key::initPacketJunkSize, protocols::awg::defaultInitPacketJunkSize }, + { config_key::responsePacketJunkSize, protocols::awg::defaultResponsePacketJunkSize }, + { config_key::initPacketMagicHeader, protocols::awg::defaultInitPacketMagicHeader }, + { config_key::responsePacketMagicHeader, protocols::awg::defaultResponsePacketMagicHeader }, + { config_key::underloadPacketMagicHeader, protocols::awg::defaultUnderloadPacketMagicHeader }, + { config_key::transportPacketMagicHeader, protocols::awg::defaultTransportPacketMagicHeader }, + }; + + for (const auto &[key, defaultValue] : serverDefaults) + updateConfig(serverProtocolConfig, key, defaultValue); + + const 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::awg::defaultMtu); - m_clientProtocolConfig[config_key::junkPacketCount] = - clientProtocolConfig.value(config_key::junkPacketCount).toString(m_serverProtocolConfig[config_key::junkPacketCount].toString()); - m_clientProtocolConfig[config_key::junkPacketMinSize] = - clientProtocolConfig.value(config_key::junkPacketMinSize).toString(m_serverProtocolConfig[config_key::junkPacketMinSize].toString()); - m_clientProtocolConfig[config_key::junkPacketMaxSize] = - clientProtocolConfig.value(config_key::junkPacketMaxSize).toString(m_serverProtocolConfig[config_key::junkPacketMaxSize].toString()); + + const std::pair clientDefaults[] = { + { config_key::mtu, protocols::awg::defaultMtu }, + { config_key::junkPacketCount, + m_serverProtocolConfig[config_key::junkPacketCount].toString().toUtf8().constData() }, + { config_key::junkPacketMinSize, + m_serverProtocolConfig[config_key::junkPacketMinSize].toString().toUtf8().constData() }, + { config_key::junkPacketMaxSize, + m_serverProtocolConfig[config_key::junkPacketMaxSize].toString().toUtf8().constData() }, + }; + + for (const auto &[key, defaultValue] : clientDefaults) + updateConfig(clientProtocolConfig, key, defaultValue); + endResetModel(); } diff --git a/client/ui/models/protocols/cloakConfigModel.cpp b/client/ui/models/protocols/cloakConfigModel.cpp index a9f06f4d..b7952889 100644 --- a/client/ui/models/protocols/cloakConfigModel.cpp +++ b/client/ui/models/protocols/cloakConfigModel.cpp @@ -2,6 +2,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + CloakConfigModel::CloakConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -51,11 +53,12 @@ void CloakConfigModel::updateModel(const QJsonObject &config) 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)); + auto defaultTransportProto = + ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Cloak), Proto::Cloak); + updateConfig(protocolConfig, config_key::transport_proto, defaultTransportProto.toUtf8().constData()); + updateConfig(protocolConfig, config_key::cipher, protocols::cloak::defaultCipher); + updateConfig(protocolConfig, config_key::port, protocols::cloak::defaultPort); + updateConfig(protocolConfig, config_key::site, protocols::cloak::defaultRedirSite); endResetModel(); } diff --git a/client/ui/models/protocols/ikev2ConfigModel.cpp b/client/ui/models/protocols/ikev2ConfigModel.cpp index 05494a07..a22248eb 100644 --- a/client/ui/models/protocols/ikev2ConfigModel.cpp +++ b/client/ui/models/protocols/ikev2ConfigModel.cpp @@ -2,6 +2,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + Ikev2ConfigModel::Ikev2ConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -49,8 +51,8 @@ void Ikev2ConfigModel::updateModel(const QJsonObject &config) m_fullConfig = config; QJsonObject protocolConfig = config.value(config_key::shadowsocks).toObject(); - 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)); + updateConfig(protocolConfig, config_key::cipher, protocols::shadowsocks::defaultCipher); + updateConfig(protocolConfig, config_key::port, protocols::shadowsocks::defaultPort); endResetModel(); } diff --git a/client/ui/models/protocols/openvpnConfigModel.cpp b/client/ui/models/protocols/openvpnConfigModel.cpp index a04c2b1a..3fb163a1 100644 --- a/client/ui/models/protocols/openvpnConfigModel.cpp +++ b/client/ui/models/protocols/openvpnConfigModel.cpp @@ -2,6 +2,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + OpenVpnConfigModel::OpenVpnConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -73,9 +75,7 @@ void OpenVpnConfigModel::updateModel(const QJsonObject &config) 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)); + updateConfig(protocolConfig, config_key::subnet_address, amnezia::protocols::openvpn::defaultSubnetAddress); QString transportProto; if (m_container == DockerContainer::OpenVpn) { @@ -84,22 +84,31 @@ void OpenVpnConfigModel::updateModel(const QJsonObject &config) transportProto = "tcp"; } - m_protocolConfig.insert(config_key::transport_proto, transportProto); + const std::pair> defaults[] = { + { config_key::transport_proto, transportProto.toUtf8().constData() }, + { config_key::port, protocols::openvpn::defaultPort }, + { config_key::ncp_disable, protocols::openvpn::defaultNcpDisable }, + { config_key::cipher, protocols::openvpn::defaultCipher }, + { config_key::hash, protocols::openvpn::defaultHash }, + { config_key::block_outside_dns, protocols::openvpn::defaultBlockOutsideDns }, + { config_key::tls_auth, protocols::openvpn::defaultTlsAuth }, + { config_key::additional_client_config, protocols::openvpn::defaultAdditionalClientConfig }, + }; - 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)); + for (const auto &[key, def] : defaults) { + const auto configKey = key; + const auto defaultValue = def; + std::visit([&](auto &&defaultValue_) { updateConfig(protocolConfig, configKey, defaultValue_); }, defaultValue); + } + + updateConfig(protocolConfig, config_key::transport_proto, transportProto.toUtf8().constData()); + updateConfig(protocolConfig, config_key::ncp_disable, protocols::openvpn::defaultNcpDisable); + updateConfig(protocolConfig, config_key::cipher, protocols::openvpn::defaultCipher); + updateConfig(protocolConfig, config_key::hash, protocols::openvpn::defaultHash); + updateConfig(protocolConfig, config_key::block_outside_dns, protocols::openvpn::defaultBlockOutsideDns); + updateConfig(protocolConfig, config_key::port, protocols::openvpn::defaultPort); + updateConfig(protocolConfig, config_key::tls_auth, protocols::openvpn::defaultTlsAuth); + updateConfig(protocolConfig, config_key::additional_client_config, protocols::openvpn::defaultAdditionalClientConfig); endResetModel(); } diff --git a/client/ui/models/protocols/utils.h b/client/ui/models/protocols/utils.h new file mode 100644 index 00000000..ed47967f --- /dev/null +++ b/client/ui/models/protocols/utils.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +template +inline void updateConfig(const QJsonObject &inConfig, QJsonObject &outConfig, const char *config_key, T default_value) +{ + if (!inConfig.contains(config_key)) + return; + + const auto value = inConfig.value(config_key); + + if constexpr (std::is_same_v) { + outConfig[config_key] = value.toString(default_value); + } else if constexpr (std::is_same_v) { + outConfig[config_key] = value.toBool(default_value); + } else { + static_assert(std::is_same_v, "updateConfig: unsupported default-value type"); + } +} + +#define updateConfig(NAME, key, default_value) updateConfig(NAME, m_##NAME, key, default_value); \ No newline at end of file diff --git a/client/ui/models/protocols/wireguardConfigModel.cpp b/client/ui/models/protocols/wireguardConfigModel.cpp index 1c8e1341..a8023031 100644 --- a/client/ui/models/protocols/wireguardConfigModel.cpp +++ b/client/ui/models/protocols/wireguardConfigModel.cpp @@ -4,6 +4,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + WireGuardConfigModel::WireGuardConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -55,15 +57,23 @@ void WireGuardConfigModel::updateModel(const QJsonObject &config) 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)); + updateConfig(serverProtocolConfig, config_key::transport_proto, defaultTransportProto.toUtf8().constData()); + + const std::pair serverDefaults[] = { + { config_key::transport_proto, defaultTransportProto.toUtf8().constData() }, + { config_key::subnet_address, protocols::wireguard::defaultSubnetAddress }, + { config_key::port, protocols::wireguard::defaultPort }, + }; + + for (const auto &[key, def] : serverDefaults) + updateConfig(serverProtocolConfig, key, def); + + 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); + updateConfig(clientProtocolConfig, config_key::mtu, protocols::wireguard::defaultMtu); endResetModel(); } diff --git a/client/ui/models/protocols/xrayConfigModel.cpp b/client/ui/models/protocols/xrayConfigModel.cpp index 84bbb2f7..d6a11197 100644 --- a/client/ui/models/protocols/xrayConfigModel.cpp +++ b/client/ui/models/protocols/xrayConfigModel.cpp @@ -2,6 +2,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + XrayConfigModel::XrayConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -47,11 +49,20 @@ void XrayConfigModel::updateModel(const QJsonObject &config) 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)); + if (protocolConfig.contains(config_key::transport_proto)) { + auto transportProto = protocolConfig.value(config_key::transport_proto) + .toString(ProtocolProps::transportProtoToString( + ProtocolProps::defaultTransportProto(Proto::Xray), Proto::Xray)); + m_protocolConfig[config_key::transport_proto] = transportProto; + } + + const std::pair defaults[] = { + { config_key::port, protocols::xray::defaultPort }, + { config_key::site, protocols::xray::defaultSite }, + }; + + for (const auto &[key, def] : defaults) + updateConfig(protocolConfig, key, def); endResetModel(); } diff --git a/client/ui/models/services/sftpConfigModel.cpp b/client/ui/models/services/sftpConfigModel.cpp index 3cbb5ebc..48bf4384 100644 --- a/client/ui/models/services/sftpConfigModel.cpp +++ b/client/ui/models/services/sftpConfigModel.cpp @@ -2,6 +2,8 @@ #include "protocols/protocols_defs.h" +#include "ui/models/protocols/utils.h" + SftpConfigModel::SftpConfigModel(QObject *parent) : QAbstractListModel(parent) { } @@ -36,11 +38,8 @@ void SftpConfigModel::updateModel(const QJsonObject &config) m_fullConfig = config; QJsonObject protocolConfig = config.value(config_key::sftp).toObject(); - m_protocolConfig.insert(config_key::userName, - protocolConfig.value(config_key::userName).toString(protocols::sftp::defaultUserName)); - + updateConfig(protocolConfig, config_key::userName, protocols::sftp::defaultUserName); m_protocolConfig.insert(config_key::password, protocolConfig.value(config_key::password).toString()); - m_protocolConfig.insert(config_key::port, protocolConfig.value(config_key::port).toString()); endResetModel();