commit ad82c905347f3e5849930fdb3e63721b294d38b4 Author: Damian Johnson atagar@torproject.org Date: Tue May 21 21:30:49 2013 -0700
Processing controller descriptors as bytes
When descriptor content was fetched by the Controller it was first converted to unicode, then back into bytes. As a result descriptors with content that couldn't be converted (usually on the contact line) got mangled, and this in turn caused our check of its signature to fail.
Caught thanks to aj00200 on...
https://trac.torproject.org/8755 --- stem/control.py | 23 ++++++++++++----------- test/mocking.py | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/stem/control.py b/stem/control.py index 9ea77f8..6ec0006 100644 --- a/stem/control.py +++ b/stem/control.py @@ -151,11 +151,12 @@ import stem.response.events import stem.socket import stem.util.connection import stem.util.enum +import stem.util.str_tools import stem.util.tor_tools import stem.version
from stem import UNDEFINED, CircStatus, Signal -from stem.util import log, str_tools +from stem.util import log
# state changes a control socket can have
@@ -1018,8 +1019,8 @@ class Controller(BaseController): else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
- desc_content = self.get_info(query) - return stem.descriptor.microdescriptor.Microdescriptor(str_tools._to_bytes(desc_content)) + desc_content = self.get_info(query, get_bytes = True) + return stem.descriptor.microdescriptor.Microdescriptor(desc_content) except Exception as exc: if default == UNDEFINED: raise exc @@ -1107,8 +1108,8 @@ class Controller(BaseController): else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
- desc_content = self.get_info(query) - return stem.descriptor.server_descriptor.RelayDescriptor(str_tools._to_bytes(desc_content)) + desc_content = self.get_info(query, get_bytes = True) + return stem.descriptor.server_descriptor.RelayDescriptor(desc_content) except Exception as exc: if default == UNDEFINED: raise exc @@ -1141,9 +1142,9 @@ class Controller(BaseController): # # https://trac.torproject.org/8248
- desc_content = self.get_info("desc/all-recent") + desc_content = self.get_info("desc/all-recent", get_bytes = True)
- for desc in stem.descriptor.server_descriptor._parse_file(io.BytesIO(str_tools._to_bytes(desc_content))): + for desc in stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_content)): yield desc except Exception as exc: if default == UNDEFINED: @@ -1186,8 +1187,8 @@ class Controller(BaseController): else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay)
- desc_content = self.get_info(query) - return stem.descriptor.router_status_entry.RouterStatusEntryV2(str_tools._to_bytes(desc_content)) + desc_content = self.get_info(query, get_bytes = True) + return stem.descriptor.router_status_entry.RouterStatusEntryV2(desc_content) except Exception as exc: if default == UNDEFINED: raise exc @@ -1215,10 +1216,10 @@ class Controller(BaseController): # # https://trac.torproject.org/8248
- desc_content = self.get_info("ns/all") + desc_content = self.get_info("ns/all", get_bytes = True)
desc_iterator = stem.descriptor.router_status_entry._parse_file( - io.BytesIO(str_tools._to_bytes(desc_content)), + io.BytesIO(desc_content), True, entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV2, ) diff --git a/test/mocking.py b/test/mocking.py index 50a0f0e..3b165d8 100644 --- a/test/mocking.py +++ b/test/mocking.py @@ -293,7 +293,7 @@ def return_for_args(args_to_return_value, default = None, is_method = False):
def raise_exception(exception): - def _raise(*args): + def _raise(*args, **kwargs): raise exception
return _raise