diff --git a/client/core/protocols/openVpnProtocol.cpp b/client/core/protocols/openVpnProtocol.cpp index 5177e7c19..83d6191bb 100644 --- a/client/core/protocols/openVpnProtocol.cpp +++ b/client/core/protocols/openVpnProtocol.cpp @@ -39,33 +39,44 @@ QString OpenVpnProtocol::defaultConfigPath() return p; } -void OpenVpnProtocol::stop() +void OpenVpnProtocol::cleanupResources() { - qDebug() << "OpenVpnProtocol::stop()"; - setConnectionState(Vpn::ConnectionState::Disconnecting); - - // TODO: need refactoring - // sendTermSignal() will even return true while server connected ??? - if ((m_connectionState == Vpn::ConnectionState::Preparing) || (m_connectionState == Vpn::ConnectionState::Connecting) - || (m_connectionState == Vpn::ConnectionState::Connected) - || (m_connectionState == Vpn::ConnectionState::Reconnecting)) { + if (m_openVpnProcess || openVpnProcessIsRunning()) { if (!sendTermSignal()) { killOpenVpnProcess(); } QThread::msleep(10); - m_managementServer.stop(); } + m_managementServer.stop(); #if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS) IpcClient::withInterface([](QSharedPointer iface) { QRemoteObjectPendingReply reply = iface->disableKillSwitch(); if (!reply.waitForFinished(1000) && !reply.returnValue()) { - qWarning() << "OpenVpnProtocol::stop(): Failed to disable killswitch"; + qWarning() << "OpenVpnProtocol::cleanupResources(): Failed to disable killswitch"; } }); #endif +} - setConnectionState(Vpn::ConnectionState::Disconnected); +void OpenVpnProtocol::stop() +{ + qDebug() << "OpenVpnProtocol::stop()"; + + const bool wasActive = m_connectionState == Vpn::ConnectionState::Preparing + || m_connectionState == Vpn::ConnectionState::Connecting + || m_connectionState == Vpn::ConnectionState::Connected + || m_connectionState == Vpn::ConnectionState::Reconnecting; + + if (wasActive) { + setConnectionState(Vpn::ConnectionState::Disconnecting); + } + + cleanupResources(); + + if (wasActive || m_connectionState == Vpn::ConnectionState::Disconnecting) { + setConnectionState(Vpn::ConnectionState::Disconnected); + } } ErrorCode OpenVpnProtocol::prepare() @@ -168,7 +179,7 @@ void OpenVpnProtocol::updateRouteGateway(QString line) ErrorCode OpenVpnProtocol::start() { - OpenVpnProtocol::stop(); + cleanupResources(); if (!QFileInfo::exists(configPath())) { setLastError(ErrorCode::OpenVpnConfigMissing); diff --git a/client/core/protocols/openVpnProtocol.h b/client/core/protocols/openVpnProtocol.h index 45116d0e7..beb7386a6 100644 --- a/client/core/protocols/openVpnProtocol.h +++ b/client/core/protocols/openVpnProtocol.h @@ -29,6 +29,7 @@ protected slots: void onReadyReadDataFromManagementServer(); private: + void cleanupResources(); QString configPath() const; bool openVpnProcessIsRunning() const; bool sendTermSignal();