Skip to content

Commit

Permalink
Merge branch 'release/1.90.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
diegoreymendez committed May 30, 2024
2 parents a025483 + 3db1af0 commit 6ce9707
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 6ce9707

Please sign in to comment.