]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
global: support DNS search domains
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 15 Dec 2020 12:49:21 +0000 (13:49 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 15 Dec 2020 14:54:12 +0000 (15:54 +0100)
This has been supported by Windows and Linux for quite some time. Add
support here for iOS and macOS.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Sources/Shared/Model/TunnelConfiguration+WgQuickConfig.swift
Sources/WireGuardApp/Tunnel/TunnelConfiguration+UapiConfig.swift
Sources/WireGuardApp/UI/TunnelViewModel.swift
Sources/WireGuardApp/UI/macOS/View/highlighter.c
Sources/WireGuardKit/InterfaceConfiguration.swift
Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift

index eb60a520b63d514c75b9b711a446cabe0f7f0f40..0cc180331001e64c21811ea840b70305be49aae4 100644 (file)
@@ -133,8 +133,10 @@ extension TunnelConfiguration {
             let addressString = interface.addresses.map { $0.stringRepresentation }.joined(separator: ", ")
             output.append("Address = \(addressString)\n")
         }
-        if !interface.dns.isEmpty {
-            let dnsString = interface.dns.map { $0.stringRepresentation }.joined(separator: ", ")
+        if !interface.dns.isEmpty || !interface.dnsSearch.isEmpty {
+            var dnsLine = interface.dns.map { $0.stringRepresentation }
+            dnsLine.append(contentsOf: interface.dnsSearch)
+            let dnsString = dnsLine.joined(separator: ", ")
             output.append("DNS = \(dnsString)\n")
         }
         if let mtu = interface.mtu {
@@ -188,13 +190,16 @@ extension TunnelConfiguration {
         }
         if let dnsString = attributes["dns"] {
             var dnsServers = [DNSServer]()
+            var dnsSearch = [String]()
             for dnsServerString in dnsString.splitToArray(trimmingCharacters: .whitespacesAndNewlines) {
-                guard let dnsServer = DNSServer(from: dnsServerString) else {
-                    throw ParseError.interfaceHasInvalidDNS(dnsServerString)
+                if let dnsServer = DNSServer(from: dnsServerString) {
+                    dnsServers.append(dnsServer)
+                } else {
+                    dnsSearch.append(dnsServerString)
                 }
-                dnsServers.append(dnsServer)
             }
             interface.dns = dnsServers
+            interface.dnsSearch = dnsSearch
         }
         if let mtuString = attributes["mtu"] {
             guard let mtu = UInt16(mtuString) else {
index 1874b053f3ded6e1c14c280fe312101fda77016e..e8aa8a994cbaccb12d3bdda1bee026f9a477dfe1 100644 (file)
@@ -74,6 +74,7 @@ extension TunnelConfiguration {
 
         interfaceConfiguration?.addresses = base?.interface.addresses ?? []
         interfaceConfiguration?.dns = base?.interface.dns ?? []
+        interfaceConfiguration?.dnsSearch = base?.interface.dnsSearch ?? []
         interfaceConfiguration?.mtu = base?.interface.mtu
 
         if let interfaceConfiguration = interfaceConfiguration {
index 60aa5c355c50b738d2f12b30ec545b63a6e9e534..6d0471e173550f6916955e87625ccc486174b27a 100644 (file)
@@ -139,8 +139,10 @@ class TunnelViewModel {
             if let mtu = config.mtu {
                 scratchpad[.mtu] = String(mtu)
             }
-            if !config.dns.isEmpty {
-                scratchpad[.dns] = config.dns.map { $0.stringRepresentation }.joined(separator: ", ")
+            if !config.dns.isEmpty || !config.dnsSearch.isEmpty {
+                var dns = config.dns.map { $0.stringRepresentation }
+                dns.append(contentsOf: config.dnsSearch)
+                scratchpad[.dns] = dns.joined(separator: ", ")
             }
             return scratchpad
         }
@@ -194,15 +196,16 @@ class TunnelViewModel {
             }
             if let dnsString = scratchpad[.dns] {
                 var dnsServers = [DNSServer]()
+                var dnsSearch = [String]()
                 for dnsServerString in dnsString.splitToArray(trimmingCharacters: .whitespacesAndNewlines) {
                     if let dnsServer = DNSServer(from: dnsServerString) {
                         dnsServers.append(dnsServer)
                     } else {
-                        fieldsWithError.insert(.dns)
-                        errorMessages.append(tr("alertInvalidInterfaceMessageDNSInvalid"))
+                        dnsSearch.append(dnsServerString)
                     }
                 }
                 config.dns = dnsServers
+                config.dnsSearch = dnsSearch
             }
 
             guard errorMessages.isEmpty else { return .error(errorMessages.first!) }
index e0d4e04e9abde062eab2b839168f22704a74fa9d..d89feda1e324d548bf4b424a6ffa1e7a7dabc90d 100644 (file)
@@ -337,11 +337,6 @@ static bool is_valid_network(string_span_t s)
        return is_valid_ipv4(s) || is_valid_ipv6(s);
 }
 
-static bool is_valid_dns(string_span_t s)
-{
-       return is_valid_ipv4(s) || is_valid_ipv6(s);
-}
-
 enum field {
        InterfaceSection,
        PrivateKey,
@@ -451,7 +446,12 @@ static void highlight_multivalue_value(struct highlight_span_array *ret, const s
 {
        switch (section) {
        case DNS:
-               append_highlight_span(ret, parent.s, s, is_valid_dns(s) ? HighlightIP : HighlightError);
+               if (is_valid_ipv4(s) || is_valid_ipv6(s))
+                       append_highlight_span(ret, parent.s, s, HighlightIP);
+               else if (is_valid_hostname(s))
+                       append_highlight_span(ret, parent.s, s, HighlightHost);
+               else
+                       append_highlight_span(ret, parent.s, s, HighlightError);
                break;
        case Address:
        case AllowedIPs: {
index 2d104d2a7981f45e0bc917cedf8a9d3af5d9c9bd..02bed98283325084ba82300af6b26c40759b30b9 100644 (file)
@@ -10,6 +10,7 @@ public struct InterfaceConfiguration {
     public var listenPort: UInt16?
     public var mtu: UInt16?
     public var dns = [DNSServer]()
+    public var dnsSearch = [String]()
 
     public init(privateKey: PrivateKey) {
         self.privateKey = privateKey
@@ -25,6 +26,7 @@ extension InterfaceConfiguration: Equatable {
             lhsAddresses == rhsAddresses &&
             lhs.listenPort == rhs.listenPort &&
             lhs.mtu == rhs.mtu &&
-            lhs.dns == rhs.dns
+            lhs.dns == rhs.dns &&
+            lhs.dnsSearch == rhs.dnsSearch
     }
 }
index 0ddc1b7da3864f0f4d7f0faf803285f72c12e709..034ecaf66777cfe6b99f8e269792c4d6e2f2678c 100644 (file)
@@ -85,6 +85,7 @@ class PacketTunnelSettingsGenerator {
 
         let dnsServerStrings = tunnelConfiguration.interface.dns.map { $0.stringRepresentation }
         let dnsSettings = NEDNSSettings(servers: dnsServerStrings)
+        dnsSettings.searchDomains = tunnelConfiguration.interface.dnsSearch
         dnsSettings.matchDomains = [""] // All DNS queries must first go through the tunnel's DNS
         networkSettings.dnsSettings = dnsSettings