[tor-commits] [stem/master] Python3 unicode error with AuthorizedClient

atagar at torproject.org atagar at torproject.org
Wed Dec 4 20:50:37 UTC 2019


commit 444182f50e99fc27194f7074abc43590b80a93b1
Author: Damian Johnson <atagar at 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))



More information about the tor-commits mailing list