[tor-commits] [stem/master] Utility for validating IPv6 addresses
atagar at torproject.org
atagar at torproject.org
Sun Apr 15 02:50:21 UTC 2012
commit dbd6a80ffc65f8d77d6d798b49f8c899e5ef09e9
Author: Damian Johnson <atagar at torproject.org>
Date: Wed Apr 11 20:50:08 2012 -0700
Utility for validating IPv6 addresses
Function and testing to check a string is a valid ipv6 address.
---
stem/util/connection.py | 40 ++++++++++++++++++++++++++++++++++++----
test/unit/util/connection.py | 28 ++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/stem/util/connection.py b/stem/util/connection.py
index 9c6ba8b..93030fc 100644
--- a/stem/util/connection.py
+++ b/stem/util/connection.py
@@ -6,22 +6,24 @@ https://gitweb.torproject.org/arm.git/blob/HEAD:/src/util/connections.py
but for now just moving the parts we need.
"""
-def is_valid_ip_address(entry):
+import re
+
+def is_valid_ip_address(address):
"""
Checks if a string is a valid IPv4 address.
Arguments:
- entry (str) - string to be checked
+ address (str) - string to be checked
Returns:
True if input is a valid IPv4 address, False otherwise.
"""
# checks if theres four period separated values
- if not entry.count(".") == 3: return False
+ if address.count(".") != 3: return False
# checks that each value in the octet are decimal values between 0-255
- for entry in entry.split("."):
+ for entry in address.split("."):
if not entry.isdigit() or int(entry) < 0 or int(entry) > 255:
return False
elif entry[0] == "0" and len(entry) > 1:
@@ -29,6 +31,36 @@ def is_valid_ip_address(entry):
return True
+def is_valid_ipv6_address(address):
+ """
+ Checks if a string is a valid IPv6 address.
+
+ Arguments:
+ address (str) - string to be checked
+
+ Returns:
+ True if input is a valid IPv6 address, False otherwise.
+ """
+
+ # addresses are made up of eight colon separated groups of four hex digits
+ # with leading zeros being optional
+ # https://en.wikipedia.org/wiki/IPv6#Address_format
+
+ colon_count = address.count(":")
+
+ if colon_count > 7:
+ return False # too many groups
+ elif colon_count != 7 and not "::" in address:
+ return False # not enough groups and none are collapsed
+ elif address.count("::") > 1 or ":::" in address:
+ return False # multiple groupings of zeros can't be collapsed
+
+ for entry in address.split(":"):
+ if not re.match("^[0-9a-fA-f]{0,4}$", entry):
+ return False
+
+ return True
+
def is_valid_port(entry, allow_zero = False):
"""
Checks if a string or int is a valid port number.
diff --git a/test/unit/util/connection.py b/test/unit/util/connection.py
index 01d1c92..b4c7223 100644
--- a/test/unit/util/connection.py
+++ b/test/unit/util/connection.py
@@ -29,9 +29,37 @@ class TestConnection(unittest.TestCase):
for address in valid_addresses:
self.assertTrue(stem.util.connection.is_valid_ip_address(address))
+
for address in invalid_addresses:
self.assertFalse(stem.util.connection.is_valid_ip_address(address))
+ def test_is_valid_ipv6_address(self):
+ """
+ Checks the is_valid_ipv6_address function.
+ """
+
+ valid_addresses = (
+ "fe80:0000:0000:0000:0202:b3ff:fe1e:8329",
+ "fe80:0:0:0:202:b3ff:fe1e:8329",
+ "fe80::202:b3ff:fe1e:8329",
+ "::",
+ )
+
+ invalid_addresses = (
+ "fe80:0000:0000:0000:0202:b3ff:fe1e:829g",
+ "fe80:0000:0000:0000:0202:b3ff:fe1e: 8329",
+ "2001:db8::aaaa::1",
+ ":::",
+ ":",
+ "",
+ )
+
+ for address in valid_addresses:
+ self.assertTrue(stem.util.connection.is_valid_ipv6_address(address))
+
+ for address in invalid_addresses:
+ self.assertFalse(stem.util.connection.is_valid_ipv6_address(address))
+
def test_is_valid_port(self):
"""
Checks the is_valid_port function.
More information about the tor-commits
mailing list