summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Luong (Franco) <franco@definefunk.com>2017-09-01 14:19:55 -0400
committerGitHub <noreply@github.com>2017-09-01 14:19:55 -0400
commitf16c587af31c750a93ca40def9e7f2f7115fb1c7 (patch)
tree963fc445af6831ff78e94a723db31c893b705367
parent9bdfb364e0c670ead7f5f339f944a4d5d43927a2 (diff)
parentfa687f77fdb96bbbd13285f184c93fc15a464eb4 (diff)
downloadipaddress-f16c587af31c750a93ca40def9e7f2f7115fb1c7.tar.gz
Merge pull request #62 from paudam/ipv4-subnet-validation
Add IPv4 subnet validation
-rw-r--r--lib/ipaddress.rb74
-rw-r--r--test/ipaddress_test.rb31
2 files changed, 99 insertions, 6 deletions
diff --git a/lib/ipaddress.rb b/lib/ipaddress.rb
index 4f8c71f..99591d7 100644
--- a/lib/ipaddress.rb
+++ b/lib/ipaddress.rb
@@ -102,22 +102,88 @@ 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) || valid_ipv6_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 IPv6 subnet
+ #
+ # Example:
+ #
+ # IPAdress::valid_ipv6_subnet? "::/0"
+ # #=> true
+ #
+ # IPAdress::valid_ipv6_subnet? "dead:beef:cafe:babe::/64"
+ # #=> true
+ #
+ # IPAdress::valid_ipv6_subnet? "2001::1/129"
+ # #=> false
+ #
+ def self.valid_ipv6_subnet?(addr)
+ ip, netmask = addr.split("/")
+
+ netmask = Integer(netmask, 10)
+
+ valid_ipv6?(ip) && netmask >= 0 && netmask <= 128
+ rescue ArgumentError
+ false
+ 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..d5bdf60 100644
--- a/test/ipaddress_test.rb
+++ b/test/ipaddress_test.rb
@@ -59,6 +59,17 @@ 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")
+ assert_equal true, IPAddress::valid?("::/0")
+ assert_equal true, IPAddress::valid?("2002::1/128")
+ assert_equal true, IPAddress::valid?("dead:beef:cafe:babe::/64")
+ assert_equal false, IPAddress::valid?("2002::1/129")
+ 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 +80,30 @@ 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
+
+ def test_module_method_valid_ipv6_subnet?
+ assert_equal true, IPAddress::valid_ipv6_subnet?("::/0")
+ assert_equal true, IPAddress::valid_ipv6_subnet?("2002::1/128")
+ assert_equal true, IPAddress::valid_ipv6_subnet?("dead:beef:cafe:babe::/64")
+ assert_equal false, IPAddress::valid_ipv6_subnet?("2002::1/129")
+ end
end