[tor-commits] [stem/master] Long digest values caused stem.client errors
atagar at torproject.org
atagar at torproject.org
Mon May 14 00:44:57 UTC 2018
commit 148c038543196ecdc92716a67c71edfa72aab19a
Author: Damian Johnson <atagar at torproject.org>
Date: Sun May 13 13:52:42 2018 -0700
Long digest values caused stem.client errors
Interesting. Tests were happy on my laptop but on my PC where I have an older
python 2.7 and 3.x version there are errors...
======================================================================
ERROR: test_relay_cell
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/atagar/Desktop/stem/test/unit/client/cell.py", line 160, in test_relay_cell
self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', 3257622417, 564346860).digest)
File "/home/atagar/Desktop/stem/stem/client/cell.py", line 315, in __init__
raise ValueError('RELAY cell digest must be a hash, string, or int but was a %s' % type(digest).__name__)
ValueError: RELAY cell digest must be a hash, string, or int but was a long
----------------------------------------------------------------------
Fixing our isinstance checks so they recognize both ints and longs. Two quick
things to note about this...
* In python 2.7 this is usually done as "isinstance(my_value, (int, long))"
but python3 drops the long type so that's a no-go.
* When we drop the python 2.x series these should become
"isinstance(my_value, int)" checks.
---
stem/client/cell.py | 3 ++-
stem/client/datatype.py | 8 ++++++--
test/unit/client/__init__.py | 4 ++--
test/unit/client/cell.py | 6 +++---
4 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/stem/client/cell.py b/stem/client/cell.py
index a3a0f7f0..7f801fd6 100644
--- a/stem/client/cell.py
+++ b/stem/client/cell.py
@@ -40,6 +40,7 @@ Messages communicated over a Tor relay's ORPort.
import datetime
import inspect
import io
+import numbers
import os
import random
import sys
@@ -309,7 +310,7 @@ class RelayCell(CircuitCell):
digest = Size.LONG.unpack(digest.digest()[:4])
elif isinstance(digest, (bytes, str_type)):
digest = Size.LONG.unpack(digest[:4])
- elif isinstance(digest, int):
+ elif isinstance(digest, numbers.Integral):
pass
else:
raise ValueError('RELAY cell digest must be a hash, string, or int but was a %s' % type(digest).__name__)
diff --git a/stem/client/datatype.py b/stem/client/datatype.py
index 687c5081..9abea36b 100644
--- a/stem/client/datatype.py
+++ b/stem/client/datatype.py
@@ -113,6 +113,7 @@ users.** See our :class:`~stem.client.Relay` the API you probably want.
import collections
import hashlib
import io
+import numbers
import struct
import stem.prereq
@@ -158,7 +159,10 @@ class _IntegerEnum(stem.util.enum.Enum):
Privides the (enum, int_value) tuple for a given value.
"""
- if isinstance(val, int):
+ # TODO: when we drop python 2.x support all "isinstance(val,
+ # numbers.Integral)" checks should become "isinstance(val, int)"
+
+ if isinstance(val, numbers.Integral):
return self._int_to_enum.get(val, self.UNKNOWN), val
elif val in self:
return val, self._enum_to_int.get(val, val)
@@ -310,7 +314,7 @@ class Size(Field):
raise NotImplementedError("Use our constant's unpack() and pop() instead")
def pack(self, content):
- if not isinstance(content, int):
+ if not isinstance(content, numbers.Integral):
raise ValueError('Size.pack encodes an integer, but was a %s' % type(content).__name__)
packed = struct.pack(self.format, content)
diff --git a/test/unit/client/__init__.py b/test/unit/client/__init__.py
index 91d3b2be..18677c62 100644
--- a/test/unit/client/__init__.py
+++ b/test/unit/client/__init__.py
@@ -2,6 +2,8 @@
Unit tests for stem.client.* contents.
"""
+import os
+
__all__ = [
'address',
'cell',
@@ -10,8 +12,6 @@ __all__ = [
'size',
]
-import os
-
TEST_DATA = os.path.join(os.path.dirname(__file__), 'data')
diff --git a/test/unit/client/cell.py b/test/unit/client/cell.py
index f066cc4f..76fe17ea 100644
--- a/test/unit/client/cell.py
+++ b/test/unit/client/cell.py
@@ -74,7 +74,7 @@ CERTS_CELLS = {
}
AUTH_CHALLENGE_CELLS = {
- b'\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE: (CHALLENGE, [1, 3]),
+ b'\x00\x00\x82\x00&' + CHALLENGE + b'\x00\x02\x00\x01\x00\x03': (CHALLENGE, [1, 3]),
}
@@ -237,5 +237,5 @@ class TestCell(unittest.TestCase):
self.assertEqual(challenge, cell.challenge)
self.assertEqual(methods, cell.methods)
- self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE cell should have a payload of 38 bytes, but only had 16', Cell.pop, b'\x00\x00\x82\x00&%s\x00\x02\x00\x01\x00\x03' % CHALLENGE[:10], 2)
- self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE should have 3 methods, but only had 4 bytes for it', Cell.pop, b'\x00\x00\x82\x00&%s\x00\x03\x00\x01\x00\x03' % CHALLENGE, 2)
+ self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE cell should have a payload of 38 bytes, but only had 16', Cell.pop, b'\x00\x00\x82\x00&' + CHALLENGE[:10] + b'\x00\x02\x00\x01\x00\x03', 2)
+ self.assertRaisesRegexp(ValueError, 'AUTH_CHALLENGE should have 3 methods, but only had 4 bytes for it', Cell.pop, b'\x00\x00\x82\x00&' + CHALLENGE + b'\x00\x03\x00\x01\x00\x03', 2)
More information about the tor-commits
mailing list