aboutsummaryrefslogtreecommitdiffstats
path: root/Shared/Validators.swift
diff options
context:
space:
mode:
authorJeroen Leenarts <jeroen.leenarts@gmail.com>2018-09-30 21:39:00 +0200
committerJeroen Leenarts <jeroen.leenarts@gmail.com>2018-09-30 21:39:00 +0200
commit0c1520d6f8b84b8f9fb8191b3e6a0cd03966869f (patch)
tree036e3da3db55fd796657122ac0f432943d9ef883 /Shared/Validators.swift
parentFix build warning. (diff)
downloadwireguard-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.swift26
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()