commit 444182f50e99fc27194f7074abc43590b80a93b1 Author: Damian Johnson atagar@torproject.org Date: Wed Dec 4 12:48:03 2019 -0800
Python3 unicode error with AuthorizedClient
Great catch from asn that with python3 our AuthorizedClient construction embeds extra b'', malforming descriptor output...
https://trac.torproject.org/projects/tor/ticket/31823#comment:19
Fixing this is a general fashion such that AuthorizedClient both normalizes its field and can be constructed with unsupplied values randomized (so, for example, you can create a AuthorizedClient with only an iv). --- stem/descriptor/hidden_service.py | 25 +++++++++++++++++++------ test/unit/descriptor/hidden_service_v3.py | 4 ++-- 2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/stem/descriptor/hidden_service.py b/stem/descriptor/hidden_service.py index 13fae6ba..249822f1 100644 --- a/stem/descriptor/hidden_service.py +++ b/stem/descriptor/hidden_service.py @@ -412,7 +412,7 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s return not self == other
-class AuthorizedClient(collections.namedtuple('AuthorizedClient', ['id', 'iv', 'cookie'])): +class AuthorizedClient(object): """ Client authorized to use a v3 hidden service.
@@ -423,6 +423,23 @@ class AuthorizedClient(collections.namedtuple('AuthorizedClient', ['id', 'iv', ' :var str cookie: base64 encoded authentication cookie """
+ def __init__(self, id = None, iv = None, cookie = None): + self.id = stem.util.str_tools._to_unicode(id if id else base64.b64encode(os.urandom(8)).rstrip(b'=')) + self.iv = stem.util.str_tools._to_unicode(iv if iv else base64.b64encode(os.urandom(16)).rstrip(b'=')) + self.cookie = stem.util.str_tools._to_unicode(cookie if cookie else base64.b64encode(os.urandom(16)).rstrip(b'=')) + + def __str__(self): + return '%s %s %s' % (self.id, self.iv, self.cookie) + + def __hash__(self): + return stem.util._hash_attr(self, 'id', 'iv', 'cookie', cache = True) + + def __eq__(self, other): + return hash(self) == hash(other) if isinstance(other, AuthorizedClient) else False + + def __ne__(self, other): + return not self == other +
def _parse_file(descriptor_file, desc_type = None, validate = False, **kwargs): """ @@ -1228,11 +1245,7 @@ class OuterLayer(Descriptor): pass # caller is providing raw auth-client lines through the attr else: for i in range(16): - client_id = base64.b64encode(os.urandom(8)).rstrip(b'=') - iv = base64.b64encode(os.urandom(16)).rstrip(b'=') - cookie = base64.b64encode(os.urandom(16)).rstrip(b'=') - - authorized_clients.append(AuthorizedClient(client_id, iv, cookie)) + authorized_clients.append(AuthorizedClient())
return _descriptor_content(attr, exclude, [ ('desc-auth-type', 'x25519'), diff --git a/test/unit/descriptor/hidden_service_v3.py b/test/unit/descriptor/hidden_service_v3.py index 180493c1..33507314 100644 --- a/test/unit/descriptor/hidden_service_v3.py +++ b/test/unit/descriptor/hidden_service_v3.py @@ -383,8 +383,8 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase): self.assertEqual('-----BEGIN MESSAGE-----\nmalformed block\n-----END MESSAGE-----', desc.encrypted)
self.assertEqual({ - '1D8VBAh9hdM': AuthorizedClient(id = '1D8VBAh9hdM', iv = '6K/uO3sRqBp6URrKC7GB6Q', cookie = 'ElwRj5+6SN9kb8bRhiiQvA'), - 'JNil86N07AA': AuthorizedClient(id = 'JNil86N07AA', iv = 'epkaL79NtajmgME/egi8oA', cookie = 'qosYH4rXisxda3X7p9b6fw'), + '1D8VBAh9hdM': AuthorizedClient(id = b'1D8VBAh9hdM', iv = b'6K/uO3sRqBp6URrKC7GB6Q', cookie = b'ElwRj5+6SN9kb8bRhiiQvA'), + 'JNil86N07AA': AuthorizedClient(id = b'JNil86N07AA', iv = b'epkaL79NtajmgME/egi8oA', cookie = b'qosYH4rXisxda3X7p9b6fw'), }, desc.clients)
self.assertEqual(EXPECTED_OUTER_LAYER, str(desc))
tor-commits@lists.torproject.org