[tor-commits] [stem/master] Parsing tor version list attributes
atagar at torproject.org
atagar at torproject.org
Sat Oct 13 18:35:45 UTC 2012
commit fd0deb96f30fc691019e0d2a09068a4787d80e97
Author: Damian Johnson <atagar at torproject.org>
Date: Sat Sep 8 19:11:13 2012 -0700
Parsing tor version list attributes
Handling the 'client-versions' and 'server-versions' lines, comma separated
lists of tor versions.
---
stem/descriptor/networkstatus.py | 27 +++++++++++++++--------
test/unit/descriptor/networkstatus/document.py | 24 +++++++++++++++++++++
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py
index 2b30249..eca3b71 100644
--- a/stem/descriptor/networkstatus.py
+++ b/stem/descriptor/networkstatus.py
@@ -208,9 +208,9 @@ class NetworkStatusDocument(stem.descriptor.Descriptor):
:var datetime fresh_until: **\*** time until when the consensus is considered to be fresh
:var datetime valid_until: **\*** time until when the consensus is valid
:var int vote_delay: **\*** number of seconds allowed for collecting votes from all authorities
- :var int dist_delay: number of seconds allowed for collecting signatures from all authorities
- :var list client_versions: list of recommended Tor client versions
- :var list server_versions: list of recommended Tor server versions
+ :var int dist_delay: **\*** number of seconds allowed for collecting signatures from all authorities
+ :var list client_versions: list of recommended client tor versions
+ :var list server_versions: list of recommended server tor versions
:var list known_flags: **\*** list of known router flags
:var list params: dict of parameter(str) => value(int) mappings
:var list directory_authorities: **\*** list of DirectoryAuthority objects that have generated this document
@@ -371,6 +371,18 @@ class NetworkStatusDocument(stem.descriptor.Descriptor):
self.dist_delay = int(value_comp[1])
elif validate:
raise ValueError("A network status document's 'voting-delay' line must be a pair of integer values, but was '%s'" % value)
+ elif keyword in ("client-versions", "server-versions"):
+ for entry in value.split(","):
+ try:
+ version_value = stem.version.Version(entry)
+
+ if keyword == 'client-versions':
+ self.client_versions.append(version_value)
+ elif keyword == 'server-versions':
+ self.server_versions.append(version_value)
+ except ValueError:
+ if validate:
+ raise ValueError("Network status document's '%s' line had '%s', which isn't a parseable tor version: %s" % (keyword, entry, line))
# doing this validation afterward so we know our 'is_consensus' and
# 'is_vote' attributes
@@ -394,16 +406,11 @@ class NetworkStatusDocument(stem.descriptor.Descriptor):
_read_keyword_line("fresh-until", content, False, True)
_read_keyword_line("valid-until", content, False, True)
_read_keyword_line("voting-delay", content, False, True)
+ _read_keyword_line("client-versions", content, False, True)
+ _read_keyword_line("server-versions", content, False, True)
vote = self.is_vote
- client_versions = _read_keyword_line("client-versions", content, validate, True)
- if client_versions:
- self.client_versions = [stem.version.Version(version_string) for version_string in client_versions.split(",")]
- server_versions = _read_keyword_line("server-versions", content, validate, True)
- if server_versions:
- self.server_versions = [stem.version.Version(version_string) for version_string in server_versions.split(",")]
-
flags_content = _read_keyword_line("known-flags", content, validate)
if flags_content:
diff --git a/test/unit/descriptor/networkstatus/document.py b/test/unit/descriptor/networkstatus/document.py
index c16e054..032c095 100644
--- a/test/unit/descriptor/networkstatus/document.py
+++ b/test/unit/descriptor/networkstatus/document.py
@@ -5,6 +5,7 @@ Unit tests for the NetworkStatusDocument of stem.descriptor.networkstatus.
import datetime
import unittest
+import stem.version
from stem.descriptor.networkstatus import HEADER_STATUS_DOCUMENT_FIELDS, FOOTER_STATUS_DOCUMENT_FIELDS, Flag, NetworkStatusDocument, DirectorySignature
NETWORK_STATUS_DOCUMENT_ATTR = {
@@ -330,4 +331,27 @@ class TestNetworkStatusDocument(unittest.TestCase):
document = NetworkStatusDocument(content, False)
self.assertEquals(None, document.vote_delay)
self.assertEquals(None, document.dist_delay)
+
+ def test_invalid_version_lists(self):
+ """
+ Parses invalid client-versions and server-versions fields. Both are comma
+ separated lists of tor versions.
+ """
+
+ test_values = (
+ ("", []),
+ (" ", []),
+ ("1.2.3.4,", [stem.version.Version("1.2.3.4")]),
+ ("1.2.3.4,1.2.3.a", [stem.version.Version("1.2.3.4")]),
+ )
+
+ for field in ('client-versions', 'server-versions'):
+ attr = field.replace('-', '_')
+
+ for test_value, expected_value in test_values:
+ content = get_network_status_document({field: test_value})
+ self.assertRaises(ValueError, NetworkStatusDocument, content)
+
+ document = NetworkStatusDocument(content, False)
+ self.assertEquals(expected_value, getattr(document, attr))
More information about the tor-commits
mailing list