summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaulius Dambravičius <dambravicius@gmail.com>2015-04-03 12:45:42 +0300
committerRomain Tartière <romain@blogreen.org>2017-09-01 08:33:53 +0200
commit81e192ecead751f1abe916af8e667a13c282047c (patch)
treedf35c0641f266854220d96a7bd41421af4765264
parent9bdfb364e0c670ead7f5f339f944a4d5d43927a2 (diff)
downloadipaddress-81e192ecead751f1abe916af8e667a13c282047c.tar.gz
Add IPv4 subnet validation
-rw-r--r--lib/ipaddress.rb48
-rw-r--r--test/ipaddress_test.rb21
2 files changed, 64 insertions, 5 deletions
diff --git a/lib/ipaddress.rb b/lib/ipaddress.rb
index 4f8c71f..88d80a2 100644
--- a/lib/ipaddress.rb
+++ b/lib/ipaddress.rb
@@ -102,21 +102,63 @@ module IPAddress
self.kind_of? IPAddress::IPv6
end
+
+ #
+ # Checks if the given string is either a valid IP, either a valid IPv4 subnet
+ #
+ # Example:
+ #
+ # IPAddress::valid? "10.0.0.0/24"
+ # #=> true
+ #
+ # IPAddress::valid? "2002::1"
+ # #=> true
+ #
+ # IPAddress::valid? "10.0.0.256"
+ # #=> false
+ #
+ # IPAddress::valid? "10.0.0.0/999"
+ # #=> false
+ #
+ def self.valid?(addr)
+ valid_ip?(addr) || valid_ipv4_subnet?(addr)
+ end
+
#
# Checks if the given string is a valid IP address,
# either IPv4 or IPv6
#
# Example:
#
- # IPAddress::valid? "2002::1"
+ # IPAddress::valid_ip? "2002::1"
# #=> true
#
- # IPAddress::valid? "10.0.0.256"
+ # IPAddress::valid_ip? "10.0.0.256"
# #=> false
#
- def self.valid?(addr)
+ def self.valid_ip?(addr)
valid_ipv4?(addr) || valid_ipv6?(addr)
end
+
+ #
+ # Checks if the given string is a valid IPv4 subnet
+ #
+ # Example:
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/24"
+ # #=> true
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/255.255.255.0"
+ # #=> true
+ #
+ # IPAdress::valid_ipv4_subnet? "10.0.0.0/64"
+ # #=> false
+ #
+ def self.valid_ipv4_subnet?(addr)
+ ip, netmask = addr.split("/")
+
+ valid_ipv4?(ip) && (!(netmask =~ /\A([12]?\d|3[0-2])\z/).nil? || valid_ipv4_netmask?(netmask))
+ end
#
# Checks if the given string is a valid IPv4 address
diff --git a/test/ipaddress_test.rb b/test/ipaddress_test.rb
index 862c889..44ecba0 100644
--- a/test/ipaddress_test.rb
+++ b/test/ipaddress_test.rb
@@ -59,6 +59,13 @@ class IPAddressTest < Minitest::Test
end
def test_module_method_valid?
+ assert_equal true, IPAddress::valid?("10.0.0.0/24")
+ assert_equal true, IPAddress::valid?("10.0.0.0/255.255.255.0")
+ assert_equal false, IPAddress::valid?("10.0.0.0/64")
+ assert_equal false, IPAddress::valid?("10.0.0.0/255.255.255.256")
+ end
+
+ def test_module_method_valid_ip?
assert_equal true, IPAddress::valid?("10.0.0.1")
assert_equal true, IPAddress::valid?("10.0.0.0")
assert_equal true, IPAddress::valid?("2002::1")
@@ -69,14 +76,24 @@ class IPAddressTest < Minitest::Test
assert_equal false, IPAddress::valid?("10.0")
assert_equal false, IPAddress::valid?("2002:::1")
assert_equal false, IPAddress::valid?("2002:516:2:200")
-
end
- def test_module_method_valid_ipv4_netmark?
+ def test_module_method_valid_ipv4_netmask?
assert_equal true, IPAddress::valid_ipv4_netmask?("255.255.255.0")
assert_equal false, IPAddress::valid_ipv4_netmask?("10.0.0.1")
end
+ def test_module_method_valid_ipv4_subnet?
+ assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/255.255.255.0")
+ assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/0")
+ assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/32")
+ assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/ABC")
+ assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.1")
+ assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/33")
+ assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.256/24")
+ assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/255.255.255.256")
+ end
+
end