diff --git a/src/connectionmanager.cpp b/src/connectionmanager.cpp index 0de0e6bcf1..e961db5d9e 100644 --- a/src/connectionmanager.cpp +++ b/src/connectionmanager.cpp @@ -687,6 +687,9 @@ void ConnectionManager::resetConnectedTime() { void ConnectionManager::disconnected() { logger.debug() << "Disconnected from state:" << m_state; + m_pingCanary.stop(); + m_handshakeTimer.stop(); + m_activationQueue.clear(); clearConnectedTime(); clearRetryCounter(); diff --git a/src/platforms/android/androidcontroller.cpp b/src/platforms/android/androidcontroller.cpp index 27e237f940..4ab270c44a 100644 --- a/src/platforms/android/androidcontroller.cpp +++ b/src/platforms/android/androidcontroller.cpp @@ -102,10 +102,11 @@ AndroidController::AndroidController() { Qt::QueuedConnection); connect( activity, &AndroidVPNActivity::eventOnboardingCompleted, this, - []() { + [this]() { auto vpn = MozillaVPN::instance(); if (vpn->state() == App::StateOnboarding) { vpn->onboardingCompleted(); + emit disconnected(); } }, Qt::QueuedConnection); diff --git a/src/platforms/ios/ioscontroller.mm b/src/platforms/ios/ioscontroller.mm index d016595fe1..a2a2dd3897 100644 --- a/src/platforms/ios/ioscontroller.mm +++ b/src/platforms/ios/ioscontroller.mm @@ -154,8 +154,8 @@ isSuperDooperFeatureActive:Feature::get(Feature::Feature_superDooperMetrics)->isSupported() installationId:config.m_installationId.toNSString() isOnboarding:MozillaVPN::instance()->state() == App::StateOnboarding - failureCallback:^() { - logger.error() << "IOSSWiftController - connection failed"; + disconnectCallback:^() { + logger.error() << "IOSSWiftController - disconnecting"; emit disconnected(); } onboardingCompletedCallback:^() { diff --git a/src/platforms/ios/ioscontroller.swift b/src/platforms/ios/ioscontroller.swift index fbba566944..1cf9672826 100644 --- a/src/platforms/ios/ioscontroller.swift +++ b/src/platforms/ios/ioscontroller.swift @@ -116,7 +116,7 @@ public class IOSControllerImpl : NSObject { } } - @objc func connect(dnsServer: String, serverIpv6Gateway: String, serverPublicKey: String, serverIpv4AddrIn: String, serverPort: Int, allowedIPAddressRanges: Array, reason: Int, gleanDebugTag: String, isSuperDooperFeatureActive: Bool, installationId: String, isOnboarding: Bool, failureCallback: @escaping () -> Void, onboardingCompletedCallback: @escaping () -> Void) { + @objc func connect(dnsServer: String, serverIpv6Gateway: String, serverPublicKey: String, serverIpv4AddrIn: String, serverPort: Int, allowedIPAddressRanges: Array, reason: Int, gleanDebugTag: String, isSuperDooperFeatureActive: Bool, installationId: String, isOnboarding: Bool, disconnectCallback: @escaping () -> Void, onboardingCompletedCallback: @escaping () -> Void) { IOSControllerImpl.logger.debug(message: "Connecting") let _ = TunnelManager.withTunnel { tunnel in @@ -152,11 +152,11 @@ public class IOSControllerImpl : NSObject { let config = TunnelConfiguration(name: VPN_NAME, interface: interface, peers: peerConfigurations) - return self.configureTunnel(config: config, reason: reason, serverName: serverIpv4AddrIn + ":\(serverPort )", gleanDebugTag: gleanDebugTag, isSuperDooperFeatureActive: isSuperDooperFeatureActive, installationId: installationId, isOnboarding: isOnboarding, failureCallback: failureCallback, onboardingCompletedCallback: onboardingCompletedCallback) + return self.configureTunnel(config: config, reason: reason, serverName: serverIpv4AddrIn + ":\(serverPort )", gleanDebugTag: gleanDebugTag, isSuperDooperFeatureActive: isSuperDooperFeatureActive, installationId: installationId, isOnboarding: isOnboarding, disconnectCallback: disconnectCallback, onboardingCompletedCallback: onboardingCompletedCallback) } } - func configureTunnel(config: TunnelConfiguration, reason: Int, serverName: String, gleanDebugTag: String, isSuperDooperFeatureActive: Bool, installationId: String, isOnboarding: Bool, failureCallback: @escaping () -> Void, onboardingCompletedCallback: @escaping () -> Void) { + func configureTunnel(config: TunnelConfiguration, reason: Int, serverName: String, gleanDebugTag: String, isSuperDooperFeatureActive: Bool, installationId: String, isOnboarding: Bool, disconnectCallback: @escaping () -> Void, onboardingCompletedCallback: @escaping () -> Void) { let _ = TunnelManager.withTunnel { tunnel in let proto = NETunnelProviderProtocol(tunnelConfiguration: config) proto!.providerBundleIdentifier = TunnelManager.vpnBundleId @@ -187,7 +187,7 @@ public class IOSControllerImpl : NSObject { return tunnel.saveToPreferences { saveError in if let error = saveError { IOSControllerImpl.logger.error(message: "Connect Tunnel Save Error: \(error)") - failureCallback() + disconnectCallback() if isOnboarding { IOSControllerImpl.logger.info(message: "Finishing onboarding, but saving tunnel resulted in error...") onboardingCompletedCallback() @@ -195,23 +195,24 @@ public class IOSControllerImpl : NSObject { return } - IOSControllerImpl.logger.info(message: "Saving the tunnel succeeded") - - //Used to create a VPN configuration without connecting during onboarding - if isOnboarding { - IOSControllerImpl.logger.info(message: "Finishing onboarding... do not turn on the VPN after gaining permission") - onboardingCompletedCallback() - return - } + IOSControllerImpl.logger.info(message: "Saving the tunnel succeeded") tunnel.loadFromPreferences { error in if let error = error { IOSControllerImpl.logger.error(message: "Connect Tunnel Load Error: \(error)") - failureCallback() + disconnectCallback() return } - IOSControllerImpl.logger.info(message: "Loading the tunnel succeeded") + IOSControllerImpl.logger.info(message: "Loading the tunnel succeeded") + + // Used to create a VPN configuration without connecting during onboarding + if isOnboarding { + IOSControllerImpl.logger.info(message: "Finishing onboarding... do not turn on the VPN after gaining permission") + disconnectCallback() + onboardingCompletedCallback() + return + } do { if (reason == 1 /* ReasonSwitching */) { @@ -224,7 +225,7 @@ public class IOSControllerImpl : NSObject { } } catch let error { IOSControllerImpl.logger.error(message: "Something went wrong: \(error)") - failureCallback() + disconnectCallback() return } } diff --git a/src/telemetry.cpp b/src/telemetry.cpp index 1a5c8bf9ae..6150825852 100644 --- a/src/telemetry.cpp +++ b/src/telemetry.cpp @@ -219,7 +219,8 @@ void Telemetry::initialize() { connectionManager, &ConnectionManager::controllerDisconnected, this, [this, connectionManager]() { if (Feature::get(Feature::Feature_superDooperMetrics)->isSupported()) { - if (connectionManager->state() == ConnectionManager::StateOff) { + if (connectionManager->state() == ConnectionManager::StateOff && + SettingsHolder::instance()->onboardingCompleted()) { mozilla::glean::session::session_end.set(); mozilla::glean_pings::Vpnsession.submit("end");