[tor-commits] [stem/master] Filter archives with multiple descriptor types

atagar at torproject.org atagar at torproject.org
Sat Aug 17 20:44:27 UTC 2019


commit c54a66b92c63e9156b884c1dedcc3bd2da443f38
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Aug 9 16:40:07 2019 -0700

    Filter archives with multiple descriptor types
    
    One CollecTor archive type contains multiple descriptor types, so filtering out
    unrequested descriptors.
---
 stem/descriptor/collector.py           | 12 ++++++++----
 stem/descriptor/router_status_entry.py |  6 ++++++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index c8c4a1b7..3867fa3d 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -263,12 +263,16 @@ class File(object):
 
         return
 
-    # TODO: the following will not work if the tar contains multiple types or a type we do not support
-
     path = self.download(directory, True, timeout, retries)
 
-    for desc in parse_file(path, descriptor_type):
-      yield desc
+    # Archives can contain multiple descriptor types, so parsing everything and
+    # filtering to what we're after.
+
+    for desc in parse_file(path):
+      desc_annotation = type(desc).TYPE_ANNOTATION_NAME
+
+      if descriptor_type is None or (desc_annotation and descriptor_type.startswith(desc_annotation)):
+        yield desc
 
   def download(self, directory, decompress = True, timeout = None, retries = 3):
     """
diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py
index 344c5697..31913417 100644
--- a/stem/descriptor/router_status_entry.py
+++ b/stem/descriptor/router_status_entry.py
@@ -515,6 +515,8 @@ class RouterStatusEntryV2(RouterStatusEntry):
   a default value, others are left as **None** if undefined
   """
 
+  TYPE_ANNOTATION_NAME = 'network-status-consensus-2'
+
   ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{
     'digest': (None, _parse_r_line),
   })
@@ -575,6 +577,8 @@ class RouterStatusEntryV3(RouterStatusEntry):
      Added the protocols attribute.
   """
 
+  TYPE_ANNOTATION_NAME = 'network-status-consensus-3'
+
   ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{
     'digest': (None, _parse_r_line),
     'or_addresses': ([], _parse_a_line),
@@ -652,6 +656,8 @@ class RouterStatusEntryMicroV3(RouterStatusEntry):
   a default value, others are left as **None** if undefined
   """
 
+  TYPE_ANNOTATION_NAME = 'network-status-microdesc-consensus-3'
+
   ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{
     'or_addresses': ([], _parse_a_line),
     'bandwidth': (None, _parse_w_line),





More information about the tor-commits mailing list