[tor-commits] [bridgedb/master] Add DescriptorWarning for matching timestamps for the same bridge.

isis at torproject.org isis at torproject.org
Sat Mar 21 02:02:58 UTC 2015


commit dcca03203be4e14233c7734c1d63fe35ea86fbbe
Author: Isis Lovecruft <isis at torproject.org>
Date:   Fri Dec 5 09:40:26 2014 +0000

    Add DescriptorWarning for matching timestamps for the same bridge.
---
 lib/bridgedb/parse/descriptors.py |   51 ++++++++++++++-----------------------
 1 file changed, 19 insertions(+), 32 deletions(-)

diff --git a/lib/bridgedb/parse/descriptors.py b/lib/bridgedb/parse/descriptors.py
index 6eac164..66a34b9 100644
--- a/lib/bridgedb/parse/descriptors.py
+++ b/lib/bridgedb/parse/descriptors.py
@@ -17,6 +17,7 @@ import logging
 import os
 import shutil
 
+from stem import ProtocolError
 from stem.descriptor import extrainfo_descriptor
 from stem.descriptor import server_descriptor
 from stem.descriptor import parse_file
@@ -26,6 +27,10 @@ from stem.descriptor.router_status_entry import RouterStatusEntryV3
 from bridgedb import safelog
 
 
+class DescriptorWarning(Warning):
+    """Raised when we parse a very odd descriptor."""
+
+
 def _copyUnparseableDescriptorFile(filename):
     """Save a copy of the bad descriptor file for later debugging.
 
@@ -181,9 +186,10 @@ def deduplicate(descriptors):
             # ``platform`` line in its server-descriptor and tell whoever
             # wrote that code that they're probably (D)DOSing the Tor network.
             else:
-                logging.warn(("Duplicate descriptor with identical timestamp "
-                              "(%s) for router with fingerprint '%s'!")
-                             % (descriptor.published, fingerprint))
+                raise DescriptorWarning(
+                    ("Duplicate descriptor with identical timestamp (%s) for "
+                     "router with fingerprint '%s'!")
+                    % (descriptor.published, fingerprint))
 
         # Hoorah! No duplicates! (yet...)
         else:
@@ -238,38 +244,19 @@ def parseBridgeExtraInfoFiles(*filenames, **kwargs):
         validate = False
 
     for filename in filenames:
-        document = None
-        documentWasUnparseable = False
-
-        logging.info("Parsing %s descriptors with Stem: %s"
+        logging.info("Parsing %s descriptors in %s..."
                      % (descriptorType, filename))
-        try:
-            document = parse_file(filename, descriptorType, validate=validate)
-        except ValueError as error:
-            documentWasUnparseable = True
-
-        if documentWasUnparseable:
-            logging.warn(("Stem ran into an exception while parsing extrainfo "
-                          "file '%s'!") % filename)
-            logging.debug("Error while parsing extrainfo file:\n%s"
-                          % str(error))
-
-        if documentWasUnparseable and (validate is True):
-            logging.info(("Retrying parsing of extrainfo file '%s' with "
-                          "validation disabled...") % filename)
-            try:
-                document = parse_file(filename, descriptorType, validate=False)
-            except ValueError as another:
-                logging.critical(("We were still unable to parse extrainfo "
-                                  "file on the second attempt! Bailing!"))
-            else:
-                documentWasUnparseable = False
 
-        if documentWasUnparseable:
-            _copyUnparseableDescriptorFile(filename)
+        document = parse_file(filename, descriptorType, validate=validate)
 
-        if document:
-            descriptors.extend([router for router in document])
+        try:
+            for router in document:
+                descriptors.append(router)
+        except (ValueError, ProtocolError) as error:
+            logging.error(
+                ("Stem exception while parsing extrainfo descriptor from "
+                 "file '%s':\n%s") % (filename, str(error)))
+            _copyUnparseableDescriptorFile(filename)
 
     routers = deduplicate(descriptors)
     return routers





More information about the tor-commits mailing list