From 645f65ccd0608a1c15e8d513c148811af5414dd0 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Fri, 25 Oct 2019 17:14:59 +0200 Subject: [PATCH 1/4] Adjust Configuration.searchDomain to searchDomains XXX: "breaks" search domains in existing VPN profiles. Reinstall to fix. --- .../OpenVPNTunnelProvider+Configuration.swift | 14 +++++------ .../AppExtension/OpenVPNTunnelProvider.swift | 12 +++++----- .../Protocols/OpenVPN/Configuration.swift | 24 ++++++++++++++----- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider+Configuration.swift b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider+Configuration.swift index b06f921..dc1f589 100644 --- a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider+Configuration.swift +++ b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider+Configuration.swift @@ -177,7 +177,7 @@ extension OpenVPNTunnelProvider { static let dnsServers = "DNSServers" - static let searchDomain = "SearchDomain" + static let searchDomains = "SearchDomains" static let httpProxy = "HTTPProxy" @@ -519,8 +519,8 @@ private extension OpenVPN.Configuration { if let dnsServers = providerConfiguration[S.dnsServers] as? [String] { builder.dnsServers = dnsServers } - if let searchDomain = providerConfiguration[S.searchDomain] as? String { - builder.searchDomain = searchDomain + if let searchDomains = providerConfiguration[S.searchDomains] as? [String] { + builder.searchDomains = searchDomains } if let proxyString = providerConfiguration[S.httpProxy] as? String { guard let proxy = Proxy(rawValue: proxyString) else { @@ -599,8 +599,8 @@ private extension OpenVPN.Configuration { if let dnsServers = dnsServers { dict[S.dnsServers] = dnsServers } - if let searchDomain = searchDomain { - dict[S.searchDomain] = searchDomain + if let searchDomains = searchDomains { + dict[S.searchDomains] = searchDomains } if let httpProxy = httpProxy { dict[S.httpProxy] = httpProxy.rawValue @@ -680,8 +680,8 @@ private extension OpenVPN.Configuration { } else { log.info("\tDNS: not configured") } - if let searchDomain = searchDomain, !searchDomain.isEmpty { - log.info("\tSearch domain: \(searchDomain.maskedDescription)") + if let searchDomains = searchDomains, !searchDomains.isEmpty { + log.info("\tSearch domains: \(searchDomains.maskedDescription)") } if let httpProxy = httpProxy { log.info("\tHTTP proxy: \(httpProxy.maskedDescription)") diff --git a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift index fb83c2b..353c87e 100644 --- a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift +++ b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift @@ -506,10 +506,10 @@ extension OpenVPNTunnelProvider: OpenVPNSessionDelegate { } else { log.info("\tDNS: not configured") } - if let searchDomain = options.searchDomain, !searchDomain.isEmpty { - log.info("\tDomain: \(searchDomain.maskedDescription)") + if let searchDomains = options.searchDomains, !searchDomains.isEmpty { + log.info("\tSearch domains: \(searchDomains.maskedDescription)") } else { - log.info("\tDomain: not configured") + log.info("\tSearch domains: not configured") } if options.httpProxy != nil || options.httpsProxy != nil || options.proxyAutoConfigurationURL != nil { @@ -652,9 +652,9 @@ extension OpenVPNTunnelProvider: OpenVPNSessionDelegate { if !isGateway { dnsSettings.matchDomains = [""] } - if let searchDomain = cfg.sessionConfiguration.searchDomain ?? options.searchDomain { - dnsSettings.domainName = searchDomain - dnsSettings.searchDomains = [searchDomain] + if let searchDomains = cfg.sessionConfiguration.searchDomains ?? options.searchDomains { + dnsSettings.domainName = searchDomains.first + dnsSettings.searchDomains = searchDomains if !isGateway { dnsSettings.matchDomains = dnsSettings.searchDomains } diff --git a/TunnelKit/Sources/Protocols/OpenVPN/Configuration.swift b/TunnelKit/Sources/Protocols/OpenVPN/Configuration.swift index 72923d4..cf758f8 100644 --- a/TunnelKit/Sources/Protocols/OpenVPN/Configuration.swift +++ b/TunnelKit/Sources/Protocols/OpenVPN/Configuration.swift @@ -245,7 +245,19 @@ extension OpenVPN { public var dnsServers: [String]? /// The search domain. - public var searchDomain: String? + @available(*, deprecated, message: "Use searchDomains instead") + public var searchDomain: String? { + didSet { + guard let searchDomain = searchDomain else { + searchDomains = nil + return + } + searchDomains = [searchDomain] + } + } + + /// The search domains. The first one is interpreted as the main domain name. + public var searchDomains: [String]? /// The Proxy Auto-Configuration (PAC) url. public var proxyAutoConfigurationURL: URL? @@ -295,7 +307,7 @@ extension OpenVPN { ipv4: ipv4, ipv6: ipv6, dnsServers: dnsServers, - searchDomain: searchDomain, + searchDomains: searchDomains, httpProxy: httpProxy, httpsProxy: httpsProxy, proxyAutoConfigurationURL: proxyAutoConfigurationURL, @@ -391,9 +403,9 @@ extension OpenVPN { /// - Seealso: `ConfigurationBuilder.dnsServers` public let dnsServers: [String]? - /// - Seealso: `ConfigurationBuilder.searchDomain` - public let searchDomain: String? - + /// - Seealso: `ConfigurationBuilder.searchDomains` + public let searchDomains: [String]? + /// - Seealso: `ConfigurationBuilder.httpProxy` public let httpProxy: Proxy? @@ -461,7 +473,7 @@ extension OpenVPN.Configuration { builder.ipv4 = ipv4 builder.ipv6 = ipv6 builder.dnsServers = dnsServers - builder.searchDomain = searchDomain + builder.searchDomains = searchDomains builder.httpProxy = httpProxy builder.httpsProxy = httpsProxy builder.proxyAutoConfigurationURL = proxyAutoConfigurationURL From 4e77f5b6b3e41023b6ad872af4a43a4406241030 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Fri, 25 Oct 2019 17:21:34 +0200 Subject: [PATCH 2/4] Parse multiple "dhcp-option DOMAIN" lines --- .../Sources/Protocols/OpenVPN/ConfigurationParser.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/TunnelKit/Sources/Protocols/OpenVPN/ConfigurationParser.swift b/TunnelKit/Sources/Protocols/OpenVPN/ConfigurationParser.swift index 184f752..68481d3 100644 --- a/TunnelKit/Sources/Protocols/OpenVPN/ConfigurationParser.swift +++ b/TunnelKit/Sources/Protocols/OpenVPN/ConfigurationParser.swift @@ -225,7 +225,7 @@ extension OpenVPN { var optRoutes4: [(String, String, String?)] = [] // address, netmask, gateway var optRoutes6: [(String, UInt8, String?)] = [] // destination, prefix, gateway var optDNSServers: [String]? - var optSearchDomain: String? + var optSearchDomains: [String]? var optHTTPProxy: Proxy? var optHTTPSProxy: Proxy? var optProxyAutoConfigurationURL: URL? @@ -531,7 +531,10 @@ extension OpenVPN { guard $0.count == 2 else { return } - optSearchDomain = $0[1] + if optSearchDomains == nil { + optSearchDomains = [] + } + optSearchDomains?.append($0[1]) } Regex.proxy.enumerateArguments(in: line) { if $0.count == 2 { @@ -738,7 +741,7 @@ extension OpenVPN { } sessionBuilder.dnsServers = optDNSServers - sessionBuilder.searchDomain = optSearchDomain + sessionBuilder.searchDomains = optSearchDomains sessionBuilder.httpProxy = optHTTPProxy sessionBuilder.httpsProxy = optHTTPSProxy sessionBuilder.proxyAutoConfigurationURL = optProxyAutoConfigurationURL From 3a38b0da15282214dbd676dad5691256fc6eae74 Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Fri, 25 Oct 2019 19:08:34 +0200 Subject: [PATCH 3/4] Log effective search domains --- .../Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift index 353c87e..de9666b 100644 --- a/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift +++ b/TunnelKit/Sources/Protocols/OpenVPN/AppExtension/OpenVPNTunnelProvider.swift @@ -653,6 +653,7 @@ extension OpenVPNTunnelProvider: OpenVPNSessionDelegate { dnsSettings.matchDomains = [""] } if let searchDomains = cfg.sessionConfiguration.searchDomains ?? options.searchDomains { + log.info("DNS: Using search domains \(searchDomains.maskedDescription)") dnsSettings.domainName = searchDomains.first dnsSettings.searchDomains = searchDomains if !isGateway { From 4d930d3562a6d20fb24119771b2314808bff391f Mon Sep 17 00:00:00 2001 From: Davide De Rosa Date: Fri, 25 Oct 2019 17:53:54 +0200 Subject: [PATCH 4/4] Update CHANGELOG Fixes #127 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d719e4..204a9a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow keep-alive timeout to be configured by the server or client (Robert Patchett). [#122](https://github.com/passepartoutvpn/tunnelkit/pull/122) - Support for proxy autoconfiguration URL (ThinkChaos). [#125](https://github.com/passepartoutvpn/tunnelkit/pull/125) +- Support multiple DNS search domains. [#127](https://github.com/passepartoutvpn/tunnelkit/issues/127) ### Fixed