[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [stem/master] Support downloading microdescriptor consensus
commit 532f906755af6a1d9f281fde5def4e416146d0b2
Author: Damian Johnson <atagar@xxxxxxxxxxxxxx>
Date: Wed Nov 2 10:46:26 2016 -0700
Support downloading microdescriptor consensus
Fantastic, turns out tor supports this!
https://trac.torproject.org/projects/tor/ticket/20501#comment:5
Adding a new get_consensus() arg for getting the microdescriptor consensus.
---
docs/change_log.rst | 1 +
stem/descriptor/remote.py | 45 ++++++++++++++++++++++++++---------------
test/integ/descriptor/remote.py | 17 ++++++++++++++++
3 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index 2959f6b..0d8dcf2 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -68,6 +68,7 @@ The following are only available within Stem's `git repository
* `Shorthand functions for stem.descriptor.remote <api/descriptor/remote.html#stem.descriptor.remote.get_instance>`_
* Added `fallback directory information <api/descriptor/remote.html#stem.descriptor.remote.FallbackDirectory>`_.
* Support for ed25519 descriptor fields (:spec:`5a79d67`)
+ * Support downloading microdescriptor consensus with :func:~stem.descriptor.remote.DescriptorDownloader.get_consensus` (:spec`e788b8f`)
* Added consensus and vote's new shared randomness attributes (:spec:`9949f64`)
* Added server descriptor's new allow_tunneled_dir_requests attribute (:spec:`8bc30d6`)
* Server descriptor validation fails with 'extra-info-digest line had an invalid value' from additions in proposal 228 (:trac:`16227`)
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index b47ee2b..4283616 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -160,7 +160,7 @@ def get_extrainfo_descriptors(fingerprints = None, **query_args):
return get_instance().get_extrainfo_descriptors(fingerprints, **query_args)
-def get_consensus(authority_v3ident = None, **query_args):
+def get_consensus(authority_v3ident = None, microdescriptor = False, **query_args):
"""
Shorthand for
:func:`~stem.descriptor.remote.DescriptorDownloader.get_consensus`
@@ -169,7 +169,7 @@ def get_consensus(authority_v3ident = None, **query_args):
.. versionadded:: 1.5.0
"""
- return get_instance().get_consensus(authority_v3ident, **query_args)
+ return get_instance().get_consensus(authority_v3ident, microdescriptor, **query_args)
def _guess_descriptor_type(resource):
@@ -182,6 +182,8 @@ def _guess_descriptor_type(resource):
return 'extra-info 1.0'
elif resource.startswith('/tor/micro/'):
return 'microdescriptor 1.0'
+ elif resource.startswith('/tor/status-vote/current/consensus-microdesc'):
+ return 'network-status-microdesc-consensus-3 1.0'
elif resource.startswith('/tor/status-vote/'):
return 'network-status-consensus-3 1.0'
elif resource.startswith('/tor/keys/'):
@@ -236,18 +238,19 @@ class Query(object):
<https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt>`_).
Commonly useful ones include...
- ===================================== ===========
- Resource Description
- ===================================== ===========
- /tor/server/all.z all present server descriptors
- /tor/server/fp/<fp1>+<fp2>+<fp3>.z server descriptors with the given fingerprints
- /tor/extra/all.z all present extrainfo descriptors
- /tor/extra/fp/<fp1>+<fp2>+<fp3>.z extrainfo descriptors with the given fingerprints
- /tor/micro/d/<hash1>-<hash2>.z microdescriptors with the given hashes
- /tor/status-vote/current/consensus.z present consensus
- /tor/keys/all.z key certificates for the authorities
- /tor/keys/fp/<v3ident1>+<v3ident2>.z key certificates for specific authorities
- ===================================== ===========
+ =============================================== ===========
+ Resource Description
+ =============================================== ===========
+ /tor/server/all.z all present server descriptors
+ /tor/server/fp/<fp1>+<fp2>+<fp3>.z server descriptors with the given fingerprints
+ /tor/extra/all.z all present extrainfo descriptors
+ /tor/extra/fp/<fp1>+<fp2>+<fp3>.z extrainfo descriptors with the given fingerprints
+ /tor/micro/d/<hash1>-<hash2>.z microdescriptors with the given hashes
+ /tor/status-vote/current/consensus.z present consensus
+ /tor/status-vote/current/consensus-microdesc.z present microdescriptor consensus
+ /tor/keys/all.z key certificates for the authorities
+ /tor/keys/fp/<v3ident1>+<v3ident2>.z key certificates for specific authorities
+ =============================================== ===========
The '.z' suffix can be excluded to get a plaintext rather than compressed
response. Compression is handled transparently, so this shouldn't matter to
@@ -564,6 +567,8 @@ class DescriptorDownloader(object):
return self.query(resource, **query_args)
+ # TODO: drop in python 2.x
+
def get_microdescriptors(self, hashes, **query_args):
"""
Provides the microdescriptors with the given hashes. To get these see the
@@ -595,14 +600,19 @@ class DescriptorDownloader(object):
return self.query('/tor/micro/d/%s.z' % '-'.join(hashes), **query_args)
- def get_consensus(self, authority_v3ident = None, **query_args):
+ def get_consensus(self, authority_v3ident = None, microdescriptor = False, **query_args):
"""
Provides the present router status entries.
+ .. versionchanged:: 1.5.0
+ Added the microdescriptor argument.
+
:param str authority_v3ident: fingerprint of the authority key for which
to get the consensus, see `'v3ident' in tor's config.c
<https://gitweb.torproject.org/tor.git/tree/src/or/config.c#n819>`_
for the values.
+ :param bool microdescriptor: provides the microdescriptor consensus if
+ **True**, standard consensus otherwise
:param query_args: additional arguments for the
:class:`~stem.descriptor.remote.Query` constructor
@@ -610,7 +620,10 @@ class DescriptorDownloader(object):
entries
"""
- resource = '/tor/status-vote/current/consensus'
+ if microdescriptor:
+ resource = '/tor/status-vote/current/consensus-microdesc'
+ else:
+ resource = '/tor/status-vote/current/consensus'
if authority_v3ident:
resource += '/%s' % authority_v3ident
diff --git a/test/integ/descriptor/remote.py b/test/integ/descriptor/remote.py
index 52d29f0..098041d 100644
--- a/test/integ/descriptor/remote.py
+++ b/test/integ/descriptor/remote.py
@@ -184,6 +184,23 @@ class TestDescriptorDownloader(unittest.TestCase):
@require_online
@only_run_once
+ def test_get_consensus_for_microdescriptors(self):
+ """
+ Exercises the downloader's get_consensus() method for fetching a
+ microdescriptor consensus.
+ """
+
+ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True)
+
+ consensus_query = downloader.get_consensus(microdescriptor = True)
+ consensus_query.run()
+
+ consensus = list(consensus_query)
+ self.assertTrue(len(consensus) > 50)
+ self.assertTrue(isinstance(consensus[0], stem.descriptor.router_status_entry.RouterStatusEntryMicroV3))
+
+ @require_online
+ @only_run_once
def test_get_key_certificates(self):
"""
Exercises the downloader's get_key_certificates() method.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits