]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
UI: When saving on-demand rules on a config, enable on-demand if active
authorRoopesh Chander <roop@roopc.net>
Thu, 23 Sep 2021 19:11:46 +0000 (00:41 +0530)
committerRoopesh Chander <roop@roopc.net>
Thu, 23 Sep 2021 19:31:10 +0000 (01:01 +0530)
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>
Sources/WireGuardApp/Tunnel/ActivateOnDemandOption.swift
Sources/WireGuardApp/Tunnel/TunnelsManager.swift

index b92ada7840425f25e44f165095c208baacc32a80..9ba605a12a52a0b89db007f334918fe39e95f128 100644 (file)
@@ -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) {
index 83c48c9bd2bf726b651d19f7d90daf270ea4a7b3..72aaf7cbb16eb3ac57f247b3682f01f101b7de80 100644 (file)
@@ -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)
             }
         }