Mentions légales du service

Skip to content
Snippets Groups Projects

IPv4 and IPv6 validation for addresses and networks

Merged JONGLEZ Baptiste requested to merge schema_ip_validation into master
Files
4
@@ -26,22 +26,88 @@ class HashValidator::Validator::LinecardPortValidator < HashValidator::Validator
end
end
class HashValidator::Validator::IpAddressValidator < HashValidator::Validator::Base
class HashValidator::Validator::Ipv4AddressValidator < HashValidator::Validator::Base
def initialize
super('ip_address')
super('ipv4_address')
end
def validate(key, values, _validations, errors)
if values.is_a?(String)
unless (values =~ Resolv::IPv4::Regex || values =~ Resolv::IPv6::Regex)
errors[key] = "Invalid ip address format #{values}"
unless values =~ Resolv::IPv4::Regex
errors[key] = "Invalid IPv4 address format #{values}"
end
else
errors[key] = "Ip address should be a String"
errors[key] = "IPv4 address should be a String"
end
end
end
class HashValidator::Validator::Ipv4NetworkValidator < HashValidator::Validator::Base
def initialize
super('ipv4_network')
end
def validate(key, values, _validations, errors)
if not values.is_a?(String)
errors[key] = "IPv4 network should be a String"
elsif not values.include?('/')
errors[key] = "IPv4 network should contain a '/' character"
else
address = values.split("/")[0]
prefix_length = Integer(values.split("/")[1]) rescue nil
if (not prefix_length.is_a?(Integer)) || prefix_length < 0 || prefix_length > 32
errors[key] = "Invalid IPv4 prefix length for network #{values}"
elsif not address =~ Resolv::IPv4::Regex
errors[key] = "Invalid IPv4 network format #{values}"
end
end
end
end
class HashValidator::Validator::Ipv6AddressValidator < HashValidator::Validator::Base
def initialize
super('ipv6_address')
end
def validate(key, values, _validations, errors)
if values.is_a?(String)
unless values =~ Resolv::IPv6::Regex
errors[key] = "Invalid IPv6 address format #{values}"
end
else
errors[key] = "IPv6 address should be a String"
end
end
end
class HashValidator::Validator::Ipv6NetworkValidator < HashValidator::Validator::Base
def initialize
super('ipv6_network')
end
def validate(key, values, _validations, errors)
if not values.is_a?(String)
errors[key] = "IPv6 network should be a String"
elsif not values.include?('/')
errors[key] = "IPv6 network should contain a '/' character"
else
address = values.split("/")[0]
prefix_length = Integer(values.split("/")[1]) rescue nil
if (not prefix_length.is_a?(Integer)) || prefix_length < 0 || prefix_length > 128
errors[key] = "Invalid IPv6 prefix length for network #{values}"
elsif not address =~ Resolv::IPv6::Regex
errors[key] = "Invalid IPv6 network format #{values}"
end
end
end
end
HashValidator.append_validator(HashValidator::Validator::LinecardPortValidator.new)
HashValidator.append_validator(HashValidator::Validator::IpAddressValidator.new)
HashValidator.append_validator(HashValidator::Validator::Ipv4AddressValidator.new)
HashValidator.append_validator(HashValidator::Validator::Ipv4NetworkValidator.new)
HashValidator.append_validator(HashValidator::Validator::Ipv6AddressValidator.new)
HashValidator.append_validator(HashValidator::Validator::Ipv6NetworkValidator.new)
Loading