[tor-commits] [metrics-lib/master] Parse sanitized bridge descriptor version 1.0.

karsten at torproject.org karsten at torproject.org
Thu May 31 07:26:29 UTC 2012


commit 1743e912c3347824e4fef05569bdb194a1e04a0e
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Mon May 21 16:23:39 2012 +0200

    Parse sanitized bridge descriptor version 1.0.
---
 .../descriptor/impl/BridgeNetworkStatusImpl.java   |   32 ++++++++++++++++++-
 .../descriptor/impl/ExtraInfoDescriptorImpl.java   |   16 ++++++++++
 .../descriptor/impl/ServerDescriptorImpl.java      |   16 ++++++++++
 3 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java b/src/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
index 09f2f86..581c6e5 100644
--- a/src/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
+++ b/src/org/torproject/descriptor/impl/BridgeNetworkStatusImpl.java
@@ -4,6 +4,8 @@ package org.torproject.descriptor.impl;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Scanner;
 import java.util.TimeZone;
 
 import org.torproject.descriptor.BridgeNetworkStatus;
@@ -21,6 +23,11 @@ public class BridgeNetworkStatusImpl extends NetworkStatusImpl
 
   private void setPublishedMillisFromFileName(String fileName)
       throws DescriptorParseException {
+    if (this.publishedMillis != 0L) {
+      /* We already learned the publication timestamp from parsing the
+       * "published" line. */
+      return;
+    }
     if (fileName.length() ==
         "20000101-000000-4A0CCD2DDC7995083D73F5D667100C8A5831F16D".
         length()) {
@@ -44,8 +51,29 @@ public class BridgeNetworkStatusImpl extends NetworkStatusImpl
 
   protected void parseHeader(byte[] headerBytes)
       throws DescriptorParseException {
-    throw new DescriptorParseException("No directory header expected in "
-        + "bridge network status.");
+    Scanner s = new Scanner(new String(headerBytes)).useDelimiter("\n");
+    while (s.hasNext()) {
+      String line = s.next();
+      String[] parts = line.split(" ");
+      String keyword = parts[0];
+      if (keyword.equals("published")) {
+        this.parsePublishedLine(line, parts);
+      } else if (this.failUnrecognizedDescriptorLines) {
+        throw new DescriptorParseException("Unrecognized line '" + line
+            + "' in bridge network status.");
+      } else {
+        if (this.unrecognizedLines == null) {
+          this.unrecognizedLines = new ArrayList<String>();
+        }
+        this.unrecognizedLines.add(line);
+      }
+    }
+  }
+
+  private void parsePublishedLine(String line, String[] parts)
+      throws DescriptorParseException {
+    this.publishedMillis = ParseHelper.parseTimestampAtIndex(line, parts,
+        1, 2);
   }
 
   protected void parseDirSource(byte[] dirSourceBytes)
diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java
index d8fbc8d..f6e0fd9 100644
--- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java
+++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java
@@ -168,6 +168,8 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl
         this.parseBridgeStatsIpsLine(line, lineNoOpt, partsNoOpt);
       } else if (keyword.equals("router-signature")) {
         this.parseRouterSignatureLine(line, lineNoOpt, partsNoOpt);
+      } else if (keyword.equals("router-digest")) {
+        this.parseRouterDigestLine(line, lineNoOpt, partsNoOpt);
       } else if (line.startsWith("-----BEGIN")) {
         skipCrypto = true;
       } else if (line.startsWith("-----END")) {
@@ -573,7 +575,21 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl
     /* Not parsing crypto parts (yet). */
   }
 
+  private void parseRouterDigestLine(String line, String lineNoOpt,
+      String[] partsNoOpt) throws DescriptorParseException {
+    if (partsNoOpt.length != 2) {
+      throw new DescriptorParseException("Illegal line '" + line + "'.");
+    }
+    this.extraInfoDigest = ParseHelper.parseTwentyByteHexString(line,
+        partsNoOpt[1]);
+  }
+
   private void calculateDigest() throws DescriptorParseException {
+    if (this.extraInfoDigest != null) {
+      /* We already learned the descriptor digest of this bridge
+       * descriptor from a "router-digest" line. */
+      return;
+    }
     try {
       String ascii = new String(this.getRawDescriptorBytes(), "US-ASCII");
       String startToken = "extra-info ";
diff --git a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java
index 5237348..df3662f 100644
--- a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java
+++ b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java
@@ -125,6 +125,8 @@ public class ServerDescriptorImpl extends DescriptorImpl
         this.parseAllowSingleHopExitsLine(line, lineNoOpt, partsNoOpt);
       } else if (keyword.equals("dircacheport")) {
         this.parseDircacheportLine(line, lineNoOpt, partsNoOpt);
+      } else if (keyword.equals("router-digest")) {
+        this.parseRouterDigestLine(line, lineNoOpt, partsNoOpt);
       } else if (line.startsWith("-----BEGIN")) {
         crypto = new StringBuilder();
         crypto.append(line + "\n");
@@ -459,7 +461,21 @@ public class ServerDescriptorImpl extends DescriptorImpl
     this.dirPort = ParseHelper.parsePort(line, partsNoOpt[1]);
   }
 
+  private void parseRouterDigestLine(String line, String lineNoOpt,
+      String[] partsNoOpt) throws DescriptorParseException {
+    if (partsNoOpt.length != 2) {
+      throw new DescriptorParseException("Illegal line '" + line + "'.");
+    }
+    this.serverDescriptorDigest = ParseHelper.parseTwentyByteHexString(
+        line, partsNoOpt[1]);
+  }
+
   private void calculateDigest() throws DescriptorParseException {
+    if (this.serverDescriptorDigest != null) {
+      /* We already learned the descriptor digest of this bridge
+       * descriptor from a "router-digest" line. */
+      return;
+    }
     try {
       String ascii = new String(this.getRawDescriptorBytes(), "US-ASCII");
       String startToken = "router ";



More information about the tor-commits mailing list