diff options
| author | Damian Johnson <atagar@torproject.org> | 2019-12-04 12:48:03 -0800 |
|---|---|---|
| committer | Damian Johnson <atagar@torproject.org> | 2019-12-04 12:48:03 -0800 |
| commit | 444182f50e99fc27194f7074abc43590b80a93b1 (patch) | |
| tree | 89aca368325fa53a89d58024eeaf2465a1e5d9be | |
| parent | 7e9265b38361f5b70963c1c079606107e16a758b (diff) | |
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).
| -rw-r--r-- | stem/descriptor/hidden_service.py | 25 | ||||
| -rw-r--r-- | 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)) |
