From fac57ac89a0cc1efa81f6a3d77ca92e54b9141e5 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 17 Jan 2024 00:34:23 +0700 Subject: [PATCH] for servers received via api, ignore the split tunneling settings --- client/configurators/openvpn_configurator.cpp | 40 ++++++++++--------- client/configurators/openvpn_configurator.h | 2 +- client/configurators/vpn_configurator.cpp | 2 +- client/ui/models/servers_model.cpp | 5 +++ client/ui/models/servers_model.h | 2 + .../qml/Pages2/PageSettingsSplitTunneling.qml | 8 +++- client/vpnconnection.cpp | 33 ++++++++------- 7 files changed, 55 insertions(+), 37 deletions(-) diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index e3362236..8b201fbf 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -118,31 +118,33 @@ QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentia return QJsonDocument(jConfig).toJson(); } -QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig) +QString OpenVpnConfigurator::processConfigWithLocalSettings(QString jsonConfig, const int serverIndex) { QJsonObject json = QJsonDocument::fromJson(jsonConfig.toUtf8()).object(); QString config = json[config_key::config].toString(); - QRegularExpression regex("redirect-gateway.*"); - config.replace(regex, ""); + if (!m_settings->server(serverIndex).value(config_key::configVersion).toInt()) { + QRegularExpression regex("redirect-gateway.*"); + config.replace(regex, ""); - if (m_settings->routeMode() == Settings::VpnAllSites) { - config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); - // Prevent ipv6 leak - config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); - config.append("block-ipv6\n"); - } - if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { + if (m_settings->routeMode() == Settings::VpnAllSites) { + config.append("\nredirect-gateway def1 ipv6 bypass-dhcp\n"); + // Prevent ipv6 leak + config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); + config.append("block-ipv6\n"); + } + if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { - // no redirect-gateway - } - if (m_settings->routeMode() == Settings::VpnAllExceptSites) { -#ifndef Q_OS_ANDROID - config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); -#endif - // Prevent ipv6 leak - config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); - config.append("block-ipv6\n"); + // no redirect-gateway + } + if (m_settings->routeMode() == Settings::VpnAllExceptSites) { + #ifndef Q_OS_ANDROID + config.append("\nredirect-gateway ipv6 !ipv4 bypass-dhcp\n"); + #endif + // Prevent ipv6 leak + config.append("ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1\n"); + config.append("block-ipv6\n"); + } } #ifndef MZ_WINDOWS diff --git a/client/configurators/openvpn_configurator.h b/client/configurators/openvpn_configurator.h index cc66d13f..424a20e1 100644 --- a/client/configurators/openvpn_configurator.h +++ b/client/configurators/openvpn_configurator.h @@ -26,7 +26,7 @@ public: QString genOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode = nullptr); - QString processConfigWithLocalSettings(QString jsonConfig); + QString processConfigWithLocalSettings(QString jsonConfig, const int serverIndex); QString processConfigWithExportSettings(QString jsonConfig); ErrorCode signCert(DockerContainer container, diff --git a/client/configurators/vpn_configurator.cpp b/client/configurators/vpn_configurator.cpp index 3018b52f..c74a3d4f 100644 --- a/client/configurators/vpn_configurator.cpp +++ b/client/configurators/vpn_configurator.cpp @@ -92,7 +92,7 @@ QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, Docker processConfigWithDnsSettings(serverIndex, container, proto, config); if (proto == Proto::OpenVpn) { - config = openVpnConfigurator->processConfigWithLocalSettings(config); + config = openVpnConfigurator->processConfigWithLocalSettings(config, serverIndex); } return config; } diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index feaf1e8d..1922e188 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -531,3 +531,8 @@ void ServersModel::toggleAmneziaDns(bool enabled) emit defaultServerDescriptionChanged(); } +bool ServersModel::isDefaultServerFromApi() +{ + return m_settings->server(m_defaultServerIndex).value(config_key::configVersion).toInt(); +} + diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index af88febb..38f2bdd4 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -97,6 +97,8 @@ public slots: void toggleAmneziaDns(bool enabled); + bool isDefaultServerFromApi(); + protected: QHash roleNames() const override; diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 873ae997..9ad88524 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -21,7 +21,13 @@ PageType { id: root property bool pageEnabled: { - return !ConnectionController.isConnected + return !ConnectionController.isConnected && !ServersModel.isDefaultServerFromApi() + } + + Component.onCompleted: { + if (ServersModel.isDefaultServerFromApi()) { + PageController.showNotificationMessage(qsTr("This server does not support split tunneling function")) + } } Connections { diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 5d4d5f99..75483d89 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -64,24 +64,26 @@ void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state) IpcClient::Interface()->resetIpStack(); IpcClient::Interface()->flushDns(); - if (m_settings->routeMode() != Settings::VpnAllSites) { - IpcClient::Interface()->routeDeleteList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0"); - // qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size(); - } - QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString(); - QString dns2 = m_vpnConfiguration.value(config_key::dns2).toString(); + if (!m_vpnConfiguration.value(config_key::configVersion).toInt()) { + if (m_settings->routeMode() != Settings::VpnAllSites) { + IpcClient::Interface()->routeDeleteList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0"); + // qDebug() << "VpnConnection::onConnectionStateChanged :: adding custom routes, count:" << forwardIps.size(); + } + QString dns1 = m_vpnConfiguration.value(config_key::dns1).toString(); + QString dns2 = m_vpnConfiguration.value(config_key::dns2).toString(); - IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << dns1 << dns2); + IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << dns1 << dns2); - if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { - QTimer::singleShot(1000, m_vpnProtocol.data(), - [this]() { addSitesRoutes(m_vpnProtocol->vpnGateway(), m_settings->routeMode()); }); - } else if (m_settings->routeMode() == Settings::VpnAllExceptSites) { - IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0/1"); - IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << "128.0.0.0/1"); + if (m_settings->routeMode() == Settings::VpnOnlyForwardSites) { + QTimer::singleShot(1000, m_vpnProtocol.data(), + [this]() { addSitesRoutes(m_vpnProtocol->vpnGateway(), m_settings->routeMode()); }); + } else if (m_settings->routeMode() == Settings::VpnAllExceptSites) { + IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << "0.0.0.0/1"); + IpcClient::Interface()->routeAddList(m_vpnProtocol->vpnGateway(), QStringList() << "128.0.0.0/1"); - IpcClient::Interface()->routeAddList(m_vpnProtocol->routeGateway(), QStringList() << remoteAddress()); - addSitesRoutes(m_vpnProtocol->routeGateway(), m_settings->routeMode()); + IpcClient::Interface()->routeAddList(m_vpnProtocol->routeGateway(), QStringList() << remoteAddress()); + addSitesRoutes(m_vpnProtocol->routeGateway(), m_settings->routeMode()); + } } } else if (state == Vpn::ConnectionState::Error) { @@ -296,6 +298,7 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex, const ServerC vpnConfiguration[config_key::hostName] = server.value(config_key::hostName).toString(); vpnConfiguration[config_key::description] = server.value(config_key::description).toString(); + vpnConfiguration[config_key::configVersion] = server.value(config_key::configVersion).toInt(); // TODO: try to get hostName, port, description for 3rd party configs // vpnConfiguration[config_key::port] = ...;