diff options
author | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-30 21:39:00 +0200 |
---|---|---|
committer | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-09-30 21:39:00 +0200 |
commit | 0c1520d6f8b84b8f9fb8191b3e6a0cd03966869f (patch) | |
tree | 036e3da3db55fd796657122ac0f432943d9ef883 /Shared/Validators.swift | |
parent | Fix build warning. (diff) | |
download | wireguard-apple-0c1520d6f8b84b8f9fb8191b3e6a0cd03966869f.tar.xz wireguard-apple-0c1520d6f8b84b8f9fb8191b3e6a0cd03966869f.zip |
Convert DNS names to IP address.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'Shared/Validators.swift')
-rw-r--r-- | Shared/Validators.swift | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/Shared/Validators.swift b/Shared/Validators.swift index 4eb19cb..21758fe 100644 --- a/Shared/Validators.swift +++ b/Shared/Validators.swift @@ -31,12 +31,12 @@ struct Endpoint { var addressType: AddressType init?(endpointString: String, needsPort: Bool = true) throws { - var ipString: String + var hostString: String if needsPort { guard let range = endpointString.range(of: ":", options: .backwards, range: nil, locale: nil) else { throw EndpointValidationError.noIpAndPort(endpointString) } - ipString = String(endpointString[..<range.lowerBound]) + hostString = String(endpointString[..<range.lowerBound]) let portString = endpointString[range.upperBound...] @@ -45,10 +45,12 @@ struct Endpoint { } self.port = port } else { - ipString = endpointString + hostString = endpointString } - ipString = ipString.replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "") + hostString = hostString.replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "") + + let ipString = convertToipAddress(from: hostString) ipAddress = String(ipString) let addressType = validateIpAddress(ipToValidate: ipAddress) @@ -59,6 +61,22 @@ struct Endpoint { } } +private func convertToipAddress(from hostname: String) -> String { + let host = CFHostCreateWithName(nil, hostname as CFString).takeRetainedValue() + CFHostStartInfoResolution(host, .addresses, nil) + var success: DarwinBoolean = false + if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?, + let theAddress = addresses.firstObject as? NSData { + var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) + if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length), + &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { + let numAddress = String(cString: hostname) + return numAddress + } + } + return hostname +} + func validateIpAddress(ipToValidate: String) -> AddressType { var sin = sockaddr_in() |