[tor-commits] [metrics-db/master] Extract certificates from votes while parsing them.

karsten at torproject.org karsten at torproject.org
Fri Apr 1 12:02:35 UTC 2011


commit 4d74615040dc9b55ecee9f7beb4326275d006bbd
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Fri Apr 1 14:00:01 2011 +0200

    Extract certificates from votes while parsing them.
---
 src/org/torproject/ernie/db/ArchiveWriter.java     |   20 ++++++++++++--
 .../torproject/ernie/db/RelayDescriptorParser.java |   28 +++++++++++++++++---
 2 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/org/torproject/ernie/db/ArchiveWriter.java b/src/org/torproject/ernie/db/ArchiveWriter.java
index 68cdbaa..e30cd1b 100644
--- a/src/org/torproject/ernie/db/ArchiveWriter.java
+++ b/src/org/torproject/ernie/db/ArchiveWriter.java
@@ -12,7 +12,7 @@ import org.apache.commons.codec.binary.*;
 public class ArchiveWriter {
   private Logger logger;
   private File outputDirectory;
-  private int storedConsensuses = 0, storedVotes = 0,
+  private int storedConsensuses = 0, storedVotes = 0, storedCerts = 0,
       storedServerDescriptors = 0, storedExtraInfoDescriptors = 0;
 
   public ArchiveWriter(File outputDirectory) {
@@ -68,6 +68,18 @@ public class ArchiveWriter {
     }
   }
 
+  public void storeCertificate(byte[] data, String fingerprint,
+      long published) {
+    SimpleDateFormat printFormat = new SimpleDateFormat(
+        "yyyy-MM-dd-HH-mm-ss");
+    printFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+    String filename = outputDirectory + "/certs/"
+        + fingerprint + "-" + printFormat.format(new Date(published));
+    if (this.store(data, filename)) {
+      this.storedCerts++;
+    }
+  }
+
   public void storeServerDescriptor(byte[] data, String digest,
       long published) {
     SimpleDateFormat printFormat = new SimpleDateFormat("yyyy/MM/");
@@ -99,11 +111,13 @@ public class ArchiveWriter {
   public void intermediateStats(String event) {
     intermediateStats.append("While " + event + ", we stored "
         + this.storedConsensuses + " consensus(es), " + this.storedVotes
-        + " vote(s), " + this.storedServerDescriptors
-        + " server descriptor(s), and " + this.storedExtraInfoDescriptors
+        + " vote(s), " + this.storedCerts + " certificate(s), "
+        + this.storedServerDescriptors + " server descriptor(s), and "
+        + this.storedExtraInfoDescriptors
         + " extra-info descriptor(s) to disk.\n");
     this.storedConsensuses = 0;
     this.storedVotes = 0;
+    this.storedCerts = 0;
     this.storedServerDescriptors = 0;
     this.storedExtraInfoDescriptors = 0;
   }
diff --git a/src/org/torproject/ernie/db/RelayDescriptorParser.java b/src/org/torproject/ernie/db/RelayDescriptorParser.java
index bfd0033..089b743 100644
--- a/src/org/torproject/ernie/db/RelayDescriptorParser.java
+++ b/src/org/torproject/ernie/db/RelayDescriptorParser.java
@@ -77,11 +77,21 @@ public class RelayDescriptorParser {
         boolean isConsensus = true;
         String validAfterTime = null, fingerprint = null,
             dirSource = null;
-        long validAfter = -1L;
+        long validAfter = -1L, dirKeyPublished = -1L;
         SortedSet<String> dirSources = new TreeSet<String>();
         SortedSet<String> serverDescriptors = new TreeSet<String>();
         SortedSet<String> hashedRelayIdentities = new TreeSet<String>();
+        StringBuilder certificateStringBuilder = null;
+        String certificateString = null;
         while ((line = br.readLine()) != null) {
+          if (certificateStringBuilder != null) {
+            if (line.startsWith("r ")) {
+              certificateString = certificateStringBuilder.toString();
+              certificateStringBuilder = null;
+            } else {
+              certificateStringBuilder.append(line + "\n");
+            }
+          }
           if (line.equals("vote-status vote")) {
             isConsensus = false;
           } else if (line.startsWith("valid-after ")) {
@@ -91,8 +101,16 @@ public class RelayDescriptorParser {
             dirSource = line.split(" ")[2];
           } else if (line.startsWith("vote-digest ")) {
             dirSources.add(dirSource);
+          } else if (line.startsWith("dir-key-certificate-version ")) {
+            certificateStringBuilder = new StringBuilder();
+            certificateStringBuilder.append(line + "\n");
           } else if (line.startsWith("fingerprint ")) {
             fingerprint = line.split(" ")[1];
+          } else if (line.startsWith("dir-key-published ")) {
+            String dirKeyPublishedTime = line.substring(
+                "dir-key-published ".length());
+            dirKeyPublished = parseFormat.parse(dirKeyPublishedTime).
+                getTime();
           } else if (line.startsWith("r ")) {
             String[] parts = line.split(" ");
             if (parts.length < 9) {
@@ -137,9 +155,11 @@ public class RelayDescriptorParser {
               byte[] forDigest = new byte[sig - start];
               System.arraycopy(data, start, forDigest, 0, sig - start);
               String digest = DigestUtils.shaHex(forDigest).toUpperCase();
-              if (this.aw != null) {
-                this.aw.storeVote(data, validAfter, dirSource, digest);
-              }
+              this.aw.storeVote(data, validAfter, dirSource, digest);
+            }
+            if (certificateString != null) {
+              this.aw.storeCertificate(certificateString.getBytes(),
+                  dirSource, dirKeyPublished);
             }
           }
         }



More information about the tor-commits mailing list