[tor-commits] [metrics-utils/master] Remove deprecated bridge descriptor sanitizer.

karsten at torproject.org karsten at torproject.org
Wed Mar 2 17:22:09 UTC 2011


commit 96eb27ee126e01168245f6fc0713bfe2981202bb
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Wed Mar 2 18:20:02 2011 +0100

    Remove deprecated bridge descriptor sanitizer.
    
    There is at least one known issue in this version of the bridge descriptor
    sanitizer:  Bridge IP addresses contained in reject lines are not
    rewritten as 127.0.0.1.  There may be further issues.  People should use
    the bridge descriptor sanitizer that is part of metrics-db instead.
---
 bridge-desc-sanitizer/ConvertBridgeDescs.java |  461 -------------------------
 bridge-desc-sanitizer/HOWTO                   |  124 -------
 bridge-desc-sanitizer/LICENSE                 |   30 --
 bridge-desc-sanitizer/extract-bridges.sh      |    8 -
 4 files changed, 0 insertions(+), 623 deletions(-)

diff --git a/bridge-desc-sanitizer/ConvertBridgeDescs.java b/bridge-desc-sanitizer/ConvertBridgeDescs.java
deleted file mode 100644
index a088695..0000000
--- a/bridge-desc-sanitizer/ConvertBridgeDescs.java
+++ /dev/null
@@ -1,461 +0,0 @@
-import java.io.*;
-import java.util.*;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.codec.binary.*;
-
-public class ConvertBridgeDescs {
-
-  public static void main(String[] args) throws Exception {
-
-    System.out.println("\n                       THIS SOFTWARE IS "
-        + "DEPRECATED !\n\nThere is at least one known issue in this "
-        + "software:  Bridge IP addresses\ncontained in reject lines are "
-        + "not rewritten as 127.0.0.1.  There may be\nfurther issues.  "
-        + "Please use the bridge descriptor sanitizer that is part\nof "
-        + "metrics-db instead of this software:\n\n"
-        + "  https://gitweb.torproject.org/metrics-db.git\n");
-    System.exit(1);
-
-    long started = System.currentTimeMillis();
-
-    if (args.length < 5) {
-      System.err.println("Usage: java "
-          + ConvertBridgeDescs.class.getSimpleName()
-          + " <input directory> <geoip.txt file> <YYYY> <MM> "
-          + "<output directory>");
-      System.exit(1);
-    }
-    File inDir = new File(args[0]);
-    File geoipFile = new File(args[1]);
-    String year = args[2];
-    String month = args[3];
-    int yearInt = Integer.parseInt(year);
-    int monthInt = Integer.parseInt(month);
-    File outDir = new File(args[4]);
-    if (!outDir.exists()) {
-      outDir.mkdir();
-    }
-
-    SortedSet<File> statuses = new TreeSet<File>();
-    Set<File> descriptors = new HashSet<File>();
-    Set<File> extrainfos = new HashSet<File>();
-
-    System.out.print("Parsing geoip.txt file... ");
-    BufferedReader r = new BufferedReader(new FileReader(geoipFile));
-    String line0 = null;
-    SortedMap<Long, String> geoipDatabase = new TreeMap<Long, String>();
-    while ((line0 = r.readLine()) != null) {
-      if (!line0.startsWith("#"))
-        geoipDatabase.put(Long.parseLong(line0.split(",")[0]),
-            line0.substring(line0.indexOf(',') + 1));
-    }
-    System.out.println("Found " + geoipDatabase.size()
-        + " entries (expected 100,000 +- 10,000).");
-
-    System.out.println("Checking files in " + inDir.getAbsolutePath()
-        + "...");
-    Stack<File> directoriesLeftToParse = new Stack<File>();
-    directoriesLeftToParse.push(inDir);
-    String currentYearAndMonth = "from-tonga-" + year + "-" + month;
-    String previousYearAndMonth = "from-tonga-" + (monthInt == 1 ?
-        "" + (yearInt - 1) + "-12" :
-        year + "-" + (monthInt < 11 ? "0" : "") + (monthInt - 1));
-    String nextYearAndMonth = "from-tonga-" + (monthInt == 12 ?
-            "" + (yearInt + 1) + "-01" :
-            year + "-" + (monthInt < 9 ? "0" : "") + (monthInt + 1));
-    while (!directoriesLeftToParse.isEmpty()) {
-      File directoryOrFile = directoriesLeftToParse.pop();
-      String filename = directoryOrFile.getName();
-      boolean addDirectory = false;
-      if (directoryOrFile.isDirectory()) {
-        if (/* base directory */
-            filename.equals("in") ||
-            /* current month */
-            filename.startsWith(currentYearAndMonth) ||
-            /* last days of previous month */
-            (filename.startsWith(previousYearAndMonth)
-            && Integer.parseInt(filename.substring(19, 21)) > 24) ||
-            /* first days of next month */
-            (filename.startsWith(nextYearAndMonth)
-            && Integer.parseInt(filename.substring(19, 21)) < 6)) {
-          for (File fileInDir: directoryOrFile.listFiles()) {
-            directoriesLeftToParse.push(fileInDir);
-          }
-        }
-        continue;
-      }
-      if (filename.startsWith("cached-extrainfo")) {
-        extrainfos.add(directoryOrFile);
-      } else if (filename.equals("bridge-descriptors")) {
-        descriptors.add(directoryOrFile);
-      } else if (filename.equals("networkstatus-bridges")) {
-        statuses.add(directoryOrFile);
-      }
-    }
-
-    int days = ((extrainfos.size() / 2 + descriptors.size()
-        + statuses.size()) + 3 * 24) / (3 * 48);
-    System.out.println("Found " + extrainfos.size()
-        + " cached-extrainfo[.new] files, " + descriptors.size()
-        + " bridge-descriptors files, and " + statuses.size()
-        + " networkstatus-bridges files, covering approximately " + days
-        + " days.");
-
-    System.out.print("Parsing extra-info descriptors");
-    String[] hex = new String[] { "0", "1", "2", "3", "4", "5", "6", "7",
-        "8", "9", "a", "b", "c", "d", "e", "f" };
-    for (String x : hex)
-      for (String y : hex)
-        new File(outDir + File.separator + "extra-infos" + File.separator
-            + x + File.separator + y).mkdirs();
-    Set<File> writtenExtrainfos = new HashSet<File>();
-    Map<String, String> extrainfoMapping = new HashMap<String, String>();
-    int parsed = 0;
-    for (File file : extrainfos) {
-      if (parsed++ > extrainfos.size() / days) {
-        System.out.print(".");
-        parsed = 0;
-      }
-      BufferedReader br = new BufferedReader(new FileReader(file));
-      String line = null;
-      StringBuilder original = null, scrubbed = null;
-      boolean skipSignature = false;
-      while ((line = br.readLine()) != null) {
-        if (skipSignature && !line.equals("-----END SIGNATURE-----")) {
-          continue;
-        } else if (line.startsWith("extra-info ")) {
-          original = new StringBuilder(line + "\n");
-          scrubbed = new StringBuilder("extra-info Unnamed "
-              + DigestUtils.shaHex(Hex.decodeHex(
-              line.split(" ")[2].toCharArray())).toUpperCase() + "\n");
-        } else if (line.startsWith("published ")
-            || line.startsWith("write-history ")
-            || line.startsWith("read-history ")
-            || line.startsWith("geoip-start-time ")
-            || line.startsWith("geoip-client-origins ")) {
-          original.append(line + "\n");
-          scrubbed.append(line + "\n");
-        } else if (line.startsWith("router-signature")) {
-          String originalDesc = original.toString() + line + "\n";
-          String originalHash = DigestUtils.shaHex(originalDesc);
-          String scrubbedDesc = scrubbed.toString();
-          String scrubbedHash = DigestUtils.shaHex(scrubbedDesc);
-          if (extrainfoMapping.containsKey(originalHash) &&
-              !extrainfoMapping.get(originalHash).equals(scrubbedHash)) {
-            System.out.println("We already have an extra-info mapping "
-                + "from " + originalHash + " to "
-                + extrainfoMapping.get(originalHash) + ", but we now want "
-                + "to add a mapping to " + scrubbedHash + ". Exiting");
-            System.exit(1);
-          }
-          extrainfoMapping.put(originalHash, scrubbedHash);
-          File out = new File(outDir + File.separator + "extra-infos"
-              + File.separator + scrubbedHash.charAt(0) + File.separator
-              + scrubbedHash.charAt(1) + File.separator + scrubbedHash);
-          if (!out.exists()) {
-            BufferedWriter bw = new BufferedWriter(new FileWriter(out));
-            bw.write(scrubbedDesc);
-            bw.close();
-            writtenExtrainfos.add(out);
-          }
-        } else if (line.equals("-----BEGIN SIGNATURE-----")) {
-          skipSignature = true;
-        } else if (line.equals("-----END SIGNATURE-----")) {
-          skipSignature = false;
-        } else {
-          System.out.println("Unrecognized line '" + line + "'. Exiting");
-          System.exit(1);
-        }
-      }
-      br.close();
-    }
-    System.out.println("\nWrote " + writtenExtrainfos.size()
-        + " extra-info descriptors.");
-
-    System.out.print("Parsing server descriptors");
-    for (String x : hex)
-      for (String y : hex)
-        new File(outDir + File.separator + "descriptors" + File.separator
-            + x + File.separator + y).mkdirs();
-    Set<File> writtenDescriptors = new HashSet<File>();
-    Map<File, File> referencedExtraInfos = new HashMap<File, File>();
-    Map<String, String> descriptorMapping = new HashMap<String, String>();
-    int found = 0, notfound = 0;
-    parsed = 0;
-    String haveExtraInfo = null;
-    for (File file : descriptors) {
-      if (parsed++ > descriptors.size() / days) {
-        System.out.print(".");
-        parsed = 0;
-      }
-      BufferedReader br = new BufferedReader(new FileReader(file));
-      String line = null, country = null;
-      StringBuilder original = null, scrubbed = null;
-      boolean skipCrypto = false, contactWritten = false;
-      while ((line = br.readLine()) != null) {
-        if (skipCrypto && !line.startsWith("-----END ")) {
-          original.append(line + "\n");
-          continue;
-        } else if (line.startsWith("router ")) {
-          original = new StringBuilder(line + "\n");
-          country = "zz";
-          String[] ipParts = line.split(" ")[2].replace('.', ' ').split(" ");
-          long ipNum = Long.parseLong(ipParts[0]) * 256L * 256L * 256L
-              + Long.parseLong(ipParts[1]) * 256L * 256L
-              + Long.parseLong(ipParts[2]) * 256L
-              + Long.parseLong(ipParts[3]);
-          long intervalStart = -1;
-          if (ipNum >= geoipDatabase.firstKey()) {
-            intervalStart = geoipDatabase.subMap(0L, ipNum).lastKey();
-            String dbContent = geoipDatabase.get(intervalStart);
-            long intervalEnd = Long.parseLong(dbContent.split(",")[0]);
-            if (ipNum <= intervalEnd)
-              country = dbContent.split(",")[1].toLowerCase();
-          }
-          scrubbed = new StringBuilder("router Unnamed 127.0.0.1 "
-              + line.split(" ")[3] + " " + line.split(" ")[4] + " "
-              + line.split(" ")[5] + "\n");
-          contactWritten = false;
-          haveExtraInfo = null;
-        } else if (line.startsWith("opt fingerprint ")) {
-          original.append(line + "\n");
-          scrubbed.append("opt fingerprint");
-          String fingerprint = DigestUtils.shaHex(Hex.decodeHex(
-              line.substring(16).replaceAll(" ", "").toCharArray())).
-              toUpperCase();
-          for (int i = 0; i < fingerprint.length() / 4; i++)
-            scrubbed.append(" " + fingerprint.substring(4 * i, 4 * (i + 1)));
-          scrubbed.append("\n");
-        } else if (line.startsWith("contact ")) {
-          original.append(line + "\n");
-          scrubbed.append("contact somebody at example dot " + country
-              + "\n");
-          contactWritten = true;
-        } else if (line.startsWith("router-signature")) {
-          String originalDesc = original.toString() + line + "\n";
-          String originalHash = DigestUtils.shaHex(originalDesc);
-          String scrubbedDesc = scrubbed.toString();
-          String scrubbedHash = DigestUtils.shaHex(scrubbedDesc);
-          if (descriptorMapping.containsKey(originalHash) &&
-              !descriptorMapping.get(originalHash).equals(scrubbedHash)) {
-            System.out.println("We already have a descriptor mapping "
-                + "from " + originalHash + " to "
-                + descriptorMapping.get(originalHash) + ", but we now "
-                + "want to add a mapping to " + scrubbedHash
-                + ". Exiting");
-            System.exit(1);
-          }
-          descriptorMapping.put(originalHash, scrubbedHash);
-          if (haveExtraInfo != null) {
-            File out = new File(outDir + File.separator + "descriptors"
-                + File.separator + scrubbedHash.charAt(0) + File.separator
-                + scrubbedHash.charAt(1) + File.separator + scrubbedHash);
-            if (!out.exists()) {
-              BufferedWriter bw2 = new BufferedWriter(new FileWriter(out));
-              bw2.write(scrubbedDesc);
-              bw2.close();
-              writtenDescriptors.add(out);
-              String extraInfoHash = haveExtraInfo.toLowerCase();
-              File extrainfoFile = new File(outDir + File.separator
-                  + "extra-infos" + File.separator
-                  + extraInfoHash.charAt(0) + File.separator
-                  + extraInfoHash.charAt(1) + File.separator
-                  + extraInfoHash);
-              if (!extrainfoFile.exists()) {
-                System.out.println("Extra-info descriptor '"
-                    + extrainfoFile + "' does not exist.");
-                System.exit(1);
-              }
-              referencedExtraInfos.put(out, extrainfoFile);
-            }
-          }
-        } else if (line.startsWith("opt extra-info-digest ")) {
-          String originalExtraInfo = line.split(" ")[2].toLowerCase();
-          if (!extrainfoMapping.containsKey(originalExtraInfo)) {
-            notfound++;
-          } else {
-            found++;
-            original.append(line + "\n");
-            haveExtraInfo = extrainfoMapping.get(originalExtraInfo).
-                toUpperCase();
-            scrubbed.append("opt extra-info-digest " + haveExtraInfo
-                + "\n");
-          }
-        } else if (line.startsWith("reject ")
-            || line.startsWith("accept ")) {
-          if (!contactWritten) {
-            scrubbed.append("contact nobody at example dot " + country
-                + "\n");
-            contactWritten = true;
-          }
-          original.append(line + "\n");
-          scrubbed.append(line + "\n");
-        } else if (line.startsWith("platform ")
-            || line.startsWith("opt protocols ")
-            || line.startsWith("published ")
-            || line.startsWith("uptime ")
-            || line.startsWith("bandwidth ")
-            || line.startsWith("uptime ")
-            || line.startsWith("opt hibernating ")
-            || line.equals("opt hidden-service-dir")
-            || line.equals("opt caches-extra-info")) {
-          original.append(line + "\n");
-          scrubbed.append(line + "\n");
-        } else if (line.startsWith("family ")) {
-          StringBuilder familyLine = new StringBuilder("family");
-          for (String s : line.substring(7).split(" ")) {
-            if (s.startsWith("$"))
-              familyLine.append(" $" + DigestUtils.shaHex(Hex.decodeHex(
-                  s.substring(1).toCharArray())).toUpperCase());
-            else
-              familyLine.append(" " + s);
-          }
-          original.append(line + "\n");
-          scrubbed.append(familyLine.toString() + "\n");
-        } else if (line.startsWith("@purpose ")) {
-          continue;
-        } else if (line.startsWith("-----BEGIN ")
-            || line.equals("onion-key") || line.equals("signing-key")) {
-          skipCrypto = true;
-          original.append(line + "\n");
-        } else if (line.startsWith("-----END ")) {
-          skipCrypto = false;
-          original.append(line + "\n");
-        } else {
-          System.out.println("Unrecognized line '" + line + "'. Exiting");
-          System.exit(1);
-        }
-      }
-      br.close();
-    }
-    System.out.println("\nWrote " + writtenDescriptors.size()
-        + " bridge descriptors. While parsing, we found that we parsed "
-        + found + " extra-info identifiers before, but are missing "
-        + notfound + ". (The number of missing identifiers should be "
-        + "significantly smaller.)");
-
-    System.out.print("Parsing network statuses");
-    Set<File> referencedDescriptors = new HashSet<File>();
-    parsed = notfound = found = 0;
-    for (File file : statuses) {
-      if (parsed++ > statuses.size() / days) {
-        System.out.print(".");
-        parsed = 0;
-      }
-      if (!file.getParent().substring(file.getParent().
-          indexOf("from-tonga-")).startsWith(currentYearAndMonth)) {
-        continue;
-      }
-      BufferedReader br = new BufferedReader(new FileReader(file));
-      String line = null;
-      StringBuilder scrubbed = new StringBuilder();
-      boolean addSLine = false;
-      while ((line = br.readLine()) != null) {
-        if (line.startsWith("r ")) {
-          String[] parts = line.split(" ");
-          String bridgeIdentity = parts[2] + "==";
-          String hexBridgeIdentity = Hex.encodeHexString(
-              Base64.decodeBase64(bridgeIdentity));
-          String hashedBridgeIdentity2 = Base64.encodeBase64String(
-              DigestUtils.sha(Base64.decodeBase64(bridgeIdentity))).
-              replace("=", "");
-          String hashedBridgeIdentity = Base64.encodeBase64String(
-              DigestUtils.sha(Base64.decodeBase64(bridgeIdentity))).
-              substring(0, 27);
-          String descIdentifier = parts[3] + "==";
-          String hexDescIdentifier = Hex.encodeHexString(
-              Base64.decodeBase64(descIdentifier));
-          if (!descriptorMapping.containsKey(hexDescIdentifier)) {
-            notfound++;
-            addSLine = false;
-          } else {
-            found++;
-            String refDesc = descriptorMapping.get(hexDescIdentifier).
-                toLowerCase();
-            File descriptorFile = new File(outDir + File.separator
-                + "descriptors" + File.separator + refDesc.charAt(0)
-                + File.separator + refDesc.charAt(1) + File.separator
-                + refDesc);
-            if (!descriptorFile.exists()) {
-              System.out.println("Descriptor file '"
-                  + descriptorFile.getAbsolutePath() + "' does not exist.");
-            }
-            String replacementDescIdentifier = Base64.encodeBase64String(
-                Hex.decodeHex(descriptorMapping.get(hexDescIdentifier).
-                toCharArray())).substring(0, 27);
-            scrubbed.append("r Unnamed " + hashedBridgeIdentity
-                + " " + replacementDescIdentifier + " " + parts[4] + " "
-                + parts[5] + " 127.0.0.1 " + parts[7] + " " + parts[8]
-                + "\n");
-            addSLine = true;
-            referencedDescriptors.add(descriptorFile);
-          }
-        } else if (line.startsWith("s ")) {
-          if (addSLine) {
-            scrubbed.append(line + "\n");
-          }
-        } else {
-          System.out.println("Unknown line: " + line);
-          System.exit(1);
-        }
-      }
-      String timeString = file.getParent().substring(file.getParent().
-          indexOf("from-tonga-") + 11);
-      String[] date = timeString.substring(0, 10).split("-");
-      String time = timeString.substring(11, 17);
-      File dir = new File(outDir + File.separator + "statuses"
-          + File.separator + date[0] + File.separator + date[1]
-          + File.separator + date[2] + File.separator);
-      dir.mkdirs();
-      File out = new File(dir.getAbsolutePath() + File.separator + date[0]
-          + date[1] + date[2] + "-" + time + "-"
-          + "4A0CCD2DDC7995083D73F5D667100C8A5831F16D");
-      if (!out.exists()) {
-        BufferedWriter bw3 = new BufferedWriter(new FileWriter(out));
-        bw3.write(scrubbed.toString());
-        bw3.close();
-      }
-    }
-    System.out.println("\nWhile parsing, we found that we parsed "
-        + found + " bridge descriptors before, but are missing "
-        + notfound + ". (The number of missing identifiers should be "
-        + "significantly smaller.)");
-
-    Set<File> deleteFromReferencedExtraInfos = new HashSet<File>();
-    for (File e : referencedExtraInfos.keySet()) {
-      if (!referencedDescriptors.contains(e)) {
-        deleteFromReferencedExtraInfos.add(e);
-      }
-    }
-    for (File e : deleteFromReferencedExtraInfos) {
-      referencedExtraInfos.remove(e);
-    }
-    SortedSet<File> deleteDescriptors = new TreeSet<File>();
-    for (File e : writtenDescriptors) {
-      if (!referencedDescriptors.contains(e)) {
-        deleteDescriptors.add(e);
-      }
-    }
-    SortedSet<File> deleteExtraInfos = new TreeSet<File>();
-    for (File e : writtenExtrainfos) {
-      if (!referencedExtraInfos.values().contains(e)) {
-        deleteExtraInfos.add(e);
-      }
-    }
-    System.out.println("Deleting " + deleteDescriptors.size()
-        + " unreferenced bridge descriptors and "
-        + deleteExtraInfos.size() + " extra-info descriptors (keeping "
-        + (writtenDescriptors.size() - deleteDescriptors.size())
-        + " bridge descriptors and " + (writtenExtrainfos.size()
-        - deleteExtraInfos.size()) + " extra-info descriptors).");
-    for (File e : deleteDescriptors)
-      e.delete();
-    for (File e : deleteExtraInfos)
-      e.delete();
-
-    long finished = System.currentTimeMillis();
-    System.out.println("Processing took " + ((finished - started) / 1000)
-        + " seconds.");
-  }
-}
-
diff --git a/bridge-desc-sanitizer/HOWTO b/bridge-desc-sanitizer/HOWTO
deleted file mode 100644
index 418dc5f..0000000
--- a/bridge-desc-sanitizer/HOWTO
+++ /dev/null
@@ -1,124 +0,0 @@
-Bridge descriptor sanitizer
-
----------------------------------------------------------------------------
-
-                       THIS SOFTWARE IS DEPRECATED !
-
-There is at least one known issue in this software:  Bridge IP addresses
-contained in reject lines are not rewritten as 127.0.0.1.  There may be
-further issues.  Please use the bridge descriptor sanitizer that is part
-of metrics-db instead of this software:
-
-  https://gitweb.torproject.org/metrics-db.git
-
----------------------------------------------------------------------------
-
-Introduction:
-
-The bridge authority Tonga keeps a list of bridges in order to serve bridge
-addresses and descriptors to its clients. Every half hour, Tonga copies a
-snapshot of the known bridge descriptors to moria where these descriptors
-are archived for later statistical analysis. As a guiding principle, the
-Tor project makes all data that it uses for statistical analysis available
-to the interested public, in order to maximize transparency towards the
-community. However, the bridge descriptors contain the IP addresses and
-other contact information of bridges that must not be made public, or the
-purpose of bridges as non-public entry points into the Tor network would be
-obsolete. This script takes the half-hourly snapshots as input, removes all
-possibly sensitive information from the descriptors, and puts out the
-sanitized bridge descriptors that are safe to be published.
-
----------------------------------------------------------------------------
-
-Processing steps:
-
-The following steps are taken to remove all potentially sensitive
-information from the bridge descriptors while keeping them useful for
-statistical analysis.
-
-1. Replace the bridge identity with its SHA1 value
-
-   Clients can request a bridge's current descriptor by sending its
-   identity string to the bridge authority. This is a feature to make
-   bridges on dynamic IP addresses useful. Therefore, the original
-   identities (and anything that could be used to derive them) need to be
-   removed from the descriptors. The bridge identity is replaced with its
-   SHA1 hash value. The idea is to have a consistent replacement that
-   remains stable over months or even years (without keeping a secret for a
-   keyed hash function).
-
-2. Remove all cryptographic keys and signatures
-
-   It would be straightforward to learn about the bridge identity from the
-   bridge's public key. Replacing keys by newly generated ones seemed to be
-   unnecessary (and would involve keeping a state over months/years), so
-   that all cryptographic objects have simply been removed. 
-
-3. Replace IP address with 127.0.0.1
-
-   Of course, the IP address needs to be removed, too. However, the IP
-   address is resolved to a country code first and the result written to
-   the contact line as "somebody at example dot de" for Germany, etc. The
-   ports are kept unchanged though.
-
-4. Replace contact information
-
-   If there is contact information in a descriptor, the contact line is
-   changed to "somebody at ...". If there is none, a contact line is added
-   saying "nobody at ..." in order to put in the country code.
-
-5. Replace nickname with Unnamed
-
-   The bridge nicknames might give hints on the location of the bridge if
-   chosen without care; e.g. a bridge nickname might be very similar to the
-   operators' relay nicknames which might be located on adjacent IP
-   addresses. All bridge nicknames are therefore replaced with the string
-   Unnamed.
-
-Note that these processing steps only prevent people from learning about
-new bridge locations. People who already know a bridge identity or location
-can easily learn more about this bridge from the sanitized descriptors.
-This is useful for statistical analysis, e.g. to filter out bridges that
-have been running as relays before.
-
----------------------------------------------------------------------------
-
-Quick Start:
-
-The following steps are necessary to process the half-hourly snapshots as
-collected by moria:
-
-- Install Java 5 or higher.
-
-- Download Apache Commons Codec 1.4 or higher for Base 64 and hex encoding
-  from http://commons.apache.org/codec/ and place the .jar (in the
-  following assumed to be commons-codec-1.4.jar) in the same directory as
-  this HOWTO file.
-
-- Copy the half-hourly snapshots named from-tonga-YYYY-MM-DDThhmmssZ.tar.gz
-  in a directory called data/ in the same directory as this HOWTO file.
-
-- Run ./extract-bridges.sh to extract the half-hourly snapshots in data/
-  to separate directories in the newly created subdirectory in/ .
-
-- Copy the geoip.txt from the Tor sources (from /src/config/) to the same
-  directory as this HOWTO file.
-
-- Compile the Java class using
-
-  $ javac -cp commons-codec-1.4.jar ConvertBridgeDescs.java
-
-- Run the script, providing it with the parameters it needs:
-
-  java -cp .:commons-codec-1.4.jar ConvertBridgeDescs
-           <input directory> <geoip.txt file>
-           <YYYY> <MM> <output directory>
-
-  Note that YYYY and MM specify the month that shall be processed. The other
-  descriptors in the input directory are ignored.
-
-  A sample invocation might be:
-
-  $ java -cp .:commons-codec-1.4.jar ConvertBridgeDescs in/ geoip.txt
-        2008 10 out/
-
diff --git a/bridge-desc-sanitizer/LICENSE b/bridge-desc-sanitizer/LICENSE
deleted file mode 100644
index ad177ea..0000000
--- a/bridge-desc-sanitizer/LICENSE
+++ /dev/null
@@ -1,30 +0,0 @@
-Copyright 2009-2010 The Tor Project
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the following disclaimer
-  in the documentation and/or other materials provided with the
-  distribution.
-
-* Neither the names of the copyright owners nor the names of its
-  contributors may be used to endorse or promote products derived from
-  this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/bridge-desc-sanitizer/extract-bridges.sh b/bridge-desc-sanitizer/extract-bridges.sh
deleted file mode 100755
index 5f412c3..0000000
--- a/bridge-desc-sanitizer/extract-bridges.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-mkdir "in/"
-for i in `ls data/ | cut -c 1-29`
-do
-mkdir "in/"$i
-tar -C "in/"$i -xf "data/"$i".tar.gz"
-done
-



More information about the tor-commits mailing list