aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2021-09-24 00:41:46 +0530
committerRoopesh Chander <roop@roopc.net>2021-09-24 01:01:10 +0530
commitba644415c7ff925e34bbabd2448e41c49924b2fa (patch)
tree9392f9456b8cbed85aca96c96bbfd441ad065d28
parentApp: version bump (diff)
downloadwireguard-apple-ba644415c7ff925e34bbabd2448e41c49924b2fa.tar.xz
wireguard-apple-ba644415c7ff925e34bbabd2448e41c49924b2fa.zip
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 <roop@roopc.net>
-rw-r--r--Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift4
-rw-r--r--Sources/WireGuardApp/Tunnel/TunnelsManager.swift12
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)
}
}