[tor-commits] [stem/master] Parsing or-address in all server descriptors

atagar at torproject.org atagar at torproject.org
Fri Oct 19 23:21:20 UTC 2012


commit fc7c5cb0e0b06f26c7d8a1e0af348453127e3d4c
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Oct 19 14:00:17 2012 -0700

    Parsing or-address in all server descriptors
    
    As mentioned in 19ba050 the 'or-address' lines initially just applied to
    bridges, but would later be relevant to all relay types. Looks like that day
    has come since 'or-address' now appears in my cached consensus (indicated via
    integ testing failures).
---
 stem/descriptor/server_descriptor.py |   58 ++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 30 deletions(-)

diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index b597de9..aa49499 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -156,6 +156,7 @@ class ServerDescriptor(stem.descriptor.Descriptor):
   :var bool extra_info_cache: **\*** flag if a mirror for extra-info documents
   :var str extra_info_digest: hex encoded digest of our extra-info document
   :var bool eventdns: flag for evdns backend (deprecated, always unset)
+  :var list address_alt: alternative for our address/or_port attributes, each entry is a tuple of the form ``(address (str), port (int), is_ipv6 (bool))``
   
   Deprecated, moved to extra-info descriptor...
   
@@ -218,6 +219,7 @@ class ServerDescriptor(stem.descriptor.Descriptor):
     self.extra_info_digest = None
     self.hidden_service_dir = None
     self.eventdns = None
+    self.address_alt = []
     
     self.read_history_end = None
     self.read_history_interval = None
@@ -462,6 +464,32 @@ class ServerDescriptor(stem.descriptor.Descriptor):
         self.family = value.split(" ")
       elif keyword == "eventdns":
         self.eventdns = value == "1"
+      elif keyword == "or-address":
+        or_address_entries = [value for (value, _) in values]
+        
+        for entry in or_address_entries:
+          line = "%s %s" % (keyword, entry)
+          
+          if not ":" in entry:
+            if not validate: continue
+            else: raise ValueError("or-address line missing a colon: %s" % line)
+          
+          div = entry.rfind(":")
+          address, ports = entry[:div], entry[div+1:]
+          is_ipv6 = address.startswith("[") and address.endswith("]")
+          if is_ipv6: address = address[1:-1] # remove brackets
+          
+          if not ((not is_ipv6 and stem.util.connection.is_valid_ip_address(address)) or
+                 (is_ipv6 and stem.util.connection.is_valid_ipv6_address(address))):
+            if not validate: continue
+            else: raise ValueError("or-address line has a malformed address: %s" % line)
+          
+          for port in ports.split(","):
+            if not stem.util.connection.is_valid_port(port):
+              if not validate: break
+              else: raise ValueError("or-address line has malformed ports: %s" % line)
+            
+            self.address_alt.append((address, int(port), is_ipv6))
       elif keyword in ("read-history", "write-history"):
         try:
           timestamp, interval, remainder = \
@@ -642,11 +670,9 @@ class BridgeDescriptor(ServerDescriptor):
   """
   Bridge descriptor (`specification <https://metrics.torproject.org/formats.html#bridgedesc>`_)
   
-  :var list address_alt: alternative for our address/or_port attributes, each entry is a tuple of the form ``(address (str), port (int), is_ipv6 (bool))``
   """
   
   def __init__(self, raw_contents, validate = True, annotations = None):
-    self.address_alt = []
     self._digest = None
     self._scrubbing_issues = None
     
@@ -669,34 +695,6 @@ class BridgeDescriptor(ServerDescriptor):
         
         self._digest = value
         del entries["router-digest"]
-      elif keyword == "or-address":
-        or_address_entries = [value for (value, _) in values]
-        
-        for entry in or_address_entries:
-          line = "%s %s" % (keyword, entry)
-          
-          if not ":" in entry:
-            if not validate: continue
-            else: raise ValueError("or-address line missing a colon: %s" % line)
-          
-          div = entry.rfind(":")
-          address, ports = entry[:div], entry[div+1:]
-          is_ipv6 = address.startswith("[") and address.endswith("]")
-          if is_ipv6: address = address[1:-1] # remove brackets
-          
-          if not ((not is_ipv6 and stem.util.connection.is_valid_ip_address(address)) or
-                 (is_ipv6 and stem.util.connection.is_valid_ipv6_address(address))):
-            if not validate: continue
-            else: raise ValueError("or-address line has a malformed address: %s" % line)
-          
-          for port in ports.split(","):
-            if not stem.util.connection.is_valid_port(port):
-              if not validate: break
-              else: raise ValueError("or-address line has malformed ports: %s" % line)
-            
-            self.address_alt.append((address, int(port), is_ipv6))
-        
-        del entries["or-address"]
     
     ServerDescriptor._parse(self, entries, validate)
   



More information about the tor-commits mailing list