[tor-commits] [stem/master] Handling the server descriptor's router-signature line

atagar at torproject.org atagar at torproject.org
Mon Mar 26 00:10:01 UTC 2012


commit 043f739405ec6012725ce4d86361fc01cb1a0c17
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Mar 19 08:55:47 2012 -0700

    Handling the server descriptor's router-signature line
---
 stem/descriptor/server_descriptor.py |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index df10423..8ed9afa 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -26,11 +26,13 @@ PGP_BLOCK_START = re.compile("^-----BEGIN ([%s%s]+)-----$" % (KEYWORD_CHAR, WHIT
 PGP_BLOCK_END   = "-----END %s-----"
 
 # entries must have exactly one of the following
+# TODO: spec doesn't list 'router-signature', but that's a spec bug I should fix
 REQUIRED_FIELDS = (
   "published",
   "onion-key",
   "signing-key",
   "bandwidth",
+  "router-signature",
 )
 
 # optional entries that can appear at most once
@@ -115,6 +117,8 @@ class ServerDescriptorV2(Descriptor):
     onion_key_type (str)     - block type of the onion_key, probably "RSA PUBLIC KEY" (*)
     signing_key (str)        - relay's long-term identity key (*)
     signing_key_type (str)   - block type of the signing_key, probably "RSA PUBLIC KEY" (*)
+    router_sig (str)         - signature for this descriptor (*)
+    router_sig_type (str)    - block type of the router_sig, probably "SIGNATURE" (*)
     
     * required fields, others are left as None if undefined
   """
@@ -182,6 +186,7 @@ class ServerDescriptorV2(Descriptor):
       value, block_type, block_contents = values[0]
       
       line = "%s %s" % (keyword, value) # original line
+      if block_contents: line += "\n%s" % block_contents
       
       if keyword == "router":
         # "router" nickname address ORPort SocksPort DirPort
@@ -273,16 +278,22 @@ class ServerDescriptorV2(Descriptor):
         self.uptime = int(value)
       elif keyword == "onion-key":
         if not block_type or not block_contents:
-          raise TypeError("Onion key line must be followed by a public key: %s" % value)
-          
+          raise TypeError("Onion key line must be followed by a public key: %s" % line)
+        
         self.onion_key_type = block_type
         self.onion_key = block_contents
       elif keyword == "signing-key":
         if not block_type or not block_contents:
-          raise TypeError("Signing key line must be followed by a public key: %s" % value)
-          
+          raise TypeError("Signing key line must be followed by a public key: %s" % line)
+        
         self.signing_key_type = block_type
         self.signing_key = block_contents
+      elif keyword == "router-signature":
+        if not block_type or not block_contents:
+          raise TypeError("Router signature line must be followed by a signature block: %s" % line)
+        
+        self.router_sig_type = block_type
+        self.router_sig = block_contents
       else:
         unrecognized_entries.append(line)
 





More information about the tor-commits mailing list