[tor-commits] [metrics-lib/master] Correctly handle @type annotations when parsing descriptors.

karsten at torproject.org karsten at torproject.org
Fri May 18 15:40:34 UTC 2012


commit 01878416dc3bad327279913af37a105edfbfdc02
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Fri May 18 17:40:01 2012 +0200

    Correctly handle @type annotations when parsing descriptors.
---
 .../torproject/descriptor/impl/DescriptorImpl.java |   46 +++++++++++---------
 .../descriptor/impl/NetworkStatusImpl.java         |    3 +-
 2 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/src/org/torproject/descriptor/impl/DescriptorImpl.java b/src/org/torproject/descriptor/impl/DescriptorImpl.java
index 88db60a..7062b58 100644
--- a/src/org/torproject/descriptor/impl/DescriptorImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorImpl.java
@@ -26,30 +26,31 @@ public abstract class DescriptorImpl implements Descriptor {
     System.arraycopy(rawDescriptorBytes, 0, first100Chars, 0,
         first100Chars.length);
     String firstLines = new String(first100Chars);
-    if (firstLines.startsWith("network-status-version 3\n") ||
-        firstLines.contains("\nnetwork-status-version 3\n")) {
-      if (firstLines.contains("\nvote-status consensus\n")) {
-        parsedDescriptors.addAll(RelayNetworkStatusConsensusImpl.
-            parseConsensuses(rawDescriptorBytes,
-            failUnrecognizedDescriptorLines));
-      } else if (firstLines.contains("\nvote-status vote\n")) {
-        parsedDescriptors.addAll(RelayNetworkStatusVoteImpl.
-            parseVotes(rawDescriptorBytes,
-            failUnrecognizedDescriptorLines));
-      } else {
-        throw new DescriptorParseException("Could not detect relay "
-            + "network status type in descriptor starting with '"
-            + firstLines + "'.");
-      }
+    if (firstLines.startsWith("@type network-status-consensus-3 1.0\n") ||
+        ((firstLines.startsWith("network-status-version 3\n") ||
+        firstLines.contains("\nnetwork-status-version 3\n")) &&
+        firstLines.contains("\nvote-status consensus\n"))) {
+      parsedDescriptors.addAll(RelayNetworkStatusConsensusImpl.
+          parseConsensuses(rawDescriptorBytes,
+          failUnrecognizedDescriptorLines));
+    } else if (firstLines.startsWith("@type network-status-vote-3 1.0\n")
+        || ((firstLines.startsWith("network-status-version 3\n") ||
+        firstLines.contains("\nnetwork-status-version 3\n")) &&
+        firstLines.contains("\nvote-status vote\n"))) {
+      parsedDescriptors.addAll(RelayNetworkStatusVoteImpl.
+          parseVotes(rawDescriptorBytes,
+          failUnrecognizedDescriptorLines));
     } else if (firstLines.startsWith("r ")) {
       parsedDescriptors.add(new BridgeNetworkStatusImpl(
           rawDescriptorBytes, fileName, failUnrecognizedDescriptorLines));
-    } else if (firstLines.startsWith("router ") ||
+    } else if (firstLines.startsWith("@type server-descriptor 1.0\n") ||
+        firstLines.startsWith("router ") ||
         firstLines.contains("\nrouter ")) {
       parsedDescriptors.addAll(ServerDescriptorImpl.
           parseDescriptors(rawDescriptorBytes,
           failUnrecognizedDescriptorLines));
-    } else if (firstLines.startsWith("extra-info ") ||
+    } else if (firstLines.startsWith("@type extra-info 1.0\n") ||
+        firstLines.startsWith("extra-info ") ||
         firstLines.contains("\nextra-info ")) {
       parsedDescriptors.addAll(ExtraInfoDescriptorImpl.
           parseDescriptors(rawDescriptorBytes,
@@ -59,14 +60,19 @@ public abstract class DescriptorImpl implements Descriptor {
       parsedDescriptors.addAll(BridgePoolAssignmentImpl.
           parseDescriptors(rawDescriptorBytes,
           failUnrecognizedDescriptorLines));
-    } else if (firstLines.startsWith("dir-key-certificate-version ")) {
+    } else if (firstLines.startsWith("@type dir-key-certificate-3 1.0") ||
+        firstLines.startsWith("dir-key-certificate-version ") ||
+        firstLines.contains("\ndir-key-certificate-version ")) {
       parsedDescriptors.addAll(DirectoryKeyCertificateImpl.
           parseDescriptors(rawDescriptorBytes,
           failUnrecognizedDescriptorLines));
-    } else if (firstLines.startsWith("ExitNode ")) {
+    } else if (firstLines.startsWith("ExitNode ") ||
+        firstLines.contains("\nExitNode ")) {
       parsedDescriptors.add(new ExitListImpl(rawDescriptorBytes, fileName,
           failUnrecognizedDescriptorLines));
-    } else if (firstLines.startsWith("network-status-version 2\n")) {
+    } else if (firstLines.startsWith("@type network-status-2 1.0\n") ||
+        firstLines.startsWith("network-status-version 2\n") ||
+        firstLines.contains("\nnetwork-status-version 2\n")) {
       parsedDescriptors.add(new RelayNetworkStatusImpl(rawDescriptorBytes,
           failUnrecognizedDescriptorLines));
     } else {
diff --git a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
index 5a6af9e..94a76bf 100644
--- a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
+++ b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
@@ -22,7 +22,8 @@ public abstract class NetworkStatusImpl extends DescriptorImpl {
       throws DescriptorParseException {
     super(rawDescriptorBytes, failUnrecognizedDescriptorLines,
         blankLinesAllowed);
-    this.splitAndParseParts(rawDescriptorBytes, containsDirSourceEntries);
+    this.splitAndParseParts(this.rawDescriptorBytes,
+        containsDirSourceEntries);
   }
 
   private void splitAndParseParts(byte[] rawDescriptorBytes,



More information about the tor-commits mailing list