From 5510ff7dce05deb809c670d689d8681a13e270a9 Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 8 Aug 2023 19:02:41 -0700 Subject: [PATCH] iOS connection fixes (#278) iOS VPN connection fixes --- client/protocols/ios_vpnprotocol.h | 2 +- client/protocols/ios_vpnprotocol.mm | 11 +++++- client/vpnconnection.cpp | 59 ++++++++++------------------- client/vpnconnection.h | 13 +++---- 4 files changed, 35 insertions(+), 50 deletions(-) diff --git a/client/protocols/ios_vpnprotocol.h b/client/protocols/ios_vpnprotocol.h index ed5b45b00..9b4057e52 100644 --- a/client/protocols/ios_vpnprotocol.h +++ b/client/protocols/ios_vpnprotocol.h @@ -15,7 +15,7 @@ public: explicit IOSVpnProtocol(amnezia::Proto proto, const QJsonObject& configuration, QObject* parent = nullptr); static IOSVpnProtocol* instance(); - virtual ~IOSVpnProtocol() override = default; + virtual ~IOSVpnProtocol() override; bool initialize(); diff --git a/client/protocols/ios_vpnprotocol.mm b/client/protocols/ios_vpnprotocol.mm index f71db34a6..cc38cf538 100644 --- a/client/protocols/ios_vpnprotocol.mm +++ b/client/protocols/ios_vpnprotocol.mm @@ -30,6 +30,12 @@ IOSVpnProtocol::IOSVpnProtocol(Proto proto, const QJsonObject &configuration, QO connect(this, &IOSVpnProtocol::newTransmittedDataCount, this, &IOSVpnProtocol::setBytesChanged); } +IOSVpnProtocol::~IOSVpnProtocol() +{ + qDebug() << "IOSVpnProtocol::~IOSVpnProtocol()"; + IOSVpnProtocol::stop(); +} + IOSVpnProtocol* IOSVpnProtocol::instance() { return s_instance; } @@ -158,9 +164,12 @@ void IOSVpnProtocol::checkStatus() } m_checkingStatus = true; + + QPointer weakSelf = this; [m_controller checkStatusWithCallback:^(NSString* serverIpv4Gateway, NSString* deviceIpv4Address, NSString* configString) { + if (!weakSelf) return; QString config = QString::fromNSString(configString); m_checkingStatus = false; @@ -185,7 +194,7 @@ void IOSVpnProtocol::checkStatus() } } - emit newTransmittedDataCount(rxBytes, txBytes); + emit weakSelf->newTransmittedDataCount(rxBytes, txBytes); }]; } diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 2b043e33d..96c7b6fb7 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -32,9 +32,9 @@ VpnConnection::VpnConnection(std::shared_ptr settings, std::shared_ptr configurator, QObject* parent) : QObject(parent), m_settings(settings), - m_configurator(configurator), - m_isIOSConnected(false) + m_configurator(configurator) { + m_checkTimer.setInterval(1000); } VpnConnection::~VpnConnection() @@ -96,31 +96,16 @@ void VpnConnection::onConnectionStateChanged(VpnProtocol::VpnConnectionState sta #endif #ifdef Q_OS_IOS - if (state == VpnProtocol::Connected){ - m_isIOSConnected = true; - checkIOSStatus(); + if (state == VpnProtocol::Connected) { + m_checkTimer.start(); } else { - m_isIOSConnected = false; -// m_receivedBytes = 0; -// m_sentBytes = 0; + m_checkTimer.stop(); } #endif emit connectionStateChanged(state); } -#ifdef Q_OS_IOS -void VpnConnection::checkIOSStatus() -{ - QTimer::singleShot(1000, [this]() { - if(m_isIOSConnected){ - iosVpnProtocol->checkStatus(); - checkIOSStatus(); - } - } ); -} -#endif - const QString &VpnConnection::remoteAddress() const { return m_remoteAddress; @@ -236,7 +221,6 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode) { - ErrorCode e = ErrorCode::NoError; QMap lastVpnConfig = getLastVpnConfig(containerConfig); QString configData; @@ -246,19 +230,16 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, } else { configData = m_configurator->genVpnProtocolConfig(credentials, - container, containerConfig, proto, &e); + container, containerConfig, proto, errorCode); + + if (errorCode && *errorCode) { + return ""; + } QString configDataBeforeLocalProcessing = configData; configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); - - if (errorCode && e) { - *errorCode = e; - return ""; - } - - if (serverIndex >= 0) { qDebug() << "VpnConnection::createVpnConfiguration: saving config for server #" << serverIndex << container << proto; QJsonObject protoObject = m_settings->protocolConfig(serverIndex, container, proto); @@ -267,7 +248,6 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, } } - if (errorCode) *errorCode = e; return configData; } @@ -275,18 +255,15 @@ QJsonObject VpnConnection::createVpnConfiguration(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) { - ErrorCode e = ErrorCode::NoError; QJsonObject vpnConfiguration; - for (ProtocolEnumNS::Proto proto : ContainerProps::protocolsForContainer(container)) { QJsonObject vpnConfigData = QJsonDocument::fromJson( createVpnConfigurationForProto( - serverIndex, credentials, container, containerConfig, proto, &e).toUtf8()). + serverIndex, credentials, container, containerConfig, proto, errorCode).toUtf8()). object(); - if (e) { - if (errorCode) *errorCode = e; + if (errorCode && *errorCode) { return {}; } @@ -336,7 +313,7 @@ void VpnConnection::connectToVpn(int serverIndex, ErrorCode e = ErrorCode::NoError; - m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig); + m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig, &e); if (e) { emit connectionStateChanged(VpnProtocol::Error); return; @@ -356,16 +333,18 @@ void VpnConnection::connectToVpn(int serverIndex, m_vpnProtocol.reset(androidVpnProtocol); #elif defined Q_OS_IOS Proto proto = ContainerProps::defaultProtocol(container); - //if (iosVpnProtocol==NULL) { - iosVpnProtocol = new IOSVpnProtocol(proto, m_vpnConfiguration); - //} - // IOSVpnProtocol *iosVpnProtocol = new IOSVpnProtocol(proto, m_vpnConfiguration); + auto iosVpnProtocol = new IOSVpnProtocol(proto, m_vpnConfiguration); + if (!iosVpnProtocol->initialize()) { qDebug() << QString("Init failed") ; emit VpnProtocol::Error; + iosVpnProtocol->deleteLater(); return; } + + connect(&m_checkTimer, &QTimer::timeout, iosVpnProtocol, &IOSVpnProtocol::checkStatus); m_vpnProtocol.reset(iosVpnProtocol); + #endif createProtocolConnections(); diff --git a/client/vpnconnection.h b/client/vpnconnection.h index 63bd4292d..abef58a6e 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "protocols/vpnprotocol.h" #include "core/defs.h" @@ -85,10 +86,6 @@ protected slots: void onBytesChanged(quint64 receivedBytes, quint64 sentBytes); void onConnectionStateChanged(VpnProtocol::VpnConnectionState state); -#ifdef Q_OS_IOS - void checkIOSStatus(); -#endif - protected: QSharedPointer m_vpnProtocol; @@ -99,14 +96,14 @@ private: QJsonObject m_vpnConfiguration; QJsonObject m_routeMode; QString m_remoteAddress; - bool m_isIOSConnected; //remove later move to isConnected, + + // Only for iOS for now, check counters + QTimer m_checkTimer; #ifdef AMNEZIA_DESKTOP IpcClient *m_IpcClient {nullptr}; #endif -#ifdef Q_OS_IOS - IOSVpnProtocol * iosVpnProtocol{nullptr}; -#endif + #ifdef Q_OS_ANDROID AndroidVpnProtocol* androidVpnProtocol = nullptr;