]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
TunnelsManager: Fix comparing tunnels with tunnelProviders in reload()
authorRoopesh Chander <roop@roopc.net>
Fri, 5 Apr 2019 08:13:05 +0000 (13:43 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 5 Apr 2019 08:13:08 +0000 (13:43 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Tunnel/TunnelsManager.swift

index 19aeaef4aad80cbcdfa107a93f2ba279fc5a5e3b..b1def4cf752f8ab08d535d53ef16f1f535185a5e 100644 (file)
@@ -78,14 +78,14 @@ class TunnelsManager {
             let loadedTunnelProviders = managers ?? []
 
             for (index, currentTunnel) in self.tunnels.enumerated().reversed() {
-                if !loadedTunnelProviders.contains(where: { $0.tunnelConfiguration == currentTunnel.tunnelConfiguration }) {
+                if !loadedTunnelProviders.contains(where: { $0.isEquivalentTo(currentTunnel) }) {
                     // Tunnel was deleted outside the app
                     self.tunnels.remove(at: index)
                     self.tunnelsListDelegate?.tunnelRemoved(at: index, tunnel: currentTunnel)
                 }
             }
             for loadedTunnelProvider in loadedTunnelProviders {
-                if let matchingTunnel = self.tunnels.first(where: { $0.tunnelConfiguration == loadedTunnelProvider.tunnelConfiguration }) {
+                if let matchingTunnel = self.tunnels.first(where: { loadedTunnelProvider.isEquivalentTo($0) }) {
                     matchingTunnel.tunnelProvider = loadedTunnelProvider
                     matchingTunnel.refreshStatus()
                 } else {
@@ -608,4 +608,15 @@ extension NETunnelProviderManager {
         localizedDescription = tunnelConfiguration.name
         objc_setAssociatedObject(self, &NETunnelProviderManager.cachedConfigKey, tunnelConfiguration, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
+
+    func isEquivalentTo(_ tunnel: TunnelContainer) -> Bool {
+        switch (isTunnelConfigurationAvailableInKeychain, tunnel.isTunnelConfigurationAvailableInKeychain) {
+        case (true, true):
+            return tunnelConfiguration == tunnel.tunnelConfiguration
+        case (false, false):
+            return localizedDescription == tunnel.name
+        default:
+            return false
+        }
+    }
 }