]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
VPN: A tunnel may be already active on app startup
authorRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 12:39:38 +0000 (18:09 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 28 Oct 2018 12:39:38 +0000 (18:09 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/VPN/TunnelsManager.swift

index 37b4b904ceaff1e65deb299baf2bcbae83b371de..d320e1df0e221558c10f0c86d742c35a49c21a42 100644 (file)
@@ -34,10 +34,18 @@ class TunnelsManager {
     init(tunnelProviders: [NETunnelProviderManager]) {
         var tunnels = tunnelProviders.map { TunnelContainer(tunnel: $0, index: 0) }
         tunnels.sort { $0.name < $1.name }
+        var currentTunnel: TunnelContainer? = nil
         for i in 0 ..< tunnels.count {
-            tunnels[i].index = i
+            let tunnel = tunnels[i]
+            tunnel.index = i
+            if (tunnel.status != .inactive) {
+                currentTunnel = tunnel
+            }
         }
         self.tunnels = tunnels
+        if let currentTunnel = currentTunnel {
+            setCurrentTunnel(tunnel: currentTunnel)
+        }
     }
 
     static func create(completionHandler: @escaping (TunnelsManager?) -> Void) {
@@ -169,14 +177,7 @@ class TunnelsManager {
             return
         }
         tunnel.startActivation(completionHandler: completionHandler)
-        currentTunnel = tunnel
-        currentTunnelStatusObservationToken = tunnel.observe(\.status) { [weak self] (tunnel, change) in
-            guard let s = self else { return }
-            if (tunnel.status == .inactive) {
-                s.currentTunnel = nil
-                s.currentTunnelStatusObservationToken = nil
-            }
-        }
+        setCurrentTunnel(tunnel: tunnel)
     }
 
     func startDeactivation(of tunnel: TunnelContainer, completionHandler: @escaping (Error?) -> Void) {
@@ -188,6 +189,17 @@ class TunnelsManager {
 
         tunnel.startDeactivation()
     }
+
+    private func setCurrentTunnel(tunnel: TunnelContainer) {
+        currentTunnel = tunnel
+        currentTunnelStatusObservationToken = tunnel.observe(\.status) { [weak self] (tunnel, change) in
+            guard let s = self else { return }
+            if (tunnel.status == .inactive) {
+                s.currentTunnel = nil
+                s.currentTunnelStatusObservationToken = nil
+            }
+        }
+    }
 }
 
 extension NETunnelProviderProtocol {