Skip to content

Commit

Permalink
Fixes some VPN uninstallation issues (#2820)
Browse files Browse the repository at this point in the history
Task/Issue URL:
https://app.asana.com/0/1206580121312550/1207431594119528/f

## Description

Fixes some VPN uninstallation issues in v1.90.0.
  • Loading branch information
diegoreymendez authored May 30, 2024
1 parent a1692ff commit 3db1af0
Showing 1 changed file with 42 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import Subscription
typealias NetworkProtectionStatusChangeHandler = (NetworkProtection.ConnectionStatus) -> Void
typealias NetworkProtectionConfigChangeHandler = () -> Void

// swiftlint:disable:next type_body_length
final class NetworkProtectionTunnelController: TunnelController, TunnelSessionProvider {

// MARK: - Settings
Expand Down Expand Up @@ -94,6 +95,13 @@ final class NetworkProtectionTunnelController: TunnelController, TunnelSessionPr
///
private var internalManager: NETunnelProviderManager?

/// Simply clears the internal manager so the VPN manager is reloaded next time it's requested.
///
@MainActor
private func clearInternalManager() {
internalManager = nil
}

/// The last known VPN status.
///
/// Should not be used for checking the current status.
Expand Down Expand Up @@ -178,6 +186,7 @@ final class NetworkProtectionTunnelController: TunnelController, TunnelSessionPr

subscribeToSettingsChanges()
subscribeToStatusChanges()
subscribeToConfigurationChanges()
}

// MARK: - Observing Status Changes
Expand Down Expand Up @@ -209,6 +218,31 @@ final class NetworkProtectionTunnelController: TunnelController, TunnelSessionPr
}
}

// MARK: - Observing Configuation Changes

private func subscribeToConfigurationChanges() {
notificationCenter.publisher(for: .NEVPNConfigurationChange)
.receive(on: DispatchQueue.main)
.sink { _ in
Task { @MainActor in
guard let manager = await self.manager else {
return
}

do {
try await manager.loadFromPreferences()

if manager.connection.status == .invalid {
self.clearInternalManager()
}
} catch {
self.clearInternalManager()
}
}
}
.store(in: &cancellables)
}

// MARK: - Subscriptions

private func subscribeToSettingsChanges() {
Expand Down Expand Up @@ -693,6 +727,14 @@ final class NetworkProtectionTunnelController: TunnelController, TunnelSessionPr
func disableOnDemand(tunnelManager: NETunnelProviderManager) async throws {
try await tunnelManager.loadFromPreferences()

guard tunnelManager.connection.status != .invalid else {
// An invalid connection status means the VPN isn't really configured
// so we don't want to save changed because that would re-create the VPN
// configuration.
clearInternalManager()
return
}

tunnelManager.isOnDemandEnabled = false

try await tunnelManager.saveToPreferences()
Expand Down

0 comments on commit 3db1af0

Please sign in to comment.