commit 96eb27ee126e01168245f6fc0713bfe2981202bb Author: Karsten Loesing karsten.loesing@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%5Cn"); - 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 -
tor-commits@lists.torproject.org