From ba644415c7ff925e34bbabd2448e41c49924b2fa Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Fri, 24 Sep 2021 00:41:46 +0530 Subject: UI: When saving on-demand rules on a config, enable on-demand if active When a user saves on-demand rules on the configuration, set onDemandEnabled to true if the tunnel is active, and false if it isn't. Then deactivate the tunnel. Signed-off-by: Roopesh Chander --- Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift | 4 +++- Sources/WireGuardApp/Tunnel/TunnelsManager.swift | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift b/Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift index b92ada7..9ba605a 100644 --- a/Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift +++ b/Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift @@ -42,7 +42,9 @@ extension ActivateOnDemandOption { } } tunnelProviderManager.onDemandRules = rules - tunnelProviderManager.isOnDemandEnabled = false + let status = tunnelProviderManager.connection.status + let isActive = status == .connected || status == .connecting + tunnelProviderManager.isOnDemandEnabled = (rules != nil) && (tunnelProviderManager.isOnDemandEnabled || isActive) } init(from tunnelProviderManager: NETunnelProviderManager) { diff --git a/Sources/WireGuardApp/Tunnel/TunnelsManager.swift b/Sources/WireGuardApp/Tunnel/TunnelsManager.swift index 83c48c9..72aaf7c 100644 --- a/Sources/WireGuardApp/Tunnel/TunnelsManager.swift +++ b/Sources/WireGuardApp/Tunnel/TunnelsManager.swift @@ -231,8 +231,10 @@ class TunnelsManager { } tunnelProviderManager.isEnabled = true - let isActivatingOnDemand = !tunnelProviderManager.isOnDemandEnabled && onDemandOption != .off + let wasOnDemandEnabled = tunnelProviderManager.isOnDemandEnabled + let isIntroducingOnDemandRules = (tunnelProviderManager.onDemandRules ?? []).isEmpty && onDemandOption != .off onDemandOption.apply(on: tunnelProviderManager) + let isActivatingOnDemand = !wasOnDemandEnabled && tunnelProviderManager.isOnDemandEnabled tunnelProviderManager.saveToPreferences { [weak self] error in if let error = error { @@ -264,8 +266,11 @@ class TunnelsManager { if isActivatingOnDemand { // Reload tunnel after saving. // Without this, the tunnel stopes getting updates on the tunnel status from iOS. - tunnelProviderManager.loadFromPreferences { error in + tunnelProviderManager.loadFromPreferences { [weak self] error in tunnel.isActivateOnDemandEnabled = tunnelProviderManager.isOnDemandEnabled + if isIntroducingOnDemandRules { + self?.startDeactivation(of: tunnel) + } if let error = error { wg_log(.error, message: "Modify: Re-loading after saving configuration failed: \(error)") completionHandler(TunnelsManagerError.systemErrorOnModifyTunnel(systemError: error)) @@ -274,6 +279,9 @@ class TunnelsManager { } } } else { + if isIntroducingOnDemandRules { + self.startDeactivation(of: tunnel) + } completionHandler(nil) } } -- cgit v1.2.3-59-g8ed1b