commit cffc3c1be1c4c2a00ce41325a37038d83c8a80a1 Author: Damian Johnson atagar@torproject.org Date: Sat May 5 15:47:06 2012 -0700
Mislabeled server descriptors as being version 3
We're using version 3 of the dir-spec, but server descriptors themselves are still using their initial version. Correcting the class names and documentation that labeled them as being version 3. Thanks to Karsten for the correction! --- stem/descriptor/__init__.py | 2 +- stem/descriptor/server_descriptor.py | 36 ++++++++++++------------ test/integ/descriptor/server_descriptor.py | 16 +++++----- test/unit/descriptor/server_descriptor.py | 42 ++++++++++++++-------------- 4 files changed, 48 insertions(+), 48 deletions(-)
diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py index 21f40c2..2af1fb0 100644 --- a/stem/descriptor/__init__.py +++ b/stem/descriptor/__init__.py @@ -41,7 +41,7 @@ def parse_file(path, descriptor_file): descriptor_file.seek(0)
if filename == "cached-descriptors" or first_line.startswith("router "): - for desc in stem.descriptor.server_descriptor.parse_file_v3(descriptor_file): + for desc in stem.descriptor.server_descriptor.parse_file(descriptor_file): desc._set_path(path) yield desc else: diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py index d56b453..5a187df 100644 --- a/stem/descriptor/server_descriptor.py +++ b/stem/descriptor/server_descriptor.py @@ -7,13 +7,13 @@ etc). This information is provided from a few sources... - the 'cached-descriptors' file in tor's data directory - tor metrics, at https://metrics.torproject.org/data.html
-parse_file_v3 - Iterates over the server descriptors in a file. -ServerDescriptorV3 - Tor server descriptor, version 3. - | |- RelayDescriptorV3 - Server descriptor for a relay. +parse_file - Iterates over the server descriptors in a file. +ServerDescriptor - Tor server descriptor. + | |- RelayDescriptor - Server descriptor for a relay. | | |- is_valid - checks the signature against the descriptor content | | +- digest - calculates the digest value for our content | | - | +- BridgeDescriptorV3 - Scrubbed server descriptor for a bridge. + | +- BridgeDescriptor - Scrubbed server descriptor for a bridge. | |- is_scrubbed - checks if our content has been properly scrubbed | +- get_scrubbing_issues - description of issues with our scrubbing | @@ -66,10 +66,10 @@ SINGLE_FIELDS = ( "allow-single-hop-exits", )
-def parse_file_v3(descriptor_file, validate = True): +def parse_file(descriptor_file, validate = True): """ - Iterates over the version 3 server descriptors in a file. This can read - either relay or bridge v3 server descriptors. + Iterates over the server descriptors in a file. This can read either relay or + bridge server descriptors.
Arguments: descriptor_file (file) - file with descriptor content @@ -77,7 +77,7 @@ def parse_file_v3(descriptor_file, validate = True): True, skips these checks otherwise
Returns: - iterator for ServerDescriptorV3 instances in the file + iterator for ServerDescriptor instances in the file
Raises: ValueError if the contents is malformed and validate is True @@ -95,7 +95,7 @@ def parse_file_v3(descriptor_file, validate = True): descriptor_file.seek(0)
if first_line.startswith("router Unnamed 10."): - yield BridgeDescriptorV3(descriptor_file.read()) + yield BridgeDescriptor(descriptor_file.read()) return
# Handler for relay descriptors @@ -137,7 +137,7 @@ def parse_file_v3(descriptor_file, validate = True): annotations = map(str.strip, annotations)
descriptor_text = "".join(descriptor_content) - descriptor = RelayDescriptorV3(descriptor_text, validate, annotations) + descriptor = RelayDescriptor(descriptor_text, validate, annotations) yield descriptor else: break # done parsing descriptors
@@ -175,9 +175,9 @@ def _read_until_keyword(keyword, descriptor_file, inclusive = False):
return content
-class ServerDescriptorV3(stem.descriptor.Descriptor): +class ServerDescriptor(stem.descriptor.Descriptor): """ - Common parent for version 3 server descriptors. + Common parent for server descriptors.
Attributes: nickname (str) - relay's nickname (*) @@ -599,7 +599,7 @@ class ServerDescriptorV3(stem.descriptor.Descriptor): def _first_keyword(self): return None def _last_keyword(self): return None
-class RelayDescriptorV3(ServerDescriptorV3): +class RelayDescriptor(ServerDescriptor): """ Version 3 server descriptor, as specified in... https://gitweb.torproject.org/torspec.git/blob/HEAD:/dir-spec.txt @@ -618,7 +618,7 @@ class RelayDescriptorV3(ServerDescriptorV3): self.signature = None self._digest = None
- ServerDescriptorV3.__init__(self, raw_contents, validate, annotations) + ServerDescriptor.__init__(self, raw_contents, validate, annotations)
def is_valid(self): """ @@ -680,7 +680,7 @@ class RelayDescriptorV3(ServerDescriptorV3): self.signature = block_contents del entries["router-signature"]
- ServerDescriptorV3._parse(self, entries, validate) + ServerDescriptor._parse(self, entries, validate)
def _required_fields(self): return REQUIRED_FIELDS @@ -694,7 +694,7 @@ class RelayDescriptorV3(ServerDescriptorV3): def _last_keyword(self): return "router-signature"
-class BridgeDescriptorV3(ServerDescriptorV3): +class BridgeDescriptor(ServerDescriptor): """ Version 3 bridge descriptor, as specified in... https://metrics.torproject.org/formats.html#bridgedesc @@ -708,7 +708,7 @@ class BridgeDescriptorV3(ServerDescriptorV3): def __init__(self, raw_contents, validate = True, annotations = None): self.address_alt = [] self._scrubbing_issues = None - ServerDescriptorV3.__init__(self, raw_contents, validate, annotations) + ServerDescriptor.__init__(self, raw_contents, validate, annotations)
def _parse(self, entries, validate): entries = dict(entries) @@ -744,7 +744,7 @@ class BridgeDescriptorV3(ServerDescriptorV3):
del entries["or-address"]
- ServerDescriptorV3._parse(self, entries, validate) + ServerDescriptor._parse(self, entries, validate)
def is_scrubbed(self): """ diff --git a/test/integ/descriptor/server_descriptor.py b/test/integ/descriptor/server_descriptor.py index 84732b8..5ad700f 100644 --- a/test/integ/descriptor/server_descriptor.py +++ b/test/integ/descriptor/server_descriptor.py @@ -74,7 +74,7 @@ dskLSPz8beUW7bzwDjR6EVNGpyoZde83Ejvau+5F2c6cGnlu91fiZN3suE88iE6e Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= -----END SIGNATURE-----"""
- desc = stem.descriptor.server_descriptor.RelayDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents) self.assertEquals("caerSidi", desc.nickname) self.assertEquals("A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB", desc.fingerprint) self.assertEquals("71.35.133.197", desc.address) @@ -116,7 +116,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= descriptor_contents = descriptor_file.read() descriptor_file.close()
- desc = stem.descriptor.server_descriptor.RelayDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents) self.assertEquals("krypton", desc.nickname) self.assertEquals("3E2F63E2356F52318B536A12B6445373808A5D6C", desc.fingerprint) self.assertEquals("212.37.39.59", desc.address) @@ -181,7 +181,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= RAN_CACHED_DESCRIPTOR_TEST = True
with open(descriptor_path) as descriptor_file: - for desc in stem.descriptor.server_descriptor.parse_file_v3(descriptor_file): + for desc in stem.descriptor.server_descriptor.parse_file(descriptor_file): # the following attributes should be deprecated, and not appear in the wild self.assertEquals(None, desc.read_history) self.assertEquals(None, desc.write_history) @@ -214,7 +214,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= expected_published = datetime.datetime(2012, 3, 21, 16, 28, 14) expected_contact = "2048R/F171EC1F Johan Bl\xc3\xa5b\xc3\xa4ck \xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf"
- desc = stem.descriptor.server_descriptor.RelayDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents) self.assertEquals("torrelay389752132", desc.nickname) self.assertEquals("FEBC7F992AC418BBE42BC13FE94EFCFE6549197E", desc.fingerprint) self.assertEquals("130.243.230.116", desc.address) @@ -253,7 +253,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= descriptor_contents = descriptor_file.read() descriptor_file.close()
- desc = stem.descriptor.server_descriptor.RelayDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents)
self.assertEquals("pogonip", desc.nickname) self.assertEquals("6DABD62BC65D4E6FE620293157FC76968DAB9C9B", desc.fingerprint) @@ -280,7 +280,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= descriptor_contents = descriptor_file.read() descriptor_file.close()
- desc = stem.descriptor.server_descriptor.RelayDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.RelayDescriptor(descriptor_contents)
self.assertEquals("TipTor", desc.nickname) self.assertEquals("137962D4931DBF08A24E843288B8A155D6D2AEDD", desc.fingerprint) @@ -290,7 +290,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= # should appear
descriptor_contents = descriptor_contents.replace("Tor 0.1.1.25", "Tor 0.1.2.7") - self.assertRaises(ValueError, stem.descriptor.server_descriptor.RelayDescriptorV3, descriptor_contents) + self.assertRaises(ValueError, stem.descriptor.server_descriptor.RelayDescriptor, descriptor_contents)
def test_bridge_descriptor(self): """ @@ -311,7 +311,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= "$8C8A470D7C23151665A7B84E75E89FCC205A3304", ]
- desc = stem.descriptor.server_descriptor.BridgeDescriptorV3(descriptor_contents) + desc = stem.descriptor.server_descriptor.BridgeDescriptor(descriptor_contents) self.assertEquals("Unnamed", desc.nickname) self.assertEquals("AE54E28ED069CDF45F3009F963EE3B3D6FA26A2E", desc.fingerprint) self.assertEquals("10.45.227.253", desc.address) diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py index 101cdcd..e3b2ec6 100644 --- a/test/unit/descriptor/server_descriptor.py +++ b/test/unit/descriptor/server_descriptor.py @@ -7,7 +7,7 @@ import StringIO import unittest
import stem.descriptor.server_descriptor -from stem.descriptor.server_descriptor import RelayDescriptorV3, BridgeDescriptorV3 +from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor
CRYPTO_BLOB = """ MIGJAoGBAJv5IIWQ+WDWYUdyA/0L8qbIkEVH/cwryZWoIaPAzINfrw1WfNZGtBmg @@ -80,7 +80,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor() - desc = RelayDescriptorV3(desc_text) + desc = RelayDescriptor(desc_text)
self.assertEquals("caerSidi", desc.nickname) self.assertEquals("71.35.133.197", desc.address) @@ -95,7 +95,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor({"opt": "contact www.atagar.com/contact/"}) - desc = RelayDescriptorV3(desc_text) + desc = RelayDescriptor(desc_text) self.assertEquals("www.atagar.com/contact/", desc.contact)
def test_unrecognized_line(self): @@ -104,7 +104,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor({"pepperjack": "is oh so tasty!"}) - desc = RelayDescriptorV3(desc_text) + desc = RelayDescriptor(desc_text) self.assertEquals(["pepperjack is oh so tasty!"], desc.get_unrecognized_lines())
def test_proceeding_line(self): @@ -185,12 +185,12 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor({"platform": ""}) - desc = RelayDescriptorV3(desc_text, validate = False) + desc = RelayDescriptor(desc_text, validate = False) self.assertEquals("", desc.platform)
# does the same but with 'platform ' replaced with 'platform' desc_text = desc_text.replace("platform ", "platform") - desc = RelayDescriptorV3(desc_text, validate = False) + desc = RelayDescriptor(desc_text, validate = False) self.assertEquals("", desc.platform)
def test_protocols_no_circuit_versions(self): @@ -212,7 +212,7 @@ class TestServerDescriptor(unittest.TestCase):
desc_text = _make_descriptor({"published": "2012-02-29 04:03:19"}) expected_published = datetime.datetime(2012, 2, 29, 4, 3, 19) - self.assertEquals(expected_published, RelayDescriptorV3(desc_text).published) + self.assertEquals(expected_published, RelayDescriptor(desc_text).published)
def test_published_no_time(self): """ @@ -232,7 +232,7 @@ class TestServerDescriptor(unittest.TestCase): for field in ("read-history", "write-history"): value = "2005-12-16 18:00:48 (900 s) 81,8848,8927,8927,83,8848" desc_text = _make_descriptor({"opt %s" % field: value}) - desc = RelayDescriptorV3(desc_text) + desc = RelayDescriptor(desc_text)
if field == "read-history": attr = (desc.read_history, desc.read_history_end, @@ -256,7 +256,7 @@ class TestServerDescriptor(unittest.TestCase):
value = "2005-12-17 01:23:11 (900 s) " desc_text = _make_descriptor({"opt read-history": value}) - desc = RelayDescriptorV3(desc_text) + desc = RelayDescriptor(desc_text) self.assertEquals(value, desc.read_history) self.assertEquals(datetime.datetime(2005, 12, 17, 1, 23, 11), desc.read_history_end) self.assertEquals(900, desc.read_history_interval) @@ -271,8 +271,8 @@ class TestServerDescriptor(unittest.TestCase): desc_text += _make_descriptor() desc_text += "\ntrailing text that should be ignored, ho hum"
- # running parse_file_v3 should provide an iterator with a single descriptor - desc_iter = stem.descriptor.server_descriptor.parse_file_v3(StringIO.StringIO(desc_text)) + # running parse_file should provide an iterator with a single descriptor + desc_iter = stem.descriptor.server_descriptor.parse_file(StringIO.StringIO(desc_text)) desc_entries = list(desc_iter) self.assertEquals(1, len(desc_entries)) desc = desc_entries[0] @@ -299,10 +299,10 @@ class TestServerDescriptor(unittest.TestCase):
for attr in stem.descriptor.server_descriptor.REQUIRED_FIELDS: desc_text = _make_descriptor(exclude = [attr]) - self.assertRaises(ValueError, RelayDescriptorV3, desc_text) + self.assertRaises(ValueError, RelayDescriptor, desc_text)
# check that we can still construct it without validation - desc = RelayDescriptorV3(desc_text, validate = False) + desc = RelayDescriptor(desc_text, validate = False)
# for one of them checks that the corresponding values are None if attr == "router": @@ -318,7 +318,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor(is_bridge = True) - desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text)
self.assertEquals("Unnamed", desc.nickname) self.assertEquals("10.45.227.253", desc.address) @@ -347,7 +347,7 @@ class TestServerDescriptor(unittest.TestCase):
for attr in unsanitized_attr: desc_text = _make_descriptor(attr, is_bridge = True) - desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text) self.assertFalse(desc.is_scrubbed())
def test_bridge_unsanitized_relay(self): @@ -357,7 +357,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor() - desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text) self.assertFalse(desc.is_scrubbed())
def test_or_address_v4(self): @@ -366,7 +366,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor({"or-address": "10.45.227.253:9001"}, is_bridge = True) - desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text) self.assertEquals([("10.45.227.253", 9001, False)], desc.address_alt)
def test_or_address_v6(self): @@ -375,7 +375,7 @@ class TestServerDescriptor(unittest.TestCase): """
desc_text = _make_descriptor({"or-address": "[fd9f:2e19:3bcf::02:9970]:9001"}, is_bridge = True) - desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text) self.assertEquals([("fd9f:2e19:3bcf::02:9970", 9001, True)], desc.address_alt)
def test_or_address_multiple(self): @@ -394,7 +394,7 @@ class TestServerDescriptor(unittest.TestCase): ("fd9f:2e19:3bcf::02:9970", 443, True), ]
- desc = BridgeDescriptorV3(desc_text) + desc = BridgeDescriptor(desc_text) self.assertEquals(expected_address_alt, desc.address_alt)
def _expect_invalid_attr(self, desc_text, attr = None, expected_value = None): @@ -404,8 +404,8 @@ class TestServerDescriptor(unittest.TestCase): value when we're constructed without validation. """
- self.assertRaises(ValueError, RelayDescriptorV3, desc_text) - desc = RelayDescriptorV3(desc_text, validate = False) + self.assertRaises(ValueError, RelayDescriptor, desc_text) + desc = RelayDescriptor(desc_text, validate = False)
if attr: # check that the invalid attribute matches the expected value when
tor-commits@lists.torproject.org