aboutsummaryrefslogtreecommitdiffstats
path: root/Shared/Validators.swift
diff options
context:
space:
mode:
authorJeroen Leenarts <jeroen.leenarts@gmail.com>2018-10-03 21:34:51 +0200
committerJeroen Leenarts <jeroen.leenarts@gmail.com>2018-10-03 21:34:51 +0200
commit6346bad069be47f1d25c04af74ce0cd3b2c3457d (patch)
tree5c63f1aa5012dbb710e2caf020277e85042bd969 /Shared/Validators.swift
parentDisable auto corrects and related helpers on UITextfields. (diff)
downloadwireguard-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.swift43
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)"
+ }
}