]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
VPN: Fix DNS resolution API
authorRoopesh Chander <roop@roopc.net>
Fri, 26 Oct 2018 23:11:05 +0000 (04:41 +0530)
committerRoopesh Chander <roop@roopc.net>
Sat, 27 Oct 2018 13:37:16 +0000 (19:07 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/VPN/DNSResolver.swift
WireGuard/WireGuard/VPN/TunnelsManager.swift

index 89b1a838377501d2cdb38b3d51fa9733da38d039..e0278520157b3ca84ffce9e4381129445e50b221 100644 (file)
@@ -5,19 +5,34 @@ import Network
 import Foundation
 
 class DNSResolver {
-    let endpoints: [Endpoint]
+    let endpoints: [Endpoint?]
 
-    init(endpoints: [Endpoint]) {
+    init(endpoints: [Endpoint?]) {
         self.endpoints = endpoints
     }
 
-    func resolve(completionHandler: @escaping ([Endpoint?]) -> Void) {
+    func resolve(completionHandler: @escaping ([Endpoint?]?) -> Void) {
         let endpoints = self.endpoints
         DispatchQueue.global(qos: .userInitiated).async {
-            var resolvedEndpoints = Array<Endpoint?>(repeating: nil, count: endpoints.count)
-            for (i, endpoint) in endpoints.enumerated() {
-                let resolvedEndpoint = DNSResolver.resolveSync(endpoint: endpoint)
-                resolvedEndpoints[i] = resolvedEndpoint
+            var resolvedEndpoints: [Endpoint?] = []
+            var isError = false
+            for endpoint in endpoints {
+                if let endpoint = endpoint {
+                    if let resolvedEndpoint = DNSResolver.resolveSync(endpoint: endpoint) {
+                        resolvedEndpoints.append(resolvedEndpoint)
+                    } else {
+                        isError = true
+                        break
+                    }
+                } else {
+                    resolvedEndpoints.append(nil)
+                }
+            }
+            if (isError) {
+                DispatchQueue.main.async {
+                    completionHandler(nil)
+                }
+                return
             }
             DispatchQueue.main.async {
                 completionHandler(resolvedEndpoints)
index 65e83736be160b8a6edb8b59ad3e63f95e4e4d2d..039862d7e76e118198fc05ea0f4b9f2ab8827cac 100644 (file)
@@ -256,13 +256,14 @@ class TunnelContainer: NSObject {
     fileprivate func activate(completionHandler: @escaping (Bool) -> Void) {
         assert(status == .inactive)
         guard let tunnelConfiguration = tunnelConfiguration() else { fatalError() }
-        let endpoints = tunnelConfiguration.peers.compactMap { $0.endpoint }
+        let endpoints = tunnelConfiguration.peers.map { $0.endpoint }
         let dnsResolver = DNSResolver(endpoints: endpoints)
         assert(self.dnsResolver == nil)
         self.dnsResolver = dnsResolver
         status = .resolvingEndpointDomains
         dnsResolver.resolve { [weak self] endpoints in
-            guard (!endpoints.contains { $0 == nil }) else {
+            guard let endpoints = endpoints else {
+                // TODO: Show error message
                 completionHandler(false)
                 return
             }