commit 7cd62935b7f6d5dcf41fb2a82da8a13853fe809c Author: Ossi Herrala oherrala@gmail.com Date: Fri Nov 21 02:00:42 2014 +0200
stem/util/tor_tools.py: Small optimizations to validators.
* Remove calls to isinstance() and trust the called functions to throw exception instead. * Add more unit tests for cases found while poking around. --- stem/util/tor_tools.py | 35 +++++++++++++++++++++-------------- test/unit/util/tor_tools.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/stem/util/tor_tools.py b/stem/util/tor_tools.py index 9eb46a0..54579f6 100644 --- a/stem/util/tor_tools.py +++ b/stem/util/tor_tools.py @@ -51,15 +51,16 @@ def is_valid_fingerprint(entry, check_prefix = False): :returns: **True** if the string could be a relay fingerprint, **False** otherwise """
- if not isinstance(entry, (str, unicode)): - return False - elif check_prefix: - if not entry or entry[0] != '$': - return False + try: + if check_prefix: + if not entry or entry[0] != '$': + return False
- entry = entry[1:] + entry = entry[1:]
- return bool(FINGERPRINT_PATTERN.match(entry)) + return is_hex_digits(entry, 40) + except TypeError: + return False
def is_valid_nickname(entry): @@ -71,11 +72,11 @@ def is_valid_nickname(entry): :returns: **True** if the string could be a nickname, **False** otherwise """
- if not isinstance(entry, (str, unicode)): + try: + return bool(NICKNAME_PATTERN.match(entry)) + except TypeError: return False
- return bool(NICKNAME_PATTERN.match(entry)) -
def is_valid_circuit_id(entry): """ @@ -84,11 +85,11 @@ def is_valid_circuit_id(entry): :returns: **True** if the string could be a circuit id, **False** otherwise """
- if not isinstance(entry, (str, unicode)): + try: + return bool(CIRC_ID_PATTERN.match(entry)) + except TypeError: return False
- return bool(CIRC_ID_PATTERN.match(entry)) -
def is_valid_stream_id(entry): """ @@ -123,4 +124,10 @@ def is_hex_digits(entry, count): :returns: **True** if the string matches this number """
- return bool(re.match('^%s{%i}$' % (HEX_DIGIT, count), entry)) + try: + if len(entry) != count: + return False + int(entry, 16) + except (ValueError, TypeError): + return False + return True diff --git a/test/unit/util/tor_tools.py b/test/unit/util/tor_tools.py index 6e3af86..80362f7 100644 --- a/test/unit/util/tor_tools.py +++ b/test/unit/util/tor_tools.py @@ -19,7 +19,10 @@ class TestTorTools(unittest.TestCase): )
invalid_fingerprints = ( + None, '', + 5, + ['A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB'], 'A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553E', '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553E33', @@ -46,6 +49,7 @@ class TestTorTools(unittest.TestCase): invalid_nicknames = ( None, '', + 5, 'toolongggggggggggggg', 'bad_character', ) @@ -81,3 +85,29 @@ class TestTorTools(unittest.TestCase):
for circuit_id in invalid_circuit_ids: self.assertFalse(stem.util.tor_tools.is_valid_circuit_id(circuit_id)) + + def test_is_valid_hex_digits(self): + """ + Checks the is_valid_hex_digits function. + """ + + valid_hex_digits = ( + "12345", + "AbCdE", + ) + + invalid_hex_digits = ( + None, + '', + 5, + 'X', + "1234", + "ABCDEF", + [1, "2", (3, 4)] + ) + + for hex_digits in valid_hex_digits: + self.assertTrue(stem.util.tor_tools.is_hex_digits(hex_digits, 5)) + + for hex_digits in invalid_hex_digits: + self.assertFalse(stem.util.tor_tools.is_hex_digits(hex_digits, 5))