diff options
author | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-10-03 21:34:51 +0200 |
---|---|---|
committer | Jeroen Leenarts <jeroen.leenarts@gmail.com> | 2018-10-03 21:34:51 +0200 |
commit | 6346bad069be47f1d25c04af74ce0cd3b2c3457d (patch) | |
tree | 5c63f1aa5012dbb710e2caf020277e85042bd969 /Shared/Validators.swift | |
parent | Disable auto corrects and related helpers on UITextfields. (diff) | |
download | wireguard-apple-6346bad069be47f1d25c04af74ce0cd3b2c3457d.tar.xz wireguard-apple-6346bad069be47f1d25c04af74ce0cd3b2c3457d.zip |
Better handling of CIDR values.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'Shared/Validators.swift')
-rw-r--r-- | Shared/Validators.swift | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/Shared/Validators.swift b/Shared/Validators.swift index a73f329..cf20326 100644 --- a/Shared/Validators.swift +++ b/Shared/Validators.swift @@ -122,25 +122,42 @@ struct CIDRAddress { var addressType: AddressType init?(stringRepresentation: String) throws { - guard let range = stringRepresentation.range(of: "/", options: .backwards, range: nil, locale: nil) else { - throw CIDRAddressValidationError.noIpAndSubnet(stringRepresentation) - } - - let ipString = stringRepresentation[..<range.lowerBound].replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "") - let subnetString = stringRepresentation[range.upperBound...] - - guard let subnet = Int32(subnetString) else { - throw CIDRAddressValidationError.invalidSubnet(String(subnetString)) + let subnetString: String.SubSequence + if let range = stringRepresentation.range(of: "/", options: .backwards, range: nil, locale: nil) { + let ipString = stringRepresentation[..<range.lowerBound].replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "") + ipAddress = String(ipString) + subnetString = stringRepresentation[range.upperBound...] + } else { + let ipString = stringRepresentation + ipAddress = String(ipString) + subnetString = "" } - ipAddress = String(ipString) let addressType = validateIpAddress(ipToValidate: ipAddress) guard addressType == .IPv4 || addressType == .IPv6 else { throw CIDRAddressValidationError.invalidIP(ipAddress) } self.addressType = addressType - self.subnet = subnet + if let subnet = Int32(subnetString) { + switch addressType { + case .IPv6: + self.subnet = subnet > 128 ? 128 : subnet + case .IPv4: + self.subnet = subnet > 32 ? 32 : subnet + case .other: + self.subnet = subnet + } + } else { + switch addressType { + case .IPv4: + subnet = 32 + case .IPv6: + subnet = 128 + case .other: + throw CIDRAddressValidationError.invalidSubnet(String(subnetString)) + } + } } var subnetString: String { @@ -156,4 +173,8 @@ struct CIDRAddress { return "\(first).\(second).\(third).\(fourth)" } + + var stringRepresentation: String { + return "\(ipAddress)/\(subnet)" + } } |