tor-commits
Threads by month
- ----- 2025 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 213843 discussions

02 Jan '12
commit 5a988db9a78161240a9f3146936a57dfc0a6734e
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun Jan 1 09:56:26 2012 -0800
Downgrading protocolinfo version mismatch to INFO
The response for PROTOCOLINFO queries do not necessarily need to be what we
requested. We make a best effort to parse any response as a v1 response, and
warned if the response was for something besides v1. Downgrading the warning
from WARN to INFO since this is a valid tor response and, if we're still able
to parse it, the user doesn't really need to be alerted.
If the version mismatch can't be handled like a v1 response then that most
likely *will* cause warnings or errors that we'll alert the user of.
---
stem/connection.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/stem/connection.py b/stem/connection.py
index 7cb76be..6bd50fd 100644
--- a/stem/connection.py
+++ b/stem/connection.py
@@ -772,7 +772,7 @@ class ProtocolInfoResponse(stem.socket.ControlMessage):
# an effort to parse like a v1 response.
if self.protocol_version != 1:
- log.warn("We made a PROTOCOLINFO v1 query but got a version %i response instead. We'll still try to use it, but this may cause problems." % self.protocol_version)
+ log.info("We made a PROTOCOLINFO version 1 query but got a version %i response instead. We'll still try to use it, but this may cause problems." % self.protocol_version)
elif line_type == "AUTH":
# Line format:
# AuthLine = "250-AUTH" SP "METHODS=" AuthMethod *("," AuthMethod)
1
0

02 Jan '12
commit 4a5586afb64d50c627652c1ead9314596cb0b36c
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun Jan 1 10:24:38 2012 -0800
Deduplicating unknown auth type messages
There's quite a few log messages that really don't make sense to repeatedly
log. Adding optinal logging deduplication and applying it to the INFO level
message about getting an auth method we don't recognize.
---
stem/connection.py | 3 ++-
stem/util/log.py | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/stem/connection.py b/stem/connection.py
index 6bd50fd..37578cf 100644
--- a/stem/connection.py
+++ b/stem/connection.py
@@ -794,7 +794,8 @@ class ProtocolInfoResponse(stem.socket.ControlMessage):
auth_methods.append(AuthMethod.COOKIE)
else:
unknown_auth_methods.append(method)
- log.info("PROTOCOLINFO response had an unrecognized authentication method: %s" % method)
+ message_id = "stem.connection.unknown_auth_%s" % method
+ log.log_once(message_id, log.INFO, "PROTOCOLINFO response had an unrecognized authentication method: %s" % method)
# our auth_methods should have a single AuthMethod.UNKNOWN entry if
# any unknown authentication methods exist
diff --git a/stem/util/log.py b/stem/util/log.py
index f9efa09..de84ead 100644
--- a/stem/util/log.py
+++ b/stem/util/log.py
@@ -37,6 +37,10 @@ LOG_VALUES = {
LOGGER = logging.getLogger("stem")
+# There's some messages that we don't want to log more than once. This set has
+# the messages IDs that we've logged which fall into this category.
+DEDUPLICATION_MESSAGE_IDS = set()
+
# Adds a default nullhandler for the stem logger, suppressing the 'No handlers
# could be found for logger "stem"' warning as per...
# http://docs.python.org/release/3.1.3/library/logging.html#configuring-loggi…
@@ -81,6 +85,27 @@ def log(runlevel, message):
if runlevel:
LOGGER.log(LOG_VALUES[runlevel], message)
+def log_once(message_id, runlevel, message):
+ """
+ Logs a message at the given runlevel. If a message with this ID has already
+ been logged then this is a no-op.
+
+ Arguments:
+ message_id (str) - unique message identifier to deduplicate on
+ runlevel (Runlevel) - runlevel to log the message at, logging is skipped if
+ None
+ message (str) - message to be logged
+
+ Returns:
+ True if we log the message, False otherwise
+ """
+
+ if not runlevel or message_id in DEDUPLICATION_MESSAGE_IDS:
+ return False
+ else:
+ DEDUPLICATION_MESSAGE_IDS.add(message_id)
+ log(runlevel, message)
+
# shorter aliases for logging at a runlevel
def trace(message): log(Runlevel.TRACE, message)
def debug(message): log(Runlevel.DEBUG, message)
1
0

02 Jan '12
commit ea511db40259a74d57d87a40339b41e66fe34d9a
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Jan 2 14:32:13 2012 -0800
Uncaught IOError when checking version in integ
If our attempt to look up 'tor --version' failed then we'd trigger an uncaught
IOError. We're only checking the version there to determine if we should skip
the test due to tor being out of date, so making that a best-effort lookup
instead. Caught by boerni.
---
test/integ/socket/control_message.py | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/test/integ/socket/control_message.py b/test/integ/socket/control_message.py
index 7b14872..b939c87 100644
--- a/test/integ/socket/control_message.py
+++ b/test/integ/socket/control_message.py
@@ -121,8 +121,15 @@ class TestControlMessage(unittest.TestCase):
"""
req_version = stem.version.Requirement.GETINFO_CONFIG_TEXT
- if stem.version.get_system_tor_version() < req_version:
- self.skipTest("(requires %s)" % req_version)
+
+ try:
+ if stem.version.get_system_tor_version() < req_version:
+ self.skipTest("(requires %s)" % req_version)
+ except IOError:
+ # This is a best-effot lookup to avoid showing a valid failure. If the
+ # version lookup fails then running the test.
+
+ pass
# We can't be certain of the order, and there may be extra config-text
# entries as per...
1
0

[metrics-lib/master] Start implementing extra-info descriptor parsing.
by karsten@torproject.org 02 Jan '12
by karsten@torproject.org 02 Jan '12
02 Jan '12
commit 908612803a9c59a1393a93df41c37b5f4bab0022
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Jan 2 17:37:34 2012 +0100
Start implementing extra-info descriptor parsing.
---
.../descriptor/RelayExtraInfoDescriptor.java | 206 +++++++-
.../impl/RelayExtraInfoDescriptorImpl.java | 560 ++++++++++++++++++++
2 files changed, 765 insertions(+), 1 deletions(-)
diff --git a/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java b/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
index 5c04aed..853a60a 100644
--- a/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
+++ b/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
@@ -1,7 +1,211 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
+import java.util.List;
+import java.util.SortedMap;
+
public interface RelayExtraInfoDescriptor extends Descriptor {
+
+ /* Return the relay's nickname. */
+ public String getNickname();
+
+ /* Return the relay's fingerprint. */
+ public String getFingerprint();
+
+ /* Return the publication time of this descriptor. */
+ public long getPublishedMillis();
+
+ /* Return the read history contained in this descriptor, or null if no
+ * read history is contained. */
+ public BandwidthHistory getReadHistory();
+
+ /* Return the write history contained in this descriptor, or null if no
+ * read history is contained. */
+ public BandwidthHistory getWriteHistory();
+
+ /* Return the SHA1 digest of the GeoIP database used by this relay, or
+ * null if no GeoIP database digest is included. */
+ public String getGeoipDbDigest();
+
+ /* Return the end of the included directory request statistics interval,
+ * or -1 if no directory request statistics are included. */
+ public long getDirreqStatsEndMillis();
+
+ /* Return the interval length of the included directory request
+ * statistics, or -1 if no directory request statistics are included. */
+ public long getDirreqStatsIntervalLength();
+
+ /* Return statistics on unique IP addresses requesting v2 network
+ * statuses with map keys being country codes and map values being
+ * numbers of unique IP addresses rounded up to the nearest multiple of
+ * 8, or null if no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV2Ips();
+
+ /* Return statistics on unique IP addresses requesting v3 network status
+ * consensuses with map keys being country codes and map values being
+ * numbers of unique IP addresses rounded up to the nearest multiple of
+ * 8, or null if no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV3Ips();
+
+ /* Return statistics on directory requests for v2 network statuses with
+ * map keys being country codes and map values being request numbers
+ * rounded up to the nearest multiple of 8, or null if no such
+ * statistics are included. */
+ public SortedMap<String, Integer> getDirreqV2Reqs();
+
+ /* Return statistics on directory requests for v3 network status
+ * consensuses with map keys being country codes and map values being
+ * request numbers rounded up to the nearest multiple of 8, or null if
+ * no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV3Reqs();
+
+ /* Return the share of requests for v2 network statuses that the
+ * directory expects to receive from clients, or -1.0 if no such
+ * statistics are included. */
+ public double getDirreqV2Share();
+
+ /* Return the share of requests for v3 network status consensuses that
+ * the directory expects to receive from clients, or -1.0 if no such
+ * statistics are included. */
+ public double getDirreqV3Share();
+
+ /* Return statistics on directory request responses for v2 network
+ * statuses with map keys being response strings and map values being
+ * response numbers rounded up to the nearest multiple of 4, or null if
+ * no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV2Resp();
+
+ /* Return statistics on directory request responses for v3 network
+ * status consensuses with map keys being response strings and map
+ * values being response numbers rounded up to the nearest multiple of
+ * 4, or null if no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV3Resp();
+
+ /* Return statistics on direct directory requests asking for v2 network
+ * statuses with map keys being statistic keys and map values being
+ * statistic values, or null if no such statistics are included. */
+ public SortedMap<String, Integer> getDirreqV2DirectDl();
+
+ /* Return statistics on direct directory requests asking for v3 network
+ * status consensuses with map keys being statistic keys and map
+ * values being statistic values, or null if no such statistics are
+ * included. */
+ public SortedMap<String, Integer> getDirreqV3DirectDl();
+
+ /* Return statistics on tunneled directory requests asking for v2
+ * network statuses with map keys being statistic keys and map values
+ * being statistic values, or null if no such statistics are
+ * included. */
+ public SortedMap<String, Integer> getDirreqV2TunneledDl();
+
+ /* Return statistics on tunneled directory requests asking for v3
+ * network status consensuses with map keys being statistic keys and map
+ * values being statistic values, or null if no such statistics are
+ * included. */
+ public SortedMap<String, Integer> getDirreqV3TunneledDl();
+
+ /* Return the directory request read history contained in this
+ * descriptor, or null if no directory request read history is
+ * contained. */
+ public BandwidthHistory getDirreqReadHistory();
+
+ /* Return the directory request write history contained in this
+ * descriptor, or null if no directory request write history is
+ * contained. */
+ public BandwidthHistory getDirreqWriteHistory();
+
+ /* Return the end of the included entry statistics interval, or -1 if no
+ * entry statistics are included. */
+ public long getEntryStatsEndMillis();
+
+ /* Return the interval length of the included entry statistics, or -1 if
+ * no entry statistics are included. */
+ public long getEntryStatsIntervalLength();
+
+ /* Return statistics on client IP addresses with map keys being country
+ * codes and map values being the number of unique IP addresses that
+ * have connected from that country rounded up to the nearest multiple
+ * of 8, or null if no entry statistics are included. */
+ public SortedMap<String, Integer> getEntryIps();
+
+ /* Return the end of the included cell statistics interval, or -1 if no
+ * cell statistics are included. */
+ public long getCellStatsEndMillis();
+
+ /* Return the interval length of the included cell statistics, or -1 if
+ * no cell statistics are included. */
+ public long getCellStatsIntervalLength();
+
+ /* Return the mean number of processed cells per circuit by circuit
+ * deciles. */
+ public List<Integer> getCellProcessedCells();
+
+ /* Return the mean number of cells contained in circuit queues by
+ * circuit deciles. */
+ public List<Integer> getCellQueueCells();
+
+ /* Return the mean times in milliseconds that cells spend in circuit
+ * queues by circuit deciles. */
+ public List<Integer> getCellTimeInQueue();
+
+ /* Return the mean number of circuits included in any of the cell
+ * statistics deciles, or -1 if no cell statistics are included. */
+ public int getCellCircuitsPerDecile();
+
+ /* Return the end of the included statistics interval on bi-directional
+ * connection usage, or -1 if no such statistics are included. */
+ public long getConnBiDirectStatsEndMillis();
+
+ /* Return the interval length of the included statistics on
+ * bi-directional connection usage, or -1 if no such statistics are
+ * included. */
+ public long getConnBiDirectIntervalLength();
+
+ /* Return the number of connections on which this relay read and wrote
+ * less than 2 KiB/s in a 10-second interval, or -1 if no statistics on
+ * bi-directional connection usage are included. */
+ public int getConnBiDirectBelow();
+
+ /* Return the number of connections on which this relay read and wrote
+ * at least 2 KiB/s in a 10-second interval and at least 10 times more
+ * in read direction than in write direction, or -1 if no statistics on
+ * bi-directional connection usage are included. */
+ public int getConnBiDirectRead();
+
+ /* Return the number of connections on which this relay read and wrote
+ * at least 2 KiB/s in a 10-second interval and at least 10 times more
+ * in write direction than in read direction, or -1 if no statistics on
+ * bi-directional connection usage are included. */
+ public int getConnBiDirectWrite();
+
+ /* Return the number of connections on which this relay read and wrote
+ * at least 2 KiB/s in a 10-second interval but not 10 times more in
+ * either direction, or -1 if no statistics on bi-directional connection
+ * usage are included. */
+ public int getConnBiDirectBoth();
+
+ /* Return the end of the included exit statistics interval, or -1 if no
+ * exit statistics are included. */
+ public long getExitStatsEndMillis();
+
+ /* Return the interval length of the included exit statistics, or -1 if
+ * no exit statistics are included. */
+ public long getExitStatsIntervalLength();
+
+ /* Return statistics on KiB written by port with map keys being ports
+ * and map values being KiB rounded up to the next full KiB, or null if
+ * no exit statistics are included. */
+ public SortedMap<Integer, Integer> getExitKibibytesWritten();
+
+ /* Return statistics on KiB read by port with map keys being ports and
+ * map values being KiB rounded up to the next full KiB, or null if no
+ * exit statistics are included. */
+ public SortedMap<Integer, Integer> getExitKibibytesRead();
+
+ /* Return statistics on opened exit streams with map keys being ports
+ * and map values being the number of opened streams, rounded up to the
+ * nearest multiple of 4, or null if no exit statistics are included. */
+ public SortedMap<Integer, Integer> getExitStreamsOpened();
}
diff --git a/src/org/torproject/descriptor/impl/RelayExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/RelayExtraInfoDescriptorImpl.java
new file mode 100644
index 0000000..754a79f
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/RelayExtraInfoDescriptorImpl.java
@@ -0,0 +1,560 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedMap;
+import org.torproject.descriptor.RelayExtraInfoDescriptor;
+import org.torproject.descriptor.BandwidthHistory;
+
+/* TODO Implement methods to parse the various statistics (other than
+ * bandwidth histories. */
+/* TODO Write a test class. */
+public class RelayExtraInfoDescriptorImpl extends DescriptorImpl
+ implements RelayExtraInfoDescriptor {
+
+ protected static List<RelayExtraInfoDescriptor> parseDescriptors(
+ byte[] descriptorsBytes) {
+ List<RelayExtraInfoDescriptor> parsedDescriptors =
+ new ArrayList<RelayExtraInfoDescriptor>();
+ List<byte[]> splitDescriptorsBytes =
+ DescriptorImpl.splitRawDescriptorBytes(descriptorsBytes,
+ "router ");
+ try {
+ for (byte[] descriptorBytes : splitDescriptorsBytes) {
+ RelayExtraInfoDescriptor parsedDescriptor =
+ new RelayExtraInfoDescriptorImpl(descriptorBytes);
+ parsedDescriptors.add(parsedDescriptor);
+ }
+ } catch (DescriptorParseException e) {
+ /* TODO Handle this error somehow. */
+ System.err.println("Failed to parse descriptor. Skipping.");
+ e.printStackTrace();
+ }
+ return parsedDescriptors;
+ }
+
+ protected RelayExtraInfoDescriptorImpl(byte[] descriptorBytes)
+ throws DescriptorParseException {
+ super(descriptorBytes);
+ this.parseDescriptorBytes();
+ Set<String> exactlyOnceKeywords = new HashSet<String>(Arrays.asList((
+ "extra-info,published,router-signature").split(",")));
+ this.checkExactlyOnceKeywords(exactlyOnceKeywords);
+ Set<String> atMostOnceKeywords = new HashSet<String>(Arrays.asList((
+ "read-history,write-history,geoip-db-digest,dirreq-stats-end,"
+ + "dirreq-v2-ips,dirreq-v3-ips,dirreq-v2-reqs,dirreq-v3-reqs,"
+ + "dirreq-v2-share,dirreq-v3-share,dirreq-v2-resp,dirreq-v3-resp,"
+ + "dirreq-v2-direct-dl,dirreq-v3-direct-dl,dirreq-v2-tunneled-dl,"
+ + "dirreq-v3-tunneled-dl,dirreq-read-history,"
+ + "dirreq-write-history,entry-stats-end,entry-ips,cell-stats-end,"
+ + "cell-processed-cells,cell-queued-cells,cell-time-in-queue,"
+ + "cell-circuits-per-decile,conn-bi-direct,exit-stats-end,"
+ + "exit-kibibytes-written,exit-kibibytes-read,"
+ + "exit-streams-opened").split(",")));
+ this.checkAtMostOnceKeywords(atMostOnceKeywords);
+ /* TODO Add more checks to see that only statistics details lines are
+ * included with corresponding statistics interval lines. */
+ this.checkFirstKeyword("extra-info");
+ this.checkLastKeyword("router-signature");
+ return;
+ }
+
+ private void parseDescriptorBytes() throws DescriptorParseException {
+ try {
+ BufferedReader br = new BufferedReader(new StringReader(
+ new String(this.rawDescriptorBytes)));
+ String line;
+ boolean skipCrypto = false;
+ while ((line = br.readLine()) != null) {
+ String lineNoOpt = line.startsWith("opt ") ?
+ line.substring("opt ".length()) : line;
+ String[] partsNoOpt = lineNoOpt.split(" ");
+ String keyword = partsNoOpt[0];
+ if (keyword.equals("extra-info")) {
+ this.parseExtraInfoLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("published")) {
+ this.parsePublishedLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("read-history")) {
+ this.parseReadHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("write-history")) {
+ this.parseWriteHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("geoip-db-digest")) {
+ this.parseGeoipDbDigestLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-stats-end")) {
+ this.parseDirreqStatsEndLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-ips")) {
+ this.parseDirreqV2IpsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-ips")) {
+ this.parseDirreqV3IpsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-reqs")) {
+ this.parseDirreqV2ReqsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-reqs")) {
+ this.parseDirreqV3ReqsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-share")) {
+ this.parseDirreqV2ShareLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-share")) {
+ this.parseDirreqV3ShareLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-resp")) {
+ this.parseDirreqV2RespLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-resp")) {
+ this.parseDirreqV3RespLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-direct-dl")) {
+ this.parseDirreqV2DirectDlLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-direct-dl")) {
+ this.parseDirreqV3DirectDlLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v2-tunneled-dl")) {
+ this.parseDirreqV2TunneledDlLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-v3-tunneled-dl")) {
+ this.parseDirreqV3TunneledDlLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-read-history")) {
+ this.parseDirreqReadHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("dirreq-write-history")) {
+ this.parseDirreqWriteHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("entry-stats-end")) {
+ this.parseEntryStatsEndLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("entry-ips")) {
+ this.parseEntryIpsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("cell-stats-end")) {
+ this.parseCellStatsEndLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("cell-processed-cells")) {
+ this.parseCellProcessedCellsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("cell-queued-cells")) {
+ this.parseCellQueuedCellsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("cell-time-in-queue")) {
+ this.parseCellTimeInQueueLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("cell-circuits-per-decile")) {
+ this.parseCellCircuitsPerDecileLine(line, lineNoOpt,
+ partsNoOpt);
+ } else if (keyword.equals("conn-bi-direct")) {
+ this.parseConnBiDirectLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("exit-stats-end")) {
+ this.parseExitStatsEndLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("exit-kibibytes-written")) {
+ this.parseExitKibibytesWrittenLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("exit-kibibytes-read")) {
+ this.parseExitKibibytesReadLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("exit-streams-opened")) {
+ this.parseExitStreamsOpenedLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("router-signature")) {
+ this.parseRouterSignatureLine(line, lineNoOpt, partsNoOpt);
+ } else if (line.startsWith("-----BEGIN")) {
+ skipCrypto = true;
+ } else if (line.startsWith("-----END")) {
+ skipCrypto = false;
+ } else if (!skipCrypto) {
+ /* TODO Is throwing an exception the right thing to do here?
+ * This is probably fine for development, but once the library
+ * is in production use, this seems annoying. In theory,
+ * dir-spec.txt says that unknown lines should be ignored. This
+ * also applies to the other descriptors. */
+ throw new DescriptorParseException("Unrecognized line '" + line
+ + "'.");
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Internal error: Ran into an "
+ + "IOException while parsing a String in memory. Something's "
+ + "really wrong.", e);
+ }
+ }
+
+ private void parseExtraInfoLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 3) {
+ throw new DescriptorParseException("Illegal line '" + line
+ + "' in extra-info descriptor.");
+ }
+ this.nickname = ParseHelper.parseNickname(line, partsNoOpt[1]);
+ this.fingerprint = ParseHelper.parseTwentyByteHexString(line,
+ partsNoOpt[2]);
+ }
+
+ private void parsePublishedLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.publishedMillis = ParseHelper.parseTimestampAtIndex(line,
+ partsNoOpt, 1, 2);
+ }
+
+ private void parseReadHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.readHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseWriteHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.writeHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseGeoipDbDigestLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqStatsEndLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2IpsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3IpsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2ReqsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3ReqsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2ShareLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3ShareLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2RespLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3RespLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2DirectDlLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3DirectDlLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV2TunneledDlLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqV3TunneledDlLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseDirreqReadHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.dirreqReadHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseDirreqWriteHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.dirreqWriteHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseEntryStatsEndLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseEntryIpsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseCellStatsEndLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseCellProcessedCellsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseCellQueuedCellsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseCellTimeInQueueLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseCellCircuitsPerDecileLine(String line,
+ String lineNoOpt, String[] partsNoOpt)
+ throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseConnBiDirectLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseExitStatsEndLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseExitKibibytesWrittenLine(String line,
+ String lineNoOpt, String[] partsNoOpt)
+ throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseExitKibibytesReadLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseExitStreamsOpenedLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* TODO Implement me. */
+ }
+
+ private void parseRouterSignatureLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (!lineNoOpt.equals("router-signature")) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ /* Not parsing crypto parts (yet). */
+ }
+
+ private String nickname;
+ public String getNickname() {
+ return this.nickname;
+ }
+
+ private String fingerprint;
+ public String getFingerprint() {
+ return this.fingerprint;
+ }
+
+ private long publishedMillis;
+ public long getPublishedMillis() {
+ return this.publishedMillis;
+ }
+
+ private BandwidthHistory readHistory;
+ public BandwidthHistory getReadHistory() {
+ return this.readHistory;
+ }
+
+ private BandwidthHistory writeHistory;
+ public BandwidthHistory getWriteHistory() {
+ return this.writeHistory;
+ }
+
+ public String getGeoipDbDigest() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getDirreqStatsEndMillis() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getDirreqStatsIntervalLength() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV2Ips() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV3Ips() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV2Reqs() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV3Reqs() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public double getDirreqV2Share() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public double getDirreqV3Share() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV2Resp() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV3Resp() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV2DirectDl() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV3DirectDl() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV2TunneledDl() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getDirreqV3TunneledDl() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ private BandwidthHistory dirreqReadHistory;
+ public BandwidthHistory getDirreqReadHistory() {
+ return this.dirreqReadHistory;
+ }
+
+ private BandwidthHistory dirreqWriteHistory;
+ public BandwidthHistory getDirreqWriteHistory() {
+ return this.dirreqWriteHistory;
+ }
+
+ public long getEntryStatsEndMillis() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getEntryStatsIntervalLength() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<String, Integer> getEntryIps() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getCellStatsEndMillis() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getCellStatsIntervalLength() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public List<Integer> getCellProcessedCells() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public List<Integer> getCellQueueCells() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public List<Integer> getCellTimeInQueue() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public int getCellCircuitsPerDecile() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getConnBiDirectStatsEndMillis() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getConnBiDirectIntervalLength() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public int getConnBiDirectBelow() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public int getConnBiDirectRead() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public int getConnBiDirectWrite() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public int getConnBiDirectBoth() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getExitStatsEndMillis() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public long getExitStatsIntervalLength() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<Integer, Integer> getExitKibibytesWritten() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<Integer, Integer> getExitKibibytesRead() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+
+ public SortedMap<Integer, Integer> getExitStreamsOpened() {
+ /* TODO Implement me. */
+ throw new UnsupportedOperationException();
+ }
+}
+
1
0

02 Jan '12
commit 220bda35fd4e5c11c7a1bcc5a35316b54814443b
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Jan 2 17:43:43 2012 +0100
Update copyright lines to 2012.
---
.../descriptor/BridgeDescriptorReader.java | 2 +-
.../descriptor/BridgeExtraInfoDescriptor.java | 2 +-
.../torproject/descriptor/BridgeNetworkStatus.java | 2 +-
.../descriptor/BridgePoolAssignmentReader.java | 2 +-
.../descriptor/BridgeServerDescriptor.java | 2 +-
src/org/torproject/descriptor/Descriptor.java | 2 +-
src/org/torproject/descriptor/DescriptorFile.java | 2 +-
.../torproject/descriptor/DescriptorRequest.java | 2 +-
.../descriptor/DescriptorSourceFactory.java | 2 +-
src/org/torproject/descriptor/DirSourceEntry.java | 2 +-
.../torproject/descriptor/GetTorStatsReader.java | 2 +-
.../torproject/descriptor/NetworkStatusEntry.java | 2 +-
.../descriptor/RelayDescriptorDownloader.java | 2 +-
.../descriptor/RelayDescriptorReader.java | 2 +-
.../descriptor/RelayNetworkStatusConsensus.java | 2 +-
.../descriptor/RelayNetworkStatusVote.java | 2 +-
.../descriptor/RelayServerDescriptor.java | 2 +-
.../torproject/descriptor/TorperfDataReader.java | 2 +-
.../descriptor/example/ConsensusHealthChecker.java | 2 +-
.../example/MetricsRelayDescriptorAggregator.java | 2 +-
.../example/TorStatusDatabaseUpdater.java | 2 +-
.../descriptor/impl/BlockingIteratorImpl.java | 2 +-
.../impl/BridgeDescriptorReaderImpl.java | 2 +-
.../descriptor/impl/DescriptorFileImpl.java | 2 +-
.../descriptor/impl/DescriptorParseException.java | 2 +-
.../descriptor/impl/DescriptorRequestImpl.java | 2 +-
.../descriptor/impl/DirSourceEntryImpl.java | 2 +-
.../descriptor/impl/NetworkStatusEntryImpl.java | 2 +-
.../descriptor/impl/NetworkStatusImpl.java | 2 +-
.../torproject/descriptor/impl/ParseHelper.java | 2 +-
.../impl/RelayDescriptorDownloaderImpl.java | 2 +-
.../descriptor/impl/RelayDescriptorReaderImpl.java | 2 +-
.../impl/RelayNetworkStatusConsensusImpl.java | 2 +-
.../impl/RelayNetworkStatusVoteImpl.java | 2 +-
34 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/src/org/torproject/descriptor/BridgeDescriptorReader.java b/src/org/torproject/descriptor/BridgeDescriptorReader.java
index 2fe950e..fdb30d0 100644
--- a/src/org/torproject/descriptor/BridgeDescriptorReader.java
+++ b/src/org/torproject/descriptor/BridgeDescriptorReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java b/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
index 5004881..ed0238d 100644
--- a/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
+++ b/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/BridgeNetworkStatus.java b/src/org/torproject/descriptor/BridgeNetworkStatus.java
index 23ccd0f..d3ed347 100644
--- a/src/org/torproject/descriptor/BridgeNetworkStatus.java
+++ b/src/org/torproject/descriptor/BridgeNetworkStatus.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/BridgePoolAssignmentReader.java b/src/org/torproject/descriptor/BridgePoolAssignmentReader.java
index 3e0a99d..9553fe4 100644
--- a/src/org/torproject/descriptor/BridgePoolAssignmentReader.java
+++ b/src/org/torproject/descriptor/BridgePoolAssignmentReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/BridgeServerDescriptor.java b/src/org/torproject/descriptor/BridgeServerDescriptor.java
index cb80f83..ec759b1 100644
--- a/src/org/torproject/descriptor/BridgeServerDescriptor.java
+++ b/src/org/torproject/descriptor/BridgeServerDescriptor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/Descriptor.java b/src/org/torproject/descriptor/Descriptor.java
index fada70d..76b23a0 100644
--- a/src/org/torproject/descriptor/Descriptor.java
+++ b/src/org/torproject/descriptor/Descriptor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/DescriptorFile.java b/src/org/torproject/descriptor/DescriptorFile.java
index 6164073..7a70e17 100644
--- a/src/org/torproject/descriptor/DescriptorFile.java
+++ b/src/org/torproject/descriptor/DescriptorFile.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/DescriptorRequest.java b/src/org/torproject/descriptor/DescriptorRequest.java
index 1fe70f2..b0c2c02 100644
--- a/src/org/torproject/descriptor/DescriptorRequest.java
+++ b/src/org/torproject/descriptor/DescriptorRequest.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/DescriptorSourceFactory.java b/src/org/torproject/descriptor/DescriptorSourceFactory.java
index 0c174f0..ec7479b 100644
--- a/src/org/torproject/descriptor/DescriptorSourceFactory.java
+++ b/src/org/torproject/descriptor/DescriptorSourceFactory.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/DirSourceEntry.java b/src/org/torproject/descriptor/DirSourceEntry.java
index 190b1df..98bff22 100644
--- a/src/org/torproject/descriptor/DirSourceEntry.java
+++ b/src/org/torproject/descriptor/DirSourceEntry.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/GetTorStatsReader.java b/src/org/torproject/descriptor/GetTorStatsReader.java
index e63591a..0b4c1d6 100644
--- a/src/org/torproject/descriptor/GetTorStatsReader.java
+++ b/src/org/torproject/descriptor/GetTorStatsReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/NetworkStatusEntry.java b/src/org/torproject/descriptor/NetworkStatusEntry.java
index 5d48818..38b7862 100644
--- a/src/org/torproject/descriptor/NetworkStatusEntry.java
+++ b/src/org/torproject/descriptor/NetworkStatusEntry.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/RelayDescriptorDownloader.java b/src/org/torproject/descriptor/RelayDescriptorDownloader.java
index 50f3082..28d6ea1 100644
--- a/src/org/torproject/descriptor/RelayDescriptorDownloader.java
+++ b/src/org/torproject/descriptor/RelayDescriptorDownloader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/RelayDescriptorReader.java b/src/org/torproject/descriptor/RelayDescriptorReader.java
index 683bf0c..11735c9 100644
--- a/src/org/torproject/descriptor/RelayDescriptorReader.java
+++ b/src/org/torproject/descriptor/RelayDescriptorReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
index 08ec8e4..2c0ff4f 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusVote.java b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
index aab90bd..3dd82bc 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusVote.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/RelayServerDescriptor.java b/src/org/torproject/descriptor/RelayServerDescriptor.java
index fcd4382..2f48def 100644
--- a/src/org/torproject/descriptor/RelayServerDescriptor.java
+++ b/src/org/torproject/descriptor/RelayServerDescriptor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/TorperfDataReader.java b/src/org/torproject/descriptor/TorperfDataReader.java
index daf8462..1257449 100644
--- a/src/org/torproject/descriptor/TorperfDataReader.java
+++ b/src/org/torproject/descriptor/TorperfDataReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor;
diff --git a/src/org/torproject/descriptor/example/ConsensusHealthChecker.java b/src/org/torproject/descriptor/example/ConsensusHealthChecker.java
index c07840f..178f164 100644
--- a/src/org/torproject/descriptor/example/ConsensusHealthChecker.java
+++ b/src/org/torproject/descriptor/example/ConsensusHealthChecker.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.example;
diff --git a/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java b/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
index fdb5f04..9aa2600 100644
--- a/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
+++ b/src/org/torproject/descriptor/example/MetricsRelayDescriptorAggregator.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.example;
diff --git a/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java b/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
index e963eee..428f3b5 100644
--- a/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
+++ b/src/org/torproject/descriptor/example/TorStatusDatabaseUpdater.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.example;
diff --git a/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java b/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
index ed79797..195acfe 100644
--- a/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
+++ b/src/org/torproject/descriptor/impl/BlockingIteratorImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java
index 6fdd560..09f422c 100644
--- a/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/BridgeDescriptorReaderImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/DescriptorFileImpl.java b/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
index 0dd984d..3051066 100644
--- a/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorFileImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/DescriptorParseException.java b/src/org/torproject/descriptor/impl/DescriptorParseException.java
index 8670a3b..74dc526 100644
--- a/src/org/torproject/descriptor/impl/DescriptorParseException.java
+++ b/src/org/torproject/descriptor/impl/DescriptorParseException.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/DescriptorRequestImpl.java b/src/org/torproject/descriptor/impl/DescriptorRequestImpl.java
index 19d492c..6c4d387 100644
--- a/src/org/torproject/descriptor/impl/DescriptorRequestImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorRequestImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java b/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java
index a38da87..4145686 100644
--- a/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java
+++ b/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java
index 6612272..fa31f4a 100644
--- a/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java
+++ b/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
index 2878ad9..ec3913c 100644
--- a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
+++ b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/ParseHelper.java b/src/org/torproject/descriptor/impl/ParseHelper.java
index 296955e..9284513 100644
--- a/src/org/torproject/descriptor/impl/ParseHelper.java
+++ b/src/org/torproject/descriptor/impl/ParseHelper.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/RelayDescriptorDownloaderImpl.java b/src/org/torproject/descriptor/impl/RelayDescriptorDownloaderImpl.java
index a1e1473..c2db6a4 100644
--- a/src/org/torproject/descriptor/impl/RelayDescriptorDownloaderImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayDescriptorDownloaderImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
index 064983e..f0efbb3 100644
--- a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
index a5ab87c..6dc3d74 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
index 438b1df..e10e1f4 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
1
0

02 Jan '12
commit 38a16cf89998058522f464486b4de03b7d0bcbe5
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Jan 2 14:45:11 2012 +0000
Update translations for vidalia
---
el/vidalia_el.po | 40 +++++++++++++++++++++++++++++++++-------
1 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/el/vidalia_el.po b/el/vidalia_el.po
index b80a1e9..ca589c6 100755
--- a/el/vidalia_el.po
+++ b/el/vidalia_el.po
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-09-07 14:40+0000\n"
-"PO-Revision-Date: 2012-01-02 14:12+0000\n"
+"PO-Revision-Date: 2012-01-02 14:29+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
@@ -3505,6 +3505,10 @@ msgid ""
" that do not exist. Some ISPs and other DNS providers, such as OpenDNS, are "
"known to do this in order to display their own search or advertising pages."
msgstr ""
+"Το Tor εντόπισε ότι ο πάροχος DNS παρέχει εσφαλμένα μηνύματα για περιοχές "
+"που δεν υπάρχουν. Μερικοί ISP και άλλοι πάροχοι DNS, όπως η OpenDNS, είναι "
+"γνωστό ότι αυτό το κάνουν για να προβάλουν τις δικές τους σελίδες αναζήτησης"
+" ή διαφήμισης."
msgctxt "StatusEventWidget"
msgid ""
@@ -3512,10 +3516,14 @@ msgid ""
"known domains. Since clients rely on Tor network relays to provide accurate "
"DNS repsonses, your relay will not be configured as an exit relay."
msgstr ""
+"Το Tor εντόπισε ότι ο πάροχος DNS παρέχει εσφαλμένα μηνύματα για γνωστές "
+"περιοχές. Εφόσον τα προγράμματα-πελάτες βασίζονται στους ανεμεταδότες Tor "
+"για την διαβίβαση ακριβών μηνυμάτων DNS, ο αναμεταδότης σας δεν θα ρυθμιστεί"
+" ως αναμεταδότης εξόδου."
msgctxt "StatusEventWidget"
msgid "Checking Server Port Reachability"
-msgstr ""
+msgstr "Έλεγχος της Προσεγγιστικότητας των Θυρών του Διακομηστή"
msgctxt "StatusEventWidget"
msgid ""
@@ -3523,18 +3531,22 @@ msgid ""
" Tor network by connecting to itself at %1:%2. This test could take several "
"minutes."
msgstr ""
+"Το Tor προσπαθεί να προσδιορίσει αν η θυρα διακομηστή του αναμεταδότη σας "
+"μπορεί να προσεγγιστεί από το δίκτυο Tor, συνδεόμενος στους υπολογιστές %1 "
+"%2. Αυτό μπορεί να διαρκέσει πολλά λεπτά."
msgctxt "StatusEventWidget"
msgid "Server Port Reachability Test Successful!"
-msgstr ""
+msgstr "Ο έλεγχος προσεγγιστικότητας της θύρας το διακομηστή ήταν επιτυχής!"
msgctxt "StatusEventWidget"
msgid "Your relay's server port is reachable from the Tor network!"
msgstr ""
+"Η θύρα διακομηστή του αναμεταδότη σας είναι προσβάσιμη από το δίκτυο Tor!"
msgctxt "StatusEventWidget"
msgid "Server Port Reachability Test Failed"
-msgstr ""
+msgstr "Ο έλεγχος προσεγγιστικότητας της θύρας του διακομηστή απέτυχε!"
msgctxt "StatusEventWidget"
msgid ""
@@ -3543,10 +3555,15 @@ msgid ""
"port forwarding. If %1:%2 is not your correct IP address and server port, "
"please check your relay's configuration."
msgstr ""
+"Η θύρα διακομηστή του αναμεταδότη σας δεν είναι προσεγγίσημη από άλλα "
+"προγράμματα-πελάτες Tor. Αυτό μπορεί να συμβεί όταν συνδέεστε μέσω "
+"δρομολογητή ή τείχους προστασίας που απαιτούν ρυθμίσεις προώθησης θύρας. Αν "
+"η διεύθυνση %1:%2 δεν είναι η σωστή διεύθυνση ΙΡ και θύρα, ελέγξτε τις "
+"ρυθμίσεις του αναμεταδότη σας."
msgctxt "StatusEventWidget"
msgid "Checking Directory Port Reachability"
-msgstr ""
+msgstr "Έλεγχος Προσεγγιστικότητας της Θύρας Καταλόγου"
msgctxt "StatusEventWidget"
msgid ""
@@ -3554,18 +3571,22 @@ msgid ""
"the Tor network by connecting to itself at %1:%2. This test could take "
"several minutes."
msgstr ""
+"Το Tor προσπαθεί να προσδιορίσει αν η θύρα καταλόγου του αναμεταδότη σας "
+"είναι προσεγγίσιμη από το δίκτυο Tor συνδεόμενο στον υπολογιστή %1:%2. Ο "
+"έλεγχος αυτός ίσως διαρκέσει πολλά λεπτά."
msgctxt "StatusEventWidget"
msgid "Directory Port Reachability Test Successful!"
-msgstr ""
+msgstr "Ο Έλεγχος Προσεγγιστικότητας της Θύρας Καταλόγου ήταν επιτυχής!"
msgctxt "StatusEventWidget"
msgid "Your relay's directory port is reachable from the Tor network!"
msgstr ""
+"Η θύρα καταλόγου του αναμεταδότη σας είναι προσβάσιμη από το δίκτυο Tor!"
msgctxt "StatusEventWidget"
msgid "Directory Port Reachability Test Failed"
-msgstr ""
+msgstr "Ο Έλεγχος Προσσεγιστικότητας της Θύρας Καταλόγου απέτυχε!"
msgctxt "StatusEventWidget"
msgid ""
@@ -3574,6 +3595,11 @@ msgid ""
"port forwarding. If %1:%2 is not your correct IP address and directory port,"
" please check your relay's configuration."
msgstr ""
+"Η θύρα καταλόγου του αναμεταδότη σας δεν είναι προσβάσιμη από άλλα "
+"προγράμματα-πελάτες Tor. Αυτό μπορεί να συμβαίνει αν συνδέεστε μέσω "
+"δρομολογητή ή τείχους προστασίας τα οποία απαιτούν ρυθμίσεις προώθησης "
+"θύρας. Αν η διεύθυνση %1:%2 δεν είναι η σωστή διεύθυνση ΙΡ και θύρα, ελέγξτε"
+" τις ρυθμίσεις του αναμεταδότη σας."
msgctxt "StatusEventWidget"
msgid "Relay Descriptor Rejected"
1
0

02 Jan '12
commit 42c65a5cb8069dc5f926d004aabff065ff4e44b3
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Jan 2 14:15:13 2012 +0000
Update translations for vidalia
---
el/vidalia_el.po | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/el/vidalia_el.po b/el/vidalia_el.po
index e660d9c..b80a1e9 100755
--- a/el/vidalia_el.po
+++ b/el/vidalia_el.po
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-09-07 14:40+0000\n"
-"PO-Revision-Date: 2012-01-02 13:12+0000\n"
+"PO-Revision-Date: 2012-01-02 14:12+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
@@ -3477,10 +3477,13 @@ msgid ""
"\"%1\", which Tor does not recognize as a valid hostname. Please check your "
"application's configuration."
msgstr ""
+"Κάποια από τις εφαρμογές σας πραγματοποίησε σύνδεση μέσω του Tor στον "
+"\"%1\", τον οποίο το Tor δεν αναγνωρίζει ως έγκυρο όνομα υπολογιστή. Ελέγξτε"
+" τις ρυθμίσεις της εφαρμογής σας."
msgctxt "StatusEventWidget"
msgid "External IP Address Changed"
-msgstr ""
+msgstr "Η εξωτερική διεύθυνση ΙΡ άλλαξε"
msgctxt "StatusEventWidget"
msgid ""
@@ -3488,10 +3491,13 @@ msgid ""
" is not correct, please consider setting the 'Address' option in your "
"relay's configuration."
msgstr ""
+"Το Tor διαπίστωσε ότι η δημόσια διεύθυνση ΙΡ του αναμεταδότη σας αυτή τη "
+"στιγμή είναι %1%2. Αν αυτό δεν είναι σωστό, προσαρμόστε κατάλληλα την "
+"επιλογή 'Address' στις ρυθμίσεις του αναμεταδότη σας."
msgctxt "StatusEventWidget"
msgid "DNS Hijacking Detected"
-msgstr ""
+msgstr "Ανυχνεύθηκε Παραβίαση του DNS"
msgctxt "StatusEventWidget"
msgid ""
1
0

[metrics-lib/master] Implement parsing relay server descriptors.
by karsten@torproject.org 02 Jan '12
by karsten@torproject.org 02 Jan '12
02 Jan '12
commit aecdb0f72eefa2479002e47cce3d1dce9e55868d
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Jan 2 14:37:30 2012 +0100
Implement parsing relay server descriptors.
---
.../torproject/descriptor/BandwidthHistory.java | 26 +
.../descriptor/RelayServerDescriptor.java | 103 ++
.../descriptor/impl/BandwidthHistoryImpl.java | 73 ++
.../torproject/descriptor/impl/DescriptorImpl.java | 164 +++
.../descriptor/impl/NetworkStatusImpl.java | 129 +---
.../torproject/descriptor/impl/ParseHelper.java | 45 +
.../impl/RelayNetworkStatusConsensusImpl.java | 2 +-
.../impl/RelayNetworkStatusVoteImpl.java | 2 +-
.../descriptor/impl/RelayServerDescriptorImpl.java | 529 ++++++++++
.../impl/RelayNetworkStatusConsensusImplTest.java | 2 +
.../impl/RelayNetworkStatusVoteImplTest.java | 2 +
.../impl/RelayServerDescriptorImplTest.java | 1080 ++++++++++++++++++++
12 files changed, 2028 insertions(+), 129 deletions(-)
diff --git a/src/org/torproject/descriptor/BandwidthHistory.java b/src/org/torproject/descriptor/BandwidthHistory.java
new file mode 100644
index 0000000..1794ab4
--- /dev/null
+++ b/src/org/torproject/descriptor/BandwidthHistory.java
@@ -0,0 +1,26 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor;
+
+import java.util.SortedMap;
+
+/* Contains the bandwidth history of a relay or bridge. */
+public interface BandwidthHistory {
+
+ /* Return the original bandwidth history line as contained in the
+ * descriptor, possibly prefixed with "opt ". */
+ public String getLine();
+
+ /* Return the end of the most recent interval in millis. */
+ public long getHistoryEndMillis();
+
+ /* Return the interval length in seconds, which is typically 900 seconds
+ * or 15 minutes. */
+ public long getIntervalLength();
+
+ /* Return the (possibly empty) bandwidth history with map keys being
+ * interval ends in millis and map values being number of bytes used in
+ * the interval, ordered from oldest to newest interval. */
+ public SortedMap<Long, Long> getBandwidthValues();
+}
+
diff --git a/src/org/torproject/descriptor/RelayServerDescriptor.java b/src/org/torproject/descriptor/RelayServerDescriptor.java
index 1542cba..fcd4382 100644
--- a/src/org/torproject/descriptor/RelayServerDescriptor.java
+++ b/src/org/torproject/descriptor/RelayServerDescriptor.java
@@ -2,6 +2,109 @@
* See LICENSE for licensing information */
package org.torproject.descriptor;
+import java.util.List;
+
+/* Contains a relay server descriptor. */
public interface RelayServerDescriptor extends Descriptor {
+
+ /* Return the relay's nickname. */
+ public String getNickname();
+
+ /* Return the relay's IPv4 address in dotted-quad format. */
+ public String getAddress();
+
+ /* Return the relay's OR port. */
+ public int getOrPort();
+
+ /* Return the relay's SOCKS port which should always be 0. */
+ public int getSocksPort();
+
+ /* Return the relay's directory port. */
+ public int getDirPort();
+
+ /* Return the average bandwidth in bytes per second that the relay is
+ * willing to sustain over long periods. */
+ public int getBandwidthRate();
+
+ /* Return the burst bandwidth in bytes per second that the relay is
+ * willing to sustain in very short intervals. */
+ public int getBandwidthBurst();
+
+ /* Return the observed bandwidth in bytes per second as an estimate of
+ * the capacity that the relay can handle. */
+ public int getBandwidthObserved();
+
+ /* Return the platform string containing the Tor software version and
+ * the operating system. */
+ public String getPlatform();
+
+ /* Return the time when this descriptor and the corresponding extra-info
+ * document was generated. */
+ public long getPublishedMillis();
+
+ /* Return the relay fingerprint, or null if this descriptor does not
+ * contain a fingerprint line. */
+ public String getFingerprint();
+
+ /* Return whether the relay was hibernating when this descriptor was
+ * published. */
+ public boolean isHibernating();
+
+ /* Return the number of seconds that this relay has been running, or -1
+ * if the descriptor does not contain an uptime line. */
+ public int getUptime();
+
+ /* Return the relay's exit policy consisting of one or more accept or
+ * reject lines. */
+ public List<String> getExitPolicyLines();
+
+ /* Return the contact information for this relay, or null if no contact
+ * information is included in the descriptor. */
+ public String getContact();
+
+ /* Return the nicknames or ($-prefixed) fingerprints contained in the
+ * family line of this relay, or null if the descriptor does not contain
+ * a family line. */
+ public List<String> getFamilyEntries();
+
+ /* Return the relay's read history. (Current Tor versions include their
+ * bandwidth histories in their extra-info descriptors, not in their
+ * server descriptors.) */
+ public BandwidthHistory getReadHistory();
+
+ /* Return the relay's write history. (Current Tor versions include
+ * their bandwidth histories in their extra-info descriptors, not in
+ * their server descriptors.) */
+ public BandwidthHistory getWriteHistory();
+
+ /* Return true if the relay uses the enhanced DNS logic, or false if
+ * doesn't use it or doesn't include an eventdns line in its
+ * descriptor. */
+ public boolean getUsesEnhancedDnsLogic();
+
+ /* Return whether this relay is a directory cache that provides
+ * extra-info descriptors. */
+ public boolean getCachesExtraInfo();
+
+ /* Return the digest of the relay's extra-info descriptor, or null if
+ * the relay did not upload a corresponding extra-info descriptor. */
+ public String getExtraInfoDigest();
+
+ /* Return the hidden service descriptor version(s) that this relay
+ * stores and serves, or null if it doesn't store and serve any hidden
+ * service descriptors. */
+ public List<Integer> getHiddenServiceDirVersions();
+
+ /* Return the list of link protocol versions that this relay
+ * supports. */
+ public List<Integer> getLinkProtocolVersions();
+
+ /* Return the list of circuit protocol versions that this relay
+ * supports. */
+ public List<Integer> getCircuitProtocolVersions();
+
+ /* Return whether this relay allows single-hop circuits to make exit
+ * connections. */
+ public boolean getAllowSingleHopExits();
}
diff --git a/src/org/torproject/descriptor/impl/BandwidthHistoryImpl.java b/src/org/torproject/descriptor/impl/BandwidthHistoryImpl.java
new file mode 100644
index 0000000..f16cc81
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/BandwidthHistoryImpl.java
@@ -0,0 +1,73 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import org.torproject.descriptor.BandwidthHistory;
+
+public class BandwidthHistoryImpl implements BandwidthHistory {
+
+ protected BandwidthHistoryImpl(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ boolean isValid = false;
+ if (partsNoOpt.length >= 5) {
+ try {
+ this.line = line;
+ this.historyEndMillis = ParseHelper.parseTimestampAtIndex(line,
+ partsNoOpt, 1, 2);
+ if (partsNoOpt[3].startsWith("(") &&
+ partsNoOpt[4].equals("s)")) {
+ this.intervalLength = Long.parseLong(partsNoOpt[3].
+ substring(1));
+ if (partsNoOpt.length > 6) {
+ /* Invalid line, handle below. */
+ } else if (partsNoOpt.length == 5) {
+ /* No bandwidth values to parse. */
+ isValid = true;
+ } else {
+ long endMillis = this.historyEndMillis;
+ String[] values = partsNoOpt[5].split(",", -1);
+ for (int i = values.length - 1; i >= 0; i--) {
+ long bandwidthValue = Long.parseLong(values[i]);
+ this.bandwidthValues.put(endMillis, bandwidthValue);
+ endMillis -= this.intervalLength * 1000L;
+ }
+ isValid = true;
+ }
+ }
+ } catch (NumberFormatException e) {
+ /* Handle below. */
+ }
+ }
+ if (!isValid) {
+ throw new DescriptorParseException("Invalid bandwidth-history line "
+ + "'" + line + "'.");
+ }
+ }
+
+ private String line;
+ public String getLine() {
+ return this.line;
+ }
+
+ private long historyEndMillis;
+ public long getHistoryEndMillis() {
+ return this.historyEndMillis;
+ }
+
+ private long intervalLength;
+ public long getIntervalLength() {
+ return this.intervalLength;
+ }
+
+ private SortedMap<Long, Long> bandwidthValues =
+ new TreeMap<Long, Long>();
+ public SortedMap<Long, Long> getBandwidthValues() {
+ return new TreeMap<Long, Long>(this.bandwidthValues);
+ }
+}
+
diff --git a/src/org/torproject/descriptor/impl/DescriptorImpl.java b/src/org/torproject/descriptor/impl/DescriptorImpl.java
new file mode 100644
index 0000000..d337630
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/DescriptorImpl.java
@@ -0,0 +1,164 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.torproject.descriptor.Descriptor;
+
+public abstract class DescriptorImpl implements Descriptor {
+
+ protected static List<byte[]> splitRawDescriptorBytes(
+ byte[] rawDescriptorBytes, String startToken) {
+ List<byte[]> rawDescriptors = new ArrayList<byte[]>();
+ String splitToken = "\n" + startToken;
+ String ascii = new String(rawDescriptorBytes);
+ int length = rawDescriptorBytes.length,
+ start = ascii.indexOf(startToken);
+ while (start < length) {
+ int end = ascii.indexOf(splitToken, start);
+ if (end < 0) {
+ end = length;
+ } else {
+ end += 1;
+ }
+ byte[] rawDescriptor = new byte[end - start];
+ System.arraycopy(rawDescriptorBytes, start, rawDescriptor, 0,
+ end - start);
+ start = end;
+ rawDescriptors.add(rawDescriptor);
+ }
+ return rawDescriptors;
+ }
+
+ protected byte[] rawDescriptorBytes;
+ public byte[] getRawDescriptorBytes() {
+ return this.rawDescriptorBytes;
+ }
+
+ protected DescriptorImpl(byte[] rawDescriptorBytes)
+ throws DescriptorParseException {
+ this.rawDescriptorBytes = rawDescriptorBytes;
+ this.countKeywords(rawDescriptorBytes);
+ }
+
+ /* Count parsed keywords for consistency checks by subclasses. */
+ private String firstKeyword, lastKeyword;
+ private Map<String, Integer> parsedKeywords =
+ new HashMap<String, Integer>();
+ private void countKeywords(byte[] rawDescriptorBytes)
+ throws DescriptorParseException {
+ if (rawDescriptorBytes.length == 0) {
+ throw new DescriptorParseException("Descriptor is empty.");
+ }
+ String descriptorString = new String(rawDescriptorBytes);
+ if (descriptorString.startsWith("\n") ||
+ descriptorString.contains("\n\n")) {
+ throw new DescriptorParseException("Empty lines are not allowed.");
+ }
+ try {
+ BufferedReader br = new BufferedReader(new StringReader(
+ descriptorString));
+ String line;
+ boolean skipCrypto = false;
+ while ((line = br.readLine()) != null) {
+ if (line.startsWith("-----BEGIN")) {
+ skipCrypto = true;
+ } else if (line.startsWith("-----END")) {
+ skipCrypto = false;
+ } else if (!skipCrypto) {
+ String lineNoOpt = line.startsWith("opt ") ?
+ line.substring("opt ".length()) : line;
+ String keyword = lineNoOpt.split(" ", -1)[0];
+ if (keyword.equals("")) {
+ throw new DescriptorParseException("Illegal keyword in line '"
+ + line + "'.");
+ }
+ if (this.firstKeyword == null) {
+ this.firstKeyword = keyword;
+ }
+ lastKeyword = keyword;
+ if (parsedKeywords.containsKey(keyword)) {
+ parsedKeywords.put(keyword, parsedKeywords.get(keyword) + 1);
+ } else {
+ parsedKeywords.put(keyword, 1);
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Internal error: Ran into an "
+ + "IOException while parsing a String in memory. Something's "
+ + "really wrong.", e);
+ }
+ }
+
+ protected void checkFirstKeyword(String keyword)
+ throws DescriptorParseException {
+ if (this.firstKeyword == null ||
+ !this.firstKeyword.equals(keyword)) {
+ throw new DescriptorParseException("Keyword '" + keyword + "' must "
+ + "be contained in the first line.");
+ }
+ }
+
+ protected void checkLastKeyword(String keyword)
+ throws DescriptorParseException {
+ if (this.lastKeyword == null ||
+ !this.lastKeyword.equals(keyword)) {
+ throw new DescriptorParseException("Keyword '" + keyword + "' must "
+ + "be contained in the last line.");
+ }
+ }
+
+ protected void checkExactlyOnceKeywords(Set<String> keywords)
+ throws DescriptorParseException {
+ for (String keyword : keywords) {
+ int contained = 0;
+ if (this.parsedKeywords.containsKey(keyword)) {
+ contained = this.parsedKeywords.get(keyword);
+ }
+ if (contained != 1) {
+ throw new DescriptorParseException("Keyword '" + keyword + "' is "
+ + "contained " + contained + " times, but must be contained "
+ + "exactly once.");
+ }
+ }
+ }
+
+ protected void checkAtLeastOnceKeywords(Set<String> keywords)
+ throws DescriptorParseException {
+ for (String keyword : keywords) {
+ if (!this.parsedKeywords.containsKey(keyword)) {
+ throw new DescriptorParseException("Keyword '" + keyword + "' is "
+ + "contained 0 times, but must be contained at least once.");
+ }
+ }
+ }
+
+ protected void checkAtMostOnceKeywords(Set<String> keywords)
+ throws DescriptorParseException {
+ for (String keyword : keywords) {
+ if (this.parsedKeywords.containsKey(keyword) &&
+ this.parsedKeywords.get(keyword) > 1) {
+ throw new DescriptorParseException("Keyword '" + keyword + "' is "
+ + "contained " + this.parsedKeywords.get(keyword) + " times, "
+ + "but must be contained at most once.");
+ }
+ }
+ }
+
+ protected int getKeywordCount(String keyword) {
+ if (!this.parsedKeywords.containsKey(keyword)) {
+ return 0;
+ } else {
+ return this.parsedKeywords.get(keyword);
+ }
+ }
+}
+
diff --git a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
index f478913..2878ad9 100644
--- a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
+++ b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java
@@ -18,40 +18,11 @@ import org.torproject.descriptor.NetworkStatusEntry;
/* Parse the common parts of v3 consensuses, v3 votes, v3 microdesc
* consensuses, v2 statuses, and sanitized bridge network statuses and
* delegate the specific parts to the subclasses. */
-public abstract class NetworkStatusImpl {
-
- protected static List<byte[]> splitRawDescriptorBytes(
- byte[] rawDescriptorBytes, String startToken) {
- List<byte[]> rawDescriptors = new ArrayList<byte[]>();
- String splitToken = "\n" + startToken;
- String ascii = new String(rawDescriptorBytes);
- int length = rawDescriptorBytes.length,
- start = ascii.indexOf(startToken);
- while (start < length) {
- int end = ascii.indexOf(splitToken, start);
- if (end < 0) {
- end = length;
- } else {
- end += 1;
- }
- byte[] rawDescriptor = new byte[end - start];
- System.arraycopy(rawDescriptorBytes, start, rawDescriptor, 0,
- end - start);
- start = end;
- rawDescriptors.add(rawDescriptor);
- }
- return rawDescriptors;
- }
-
- private byte[] rawDescriptorBytes;
- public byte[] getRawDescriptorBytes() {
- return this.rawDescriptorBytes;
- }
+public abstract class NetworkStatusImpl extends DescriptorImpl {
protected NetworkStatusImpl(byte[] rawDescriptorBytes)
throws DescriptorParseException {
- this.rawDescriptorBytes = rawDescriptorBytes;
- this.countKeywords(rawDescriptorBytes);
+ super(rawDescriptorBytes);
this.splitAndParseParts(rawDescriptorBytes);
}
@@ -126,7 +97,6 @@ public abstract class NetworkStatusImpl {
byte[] headerBytes = new byte[end - start];
System.arraycopy(this.rawDescriptorBytes, start,
headerBytes, 0, end - start);
- this.rememberFirstKeyword(headerBytes);
this.parseHeader(headerBytes);
}
@@ -240,101 +210,6 @@ public abstract class NetworkStatusImpl {
}
}
- private String firstKeyword;
- protected void rememberFirstKeyword(byte[] headerBytes) {
- try {
- BufferedReader br = new BufferedReader(new StringReader(
- new String(headerBytes)));
- this.firstKeyword = br.readLine().split(" ", -1)[0];
- } catch (IOException e) {
- throw new RuntimeException("Internal error: Ran into an "
- + "IOException while parsing a String in memory. Something's "
- + "really wrong.", e);
- }
- }
-
- protected void checkFirstKeyword(String keyword)
- throws DescriptorParseException {
- if (this.firstKeyword == null ||
- !this.firstKeyword.equals(keyword)) {
- throw new DescriptorParseException("Keyword '" + keyword + "' must "
- + "be contained in the first line.");
- }
- }
-
- /* Count parsed keywords in header and footer for consistency checks by
- * subclasses. */
- private Map<String, Integer> parsedKeywords =
- new HashMap<String, Integer>();
- protected void countKeywords(byte[] rawDescriptorBytes)
- throws DescriptorParseException {
- try {
- BufferedReader br = new BufferedReader(new StringReader(
- new String(rawDescriptorBytes)));
- String line;
- boolean skipCrypto = false;
- while ((line = br.readLine()) != null) {
- if (line.startsWith("-----BEGIN")) {
- skipCrypto = true;
- } else if (line.startsWith("-----END")) {
- skipCrypto = false;
- } else if (!skipCrypto) {
- String keyword = line.split(" ", -1)[0];
- if (keyword.equals("")) {
- throw new DescriptorParseException("Illegal keyword in line '"
- + line + "'.");
- }
- if (parsedKeywords.containsKey(keyword)) {
- parsedKeywords.put(keyword, parsedKeywords.get(keyword) + 1);
- } else {
- parsedKeywords.put(keyword, 1);
- }
- }
- }
- } catch (IOException e) {
- throw new RuntimeException("Internal error: Ran into an "
- + "IOException while parsing a String in memory. Something's "
- + "really wrong.", e);
- }
- }
-
- protected void checkExactlyOnceKeywords(Set<String> keywords)
- throws DescriptorParseException {
- for (String keyword : keywords) {
- int contained = 0;
- if (this.parsedKeywords.containsKey(keyword)) {
- contained = this.parsedKeywords.get(keyword);
- }
- if (contained != 1) {
- throw new DescriptorParseException("Keyword '" + keyword + "' is "
- + "contained " + contained + " times, but must be contained "
- + "exactly once.");
- }
- }
- }
-
- protected void checkAtLeastOnceKeywords(Set<String> keywords)
- throws DescriptorParseException {
- for (String keyword : keywords) {
- if (!this.parsedKeywords.containsKey(keyword)) {
- throw new DescriptorParseException("Keyword '" + keyword + "' is "
- + "contained 0 times, but must be contained at least once.");
- }
- }
- }
-
- protected void checkAtMostOnceKeywords(Set<String> keywords)
- throws DescriptorParseException {
- for (String keyword : keywords) {
- if (this.parsedKeywords.containsKey(keyword) &&
- this.parsedKeywords.get(keyword) > 1) {
- throw new DescriptorParseException("Keyword '" + keyword + "' is "
- + "contained " + this.parsedKeywords.get(keyword) + " times, "
- + "but must be contained at most once.");
- }
- }
- }
-
private SortedMap<String, DirSourceEntry> dirSourceEntries =
new TreeMap<String, DirSourceEntry>();
public SortedMap<String, DirSourceEntry> getDirSourceEntries() {
diff --git a/src/org/torproject/descriptor/impl/ParseHelper.java b/src/org/torproject/descriptor/impl/ParseHelper.java
index 5f4a1bd..296955e 100644
--- a/src/org/torproject/descriptor/impl/ParseHelper.java
+++ b/src/org/torproject/descriptor/impl/ParseHelper.java
@@ -61,6 +61,51 @@ public class ParseHelper {
return port;
}
+ public static String parseExitPattern(String line, String exitPattern)
+ throws DescriptorParseException {
+ if (!exitPattern.contains(":")) {
+ throw new DescriptorParseException("'" + exitPattern + "' in line '"
+ + line + "' must contain address and port.");
+ }
+ String[] parts = exitPattern.split(":");
+ String addressPart = parts[0];
+ /* TODO Extend to IPv6. */
+ if (addressPart.equals("*")) {
+ /* Nothing to check. */
+ } else if (addressPart.contains("/")) {
+ String[] addressParts = addressPart.split("/");
+ String address = addressParts[0];
+ ParseHelper.parseIpv4Address(line, address);
+ String mask = addressParts[1];
+ int maskValue = -1;
+ try {
+ maskValue = Integer.parseInt(addressPart.substring(
+ addressPart.indexOf("/") + 1));
+ } catch (NumberFormatException e) {
+ /* Handle below. */
+ }
+ if (addressParts.length != 2 || maskValue < 0 || maskValue > 32) {
+ throw new DescriptorParseException("'" + addressPart + "' in "
+ + "line '" + line + "' is not a valid address part.");
+ }
+ } else {
+ ParseHelper.parseIpv4Address(line, addressPart);
+ }
+ String portPart = parts[1];
+ if (portPart.equals("*")) {
+ /* Nothing to check. */
+ } else if (portPart.contains("-")) {
+ String[] portParts = portPart.split("-");
+ String fromPort = portParts[0];
+ ParseHelper.parsePort(line, fromPort);
+ String toPort = portParts[1];
+ ParseHelper.parsePort(line, toPort);
+ } else {
+ ParseHelper.parsePort(line, portPart);
+ }
+ return exitPattern;
+ }
+
private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
static {
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
index c4dc88b..a5ab87c 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
@@ -29,7 +29,7 @@ public class RelayNetworkStatusConsensusImpl extends NetworkStatusImpl
List<RelayNetworkStatusConsensus> parsedConsensuses =
new ArrayList<RelayNetworkStatusConsensus>();
List<byte[]> splitConsensusBytes =
- NetworkStatusImpl.splitRawDescriptorBytes(consensusesBytes,
+ DescriptorImpl.splitRawDescriptorBytes(consensusesBytes,
"network-status-version 3");
try {
for (byte[] consensusBytes : splitConsensusBytes) {
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
index ab4da77..438b1df 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
@@ -25,7 +25,7 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
List<RelayNetworkStatusVote> parsedVotes =
new ArrayList<RelayNetworkStatusVote>();
List<byte[]> splitVotesBytes =
- NetworkStatusImpl.splitRawDescriptorBytes(votesBytes,
+ DescriptorImpl.splitRawDescriptorBytes(votesBytes,
"network-status-version 3");
try {
for (byte[] voteBytes : splitVotesBytes) {
diff --git a/src/org/torproject/descriptor/impl/RelayServerDescriptorImpl.java b/src/org/torproject/descriptor/impl/RelayServerDescriptorImpl.java
new file mode 100644
index 0000000..a5374b6
--- /dev/null
+++ b/src/org/torproject/descriptor/impl/RelayServerDescriptorImpl.java
@@ -0,0 +1,529 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.torproject.descriptor.RelayServerDescriptor;
+import org.torproject.descriptor.BandwidthHistory;
+
+/* Contains a relay server descriptor. */
+public class RelayServerDescriptorImpl extends DescriptorImpl
+ implements RelayServerDescriptor {
+
+ protected static List<RelayServerDescriptor> parseDescriptors(
+ byte[] descriptorsBytes) {
+ List<RelayServerDescriptor> parsedDescriptors =
+ new ArrayList<RelayServerDescriptor>();
+ List<byte[]> splitDescriptorsBytes =
+ DescriptorImpl.splitRawDescriptorBytes(descriptorsBytes,
+ "router ");
+ try {
+ for (byte[] descriptorBytes : splitDescriptorsBytes) {
+ RelayServerDescriptor parsedDescriptor =
+ new RelayServerDescriptorImpl(descriptorBytes);
+ parsedDescriptors.add(parsedDescriptor);
+ }
+ } catch (DescriptorParseException e) {
+ /* TODO Handle this error somehow. */
+ System.err.println("Failed to parse descriptor. Skipping.");
+ e.printStackTrace();
+ }
+ return parsedDescriptors;
+ }
+
+ protected RelayServerDescriptorImpl(byte[] descriptorBytes)
+ throws DescriptorParseException {
+ super(descriptorBytes);
+ this.parseDescriptorBytes();
+ Set<String> exactlyOnceKeywords = new HashSet<String>(Arrays.asList((
+ "router,bandwidth,published,onion-key,signing-key,"
+ + "router-signature").split(",")));
+ this.checkExactlyOnceKeywords(exactlyOnceKeywords);
+ Set<String> atMostOnceKeywords = new HashSet<String>(Arrays.asList((
+ "platform,fingerprint,hibernating,uptime,contact,family,"
+ + "read-history,write-history,eventdns,caches-extra-info,"
+ + "extra-info-digest,hidden-service-dir,protocols,"
+ + "allow-single-hop-exits").split(",")));
+ this.checkAtMostOnceKeywords(atMostOnceKeywords);
+ this.checkFirstKeyword("router");
+ this.checkLastKeyword("router-signature");
+ if (this.getKeywordCount("accept") == 0 &&
+ this.getKeywordCount("reject") == 0) {
+ throw new DescriptorParseException("Either keyword 'accept' or "
+ + "'reject' must be contained at least once.");
+ }
+ return;
+ }
+
+ private void parseDescriptorBytes() throws DescriptorParseException {
+ try {
+ BufferedReader br = new BufferedReader(new StringReader(
+ new String(this.rawDescriptorBytes)));
+ String line;
+ boolean skipCrypto = false;
+ while ((line = br.readLine()) != null) {
+ String lineNoOpt = line.startsWith("opt ") ?
+ line.substring("opt ".length()) : line;
+ String[] partsNoOpt = lineNoOpt.split(" ");
+ String keyword = partsNoOpt[0];
+ if (keyword.equals("router")) {
+ this.parseRouterLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("bandwidth")) {
+ this.parseBandwidthLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("platform")) {
+ this.parsePlatformLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("published")) {
+ this.parsePublishedLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("fingerprint")) {
+ this.parseFingerprintLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("hibernating")) {
+ this.parseHibernatingLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("uptime")) {
+ this.parseUptimeLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("onion-key")) {
+ this.parseOnionKeyLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("signing-key")) {
+ this.parseSigningKeyLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("accept")) {
+ this.parseAcceptLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("reject")) {
+ this.parseRejectLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("router-signature")) {
+ this.parseRouterSignatureLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("contact")) {
+ this.parseContactLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("family")) {
+ this.parseFamilyLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("read-history")) {
+ this.parseReadHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("write-history")) {
+ this.parseWriteHistoryLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("eventdns")) {
+ this.parseEventdnsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("caches-extra-info")) {
+ this.parseCachesExtraInfoLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("extra-info-digest")) {
+ this.parseExtraInfoDigestLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("hidden-service-dir")) {
+ this.parseHiddenServiceDirLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("protocols")) {
+ this.parseProtocolsLine(line, lineNoOpt, partsNoOpt);
+ } else if (keyword.equals("allow-single-hop-exits")) {
+ this.parseAllowSingleHopExitsLine(line, lineNoOpt, partsNoOpt);
+ } else if (line.startsWith("-----BEGIN")) {
+ skipCrypto = true;
+ } else if (line.startsWith("-----END")) {
+ skipCrypto = false;
+ } else if (!skipCrypto) {
+ /* TODO Is throwing an exception the right thing to do here?
+ * This is probably fine for development, but once the library
+ * is in production use, this seems annoying. In theory,
+ * dir-spec.txt says that unknown lines should be ignored. This
+ * also applies to the other descriptors. */
+ throw new DescriptorParseException("Unrecognized line '" + line
+ + "'.");
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Internal error: Ran into an "
+ + "IOException while parsing a String in memory. Something's "
+ + "really wrong.", e);
+ }
+ }
+
+ private void parseRouterLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 6) {
+ throw new DescriptorParseException("Illegal line '" + line
+ + "' in server descriptor.");
+ }
+ this.nickname = ParseHelper.parseNickname(line, partsNoOpt[1]);
+ this.address = ParseHelper.parseIpv4Address(line, partsNoOpt[2]);
+ this.orPort = ParseHelper.parsePort(line, partsNoOpt[3]);
+ this.socksPort = ParseHelper.parsePort(line, partsNoOpt[4]);
+ this.dirPort = ParseHelper.parsePort(line, partsNoOpt[5]);
+ }
+
+ private void parseBandwidthLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 4) {
+ throw new DescriptorParseException("Wrong number of values in line "
+ + "'" + line + "'.");
+ }
+ boolean isValid = false;
+ try {
+ this.bandwidthRate = Integer.parseInt(partsNoOpt[1]);
+ this.bandwidthBurst = Integer.parseInt(partsNoOpt[2]);
+ this.bandwidthObserved = Integer.parseInt(partsNoOpt[3]);
+ if (this.bandwidthRate >= 0 && this.bandwidthBurst >= 0 &&
+ this.bandwidthObserved >= 0) {
+ isValid = true;
+ }
+ } catch (NumberFormatException e) {
+ /* Handle below. */
+ }
+ if (!isValid) {
+ throw new DescriptorParseException("Illegal values in line '" + line
+ + "'.");
+ }
+ }
+
+ private void parsePlatformLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (lineNoOpt.length() > "platform ".length()) {
+ this.platform = lineNoOpt.substring("platform ".length());
+ } else {
+ this.platform = "";
+ }
+ }
+
+ private void parsePublishedLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.publishedMillis = ParseHelper.parseTimestampAtIndex(line,
+ partsNoOpt, 1, 2);
+ }
+
+ private void parseFingerprintLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (lineNoOpt.length() != "fingerprint".length() + 5 * 10) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ this.fingerprint = ParseHelper.parseTwentyByteHexString(line,
+ lineNoOpt.substring("fingerprint ".length()).replaceAll(" ", ""));
+ }
+
+ private void parseHibernatingLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 2) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ if (partsNoOpt[1].equals("true")) {
+ this.hibernating = true;
+ } else if (partsNoOpt[1].equals("false")) {
+ this.hibernating = false;
+ } else {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ }
+
+ private void parseUptimeLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 2) {
+ throw new DescriptorParseException("Wrong number of values in line "
+ + "'" + line + "'.");
+ }
+ boolean isValid = false;
+ try {
+ this.uptime = Integer.parseInt(partsNoOpt[1]);
+ if (this.uptime >= 0) {
+ isValid = true;
+ }
+ } catch (NumberFormatException e) {
+ /* Handle below. */
+ }
+ if (!isValid) {
+ throw new DescriptorParseException("Illegal value in line '" + line
+ + "'.");
+ }
+ }
+
+ private void parseOnionKeyLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* Not parsing crypto parts (yet). */
+ }
+
+ private void parseSigningKeyLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ /* Not parsing crypto parts (yet). */
+ }
+
+ private void parseAcceptLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.parseExitPolicyLine(line, lineNoOpt, partsNoOpt);
+ }
+
+ private void parseRejectLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.parseExitPolicyLine(line, lineNoOpt, partsNoOpt);
+ }
+
+ private void parseExitPolicyLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 2) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ ParseHelper.parseExitPattern(line, partsNoOpt[1]);
+ this.exitPolicyLines.add(lineNoOpt);
+ }
+
+ private void parseRouterSignatureLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (!lineNoOpt.equals("router-signature")) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ /* Not parsing crypto parts (yet). */
+ }
+
+ private void parseContactLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (lineNoOpt.length() > "contact ".length()) {
+ this.contact = lineNoOpt.substring("contact ".length());
+ } else {
+ this.contact = "";
+ }
+ }
+
+ private void parseFamilyLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.familyEntries = new ArrayList<String>();
+ for (int i = 1; i < partsNoOpt.length; i++) {
+ if (partsNoOpt[i].startsWith("$")) {
+ this.familyEntries.add("$"
+ + ParseHelper.parseTwentyByteHexString(line,
+ partsNoOpt[i].substring(1)));
+ } else {
+ this.familyEntries.add(ParseHelper.parseNickname(line,
+ partsNoOpt[i]));
+ }
+ }
+ }
+
+ private void parseReadHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.readHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseWriteHistoryLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.writeHistory = new BandwidthHistoryImpl(line, lineNoOpt,
+ partsNoOpt);
+ }
+
+ private void parseEventdnsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (partsNoOpt.length != 2) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ if (partsNoOpt[1].equals("true")) {
+ this.usesEnhancedDnsLogic = true;
+ } else if (partsNoOpt[1].equals("false")) {
+ this.usesEnhancedDnsLogic = false;
+ } else {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ }
+
+ private void parseCachesExtraInfoLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (!lineNoOpt.equals("caches-extra-info")) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ this.cachesExtraInfo = true;
+ }
+
+ private void parseExtraInfoDigestLine(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 parseHiddenServiceDirLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ this.hiddenServiceDirVersions = new ArrayList<Integer>();
+ if (partsNoOpt.length == 1) {
+ this.hiddenServiceDirVersions.add(2);
+ } else {
+ try {
+ for (int i = 1; i < partsNoOpt.length; i++) {
+ this.hiddenServiceDirVersions.add(Integer.parseInt(
+ partsNoOpt[i]));
+ }
+ } catch (NumberFormatException e) {
+ throw new DescriptorParseException("Illegal value in line '"
+ + line + "'.");
+ }
+ }
+ }
+
+ private void parseProtocolsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ List<String> partsList = Arrays.asList(partsNoOpt);
+ boolean isValid = true;
+ this.linkProtocolVersions = new ArrayList<Integer>();
+ this.circuitProtocolVersions = new ArrayList<Integer>();
+ List<Integer> protocolVersions = null;
+ for (int i = 1; i < partsNoOpt.length; i++) {
+ String part = partsNoOpt[i];
+ if (part.equals("Link")) {
+ protocolVersions = this.linkProtocolVersions;
+ } else if (part.equals("Circuit")) {
+ protocolVersions = this.circuitProtocolVersions;
+ } else if (protocolVersions == null) {
+ isValid = false;
+ break;
+ } else {
+ try {
+ protocolVersions.add(Integer.parseInt(part));
+ } catch (NumberFormatException e) {
+ isValid = false;
+ break;
+ }
+ }
+ }
+ if (protocolVersions != this.circuitProtocolVersions) {
+ isValid = false;
+ }
+ if (!isValid) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ }
+
+ private void parseAllowSingleHopExitsLine(String line, String lineNoOpt,
+ String[] partsNoOpt) throws DescriptorParseException {
+ if (!lineNoOpt.equals("allow-single-hop-exits")) {
+ throw new DescriptorParseException("Illegal line '" + line + "'.");
+ }
+ this.allowSingleHopExits = true;
+ }
+
+ private String nickname;
+ public String getNickname() {
+ return this.nickname;
+ }
+
+ private String address;
+ public String getAddress() {
+ return this.address;
+ }
+
+ private int orPort;
+ public int getOrPort() {
+ return this.orPort;
+ }
+
+ private int socksPort;
+ public int getSocksPort() {
+ return this.socksPort;
+ }
+
+ private int dirPort;
+ public int getDirPort() {
+ return this.dirPort;
+ }
+
+ private int bandwidthRate;
+ public int getBandwidthRate() {
+ return this.bandwidthRate;
+ }
+
+ private int bandwidthBurst;
+ public int getBandwidthBurst() {
+ return this.bandwidthBurst;
+ }
+
+ private int bandwidthObserved;
+ public int getBandwidthObserved() {
+ return this.bandwidthObserved;
+ }
+
+ private String platform;
+ public String getPlatform() {
+ return this.platform;
+ }
+
+ private long publishedMillis;
+ public long getPublishedMillis() {
+ return this.publishedMillis;
+ }
+
+ private String fingerprint;
+ public String getFingerprint() {
+ return this.fingerprint;
+ }
+
+ private boolean hibernating;
+ public boolean isHibernating() {
+ return this.hibernating;
+ }
+
+ private int uptime = -1;
+ public int getUptime() {
+ return this.uptime;
+ }
+
+ private List<String> exitPolicyLines = new ArrayList<String>();
+ public List<String> getExitPolicyLines() {
+ return new ArrayList<String>(this.exitPolicyLines);
+ }
+
+ private String contact;
+ public String getContact() {
+ return this.contact;
+ }
+
+ private List<String> familyEntries;
+ public List<String> getFamilyEntries() {
+ return this.familyEntries == null ? null :
+ new ArrayList<String>(this.familyEntries);
+ }
+
+ private BandwidthHistory readHistory;
+ public BandwidthHistory getReadHistory() {
+ return this.readHistory;
+ }
+
+ private BandwidthHistory writeHistory;
+ public BandwidthHistory getWriteHistory() {
+ return this.writeHistory;
+ }
+
+ private boolean usesEnhancedDnsLogic;
+ public boolean getUsesEnhancedDnsLogic() {
+ return this.usesEnhancedDnsLogic;
+ }
+
+ private boolean cachesExtraInfo;
+ public boolean getCachesExtraInfo() {
+ return this.cachesExtraInfo;
+ }
+
+ private String extraInfoDigest;
+ public String getExtraInfoDigest() {
+ return this.extraInfoDigest;
+ }
+
+ private List<Integer> hiddenServiceDirVersions;
+ public List<Integer> getHiddenServiceDirVersions() {
+ return this.hiddenServiceDirVersions == null ? null :
+ new ArrayList<Integer>(this.hiddenServiceDirVersions);
+ }
+
+ private List<Integer> linkProtocolVersions;
+ public List<Integer> getLinkProtocolVersions() {
+ return this.linkProtocolVersions == null ? null :
+ new ArrayList<Integer>(this.linkProtocolVersions);
+ }
+
+ private List<Integer> circuitProtocolVersions;
+ public List<Integer> getCircuitProtocolVersions() {
+ return this.circuitProtocolVersions == null ? null :
+ new ArrayList<Integer>(this.circuitProtocolVersions);
+ }
+
+ private boolean allowSingleHopExits;
+ public boolean getAllowSingleHopExits() {
+ return this.allowSingleHopExits;
+ }
+}
+
diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
index deadf80..d5bfd3a 100644
--- a/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
+++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
@@ -11,6 +11,8 @@ import org.junit.*;
import org.junit.rules.*;
import static org.junit.Assert.*;
+/* TODO Add test cases for all lines starting with "opt ". */
+
/* Test parsing of network status consensuses. The main focus is on
* making sure that the parser is as robust as possible and doesn't break,
* no matter what gets fed into it. A secondary focus is to ensure that
diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
index cdf2a01..7618fff 100644
--- a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
+++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
@@ -11,6 +11,8 @@ import org.junit.*;
import org.junit.rules.*;
import static org.junit.Assert.*;
+/* TODO Add test cases for all lines starting with "opt ". */
+
/* Test parsing of network status votes. Some of the vote-parsing code is
* already tested in the consensus-parsing tests. The tests in this class
* focus on the differences between votes and consensuses that are mostly
diff --git a/test/org/torproject/descriptor/impl/RelayServerDescriptorImplTest.java b/test/org/torproject/descriptor/impl/RelayServerDescriptorImplTest.java
new file mode 100644
index 0000000..acc2dbe
--- /dev/null
+++ b/test/org/torproject/descriptor/impl/RelayServerDescriptorImplTest.java
@@ -0,0 +1,1080 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.descriptor.impl;
+
+import org.torproject.descriptor.BandwidthHistory;
+import org.torproject.descriptor.RelayServerDescriptor;
+
+import java.util.*;
+
+import org.junit.*;
+import org.junit.rules.*;
+import static org.junit.Assert.*;
+
+/* Test parsing of relay server descriptors. */
+public class RelayServerDescriptorImplTest {
+
+ /* Helper class to build a descriptor based on default data and
+ * modifications requested by test methods. */
+ private static class DescriptorBuilder {
+ private String routerLine = "router saberrider2008 94.134.192.243 "
+ + "9001 0 0";
+ private static RelayServerDescriptor createWithRouterLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.routerLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String bandwidthLine = "bandwidth 51200 51200 53470";
+ private static RelayServerDescriptor createWithBandwidthLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.bandwidthLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String platformLine = "platform Tor 0.2.2.35 "
+ + "(git-b04388f9e7546a9f) on Linux i686";
+ private static RelayServerDescriptor createWithPlatformLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.platformLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String publishedLine = "published 2012-01-01 04:03:19";
+ private static RelayServerDescriptor createWithPublishedLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.publishedLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String fingerprintLine = "opt fingerprint D873 3048 FC8E "
+ + "C910 2466 AD8F 3098 622B F1BF 71FD";
+ private static RelayServerDescriptor createWithFingerprintLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.fingerprintLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String hibernatingLine = null;
+ private static RelayServerDescriptor createWithHibernatingLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.hibernatingLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String uptimeLine = "uptime 48";
+ private static RelayServerDescriptor createWithUptimeLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.uptimeLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String onionKeyLines = "onion-key\n"
+ + "-----BEGIN RSA PUBLIC KEY-----\n"
+ + "MIGJAoGBAKM+iiHhO6eHsvd6Xjws9z9EQB1V/Bpuy5ciGJ1U4V9SeiKooSo5Bp"
+ + "PL\no3XT+6PIgzl3R6uycjS3Ejk47vLEJdcVTm/VG6E0ppu3olIynCI4QryfCE"
+ + "uC3cTF\n9wE4WXY4nX7w0RTN18UVLxrt1A9PP0cobFNiPs9rzJCbKFfacOkpAg"
+ + "MBAAE=\n"
+ + "-----END RSA PUBLIC KEY-----";
+ private static RelayServerDescriptor createWithOnionKeyLines(
+ String lines) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.onionKeyLines = lines;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String signingKeyLines = "signing-key\n"
+ + "-----BEGIN RSA PUBLIC KEY-----\n"
+ + "MIGJAoGBALMm3r3QDh482Ewe6Ub9wvRIfmEkoNX6q5cEAtQRNHSDcNx41gjELb"
+ + "cl\nEniVMParBYACKfOxkS+mTTnIRDKVNEJTsDOwryNrc4X9JnPc/nn6ymYPiN"
+ + "DhUROG\n8URDIhQoixcUeyyrVB8sxliSstKimulGnB7xpjYOlO8JKaHLNL4TAg"
+ + "MBAAE=\n"
+ + "-----END RSA PUBLIC KEY-----";
+ private static RelayServerDescriptor createWithSigningKeyLines(
+ String lines) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.signingKeyLines = lines;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String exitPolicyLines = "reject *:*";
+ private static RelayServerDescriptor createWithExitPolicyLines(
+ String lines) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.exitPolicyLines = lines;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String contactLine = "contact Random Person <nobody AT "
+ + "example dot com>";
+ private static RelayServerDescriptor createWithContactLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.contactLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String familyLine = null;
+ private static RelayServerDescriptor createWithFamilyLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.familyLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String readHistoryLine = null;
+ private static RelayServerDescriptor createWithReadHistoryLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.readHistoryLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String writeHistoryLine = null;
+ private static RelayServerDescriptor createWithWriteHistoryLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.writeHistoryLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String eventdnsLine = null;
+ private static RelayServerDescriptor createWithEventdnsLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.eventdnsLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String cachesExtraInfoLine = null;
+ private static RelayServerDescriptor createWithCachesExtraInfoLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.cachesExtraInfoLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String extraInfoDigestLine = "opt extra-info-digest "
+ + "1469D1550738A25B1E7B47CDDBCD7B2899F51B74";
+ private static RelayServerDescriptor createWithExtraInfoDigestLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.extraInfoDigestLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String hiddenServiceDirLine = "opt hidden-service-dir";
+ private static RelayServerDescriptor createWithHiddenServiceDirLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.hiddenServiceDirLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String protocolsLine = "opt protocols Link 1 2 Circuit 1";
+ private static RelayServerDescriptor createWithProtocolsLine(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.protocolsLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String allowSingleHopExitsLine = null;
+ private static RelayServerDescriptor
+ createWithAllowSingleHopExitsLine(String line)
+ throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.allowSingleHopExitsLine = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private String routerSignatureLines = "router-signature\n"
+ + "-----BEGIN SIGNATURE-----\n"
+ + "o4j+kH8UQfjBwepUnr99v0ebN8RpzHJ/lqYsTojXHy9kMr1RNI9IDeSzA7PSqT"
+ + "uV\n4PL8QsGtlfwthtIoZpB2srZeyN/mcpA9fa1JXUrt/UN9K/+32Cyaad7h0n"
+ + "HE6Xfb\njqpXDpnBpvk4zjmzjjKYnIsUWTnADmu0fo3xTRqXi7g=\n"
+ + "-----END SIGNATURE-----";
+ private static RelayServerDescriptor createWithRouterSignatureLines(
+ String line) throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ db.routerSignatureLines = line;
+ return new RelayServerDescriptorImpl(db.buildDescriptor());
+ }
+ private byte[] buildDescriptor() {
+ StringBuilder sb = new StringBuilder();
+ if (this.routerLine != null) {
+ sb.append(this.routerLine + "\n");
+ }
+ if (this.bandwidthLine != null) {
+ sb.append(this.bandwidthLine + "\n");
+ }
+ if (this.platformLine != null) {
+ sb.append(this.platformLine + "\n");
+ }
+ if (this.publishedLine != null) {
+ sb.append(this.publishedLine + "\n");
+ }
+ if (this.fingerprintLine != null) {
+ sb.append(this.fingerprintLine + "\n");
+ }
+ if (this.hibernatingLine != null) {
+ sb.append(this.hibernatingLine + "\n");
+ }
+ if (this.uptimeLine != null) {
+ sb.append(this.uptimeLine + "\n");
+ }
+ if (this.onionKeyLines != null) {
+ sb.append(this.onionKeyLines + "\n");
+ }
+ if (this.signingKeyLines != null) {
+ sb.append(this.signingKeyLines + "\n");
+ }
+ if (this.exitPolicyLines != null) {
+ sb.append(this.exitPolicyLines + "\n");
+ }
+ if (this.contactLine != null) {
+ sb.append(this.contactLine + "\n");
+ }
+ if (this.familyLine != null) {
+ sb.append(this.familyLine + "\n");
+ }
+ if (this.readHistoryLine != null) {
+ sb.append(this.readHistoryLine + "\n");
+ }
+ if (this.writeHistoryLine != null) {
+ sb.append(this.writeHistoryLine + "\n");
+ }
+ if (this.eventdnsLine != null) {
+ sb.append(this.eventdnsLine + "\n");
+ }
+ if (this.cachesExtraInfoLine != null) {
+ sb.append(this.cachesExtraInfoLine + "\n");
+ }
+ if (this.extraInfoDigestLine != null) {
+ sb.append(this.extraInfoDigestLine + "\n");
+ }
+ if (this.hiddenServiceDirLine != null) {
+ sb.append(this.hiddenServiceDirLine + "\n");
+ }
+ if (this.protocolsLine != null) {
+ sb.append(this.protocolsLine + "\n");
+ }
+ if (this.allowSingleHopExitsLine != null) {
+ sb.append(this.allowSingleHopExitsLine + "\n");
+ }
+ if (this.routerSignatureLines != null) {
+ sb.append(this.routerSignatureLines + "\n");
+ }
+ return sb.toString().getBytes();
+ }
+ }
+
+ @Test()
+ public void testSampleDescriptor() throws DescriptorParseException {
+ DescriptorBuilder db = new DescriptorBuilder();
+ RelayServerDescriptor descriptor =
+ new RelayServerDescriptorImpl(db.buildDescriptor());
+ assertEquals("saberrider2008", descriptor.getNickname());
+ assertEquals("94.134.192.243", descriptor.getAddress());
+ assertEquals(9001, (int) descriptor.getOrPort());
+ assertEquals(0, (int) descriptor.getSocksPort());
+ assertEquals(0, (int) descriptor.getDirPort());
+ assertEquals("Tor 0.2.2.35 (git-b04388f9e7546a9f) on Linux i686",
+ descriptor.getPlatform());
+ assertEquals(Arrays.asList(new Integer[] {1, 2}),
+ descriptor.getLinkProtocolVersions());
+ assertEquals(Arrays.asList(new Integer[] {1}),
+ descriptor.getCircuitProtocolVersions());
+ assertEquals(1325390599000L, descriptor.getPublishedMillis());
+ assertEquals("D8733048FC8EC9102466AD8F3098622BF1BF71FD",
+ descriptor.getFingerprint());
+ assertEquals(48, (int) descriptor.getUptime());
+ assertEquals(51200, (int) descriptor.getBandwidthRate());
+ assertEquals(51200, (int) descriptor.getBandwidthBurst());
+ assertEquals(53470, (int) descriptor.getBandwidthObserved());
+ assertEquals("1469D1550738A25B1E7B47CDDBCD7B2899F51B74",
+ descriptor.getExtraInfoDigest());
+ assertEquals(Arrays.asList(new Integer[] {2}),
+ descriptor.getHiddenServiceDirVersions());
+ assertEquals("Random Person <nobody AT example dot com>",
+ descriptor.getContact());
+ assertEquals(Arrays.asList(new String[] {"reject *:*"}),
+ descriptor.getExitPolicyLines());
+ assertFalse(descriptor.isHibernating());
+ assertNull(descriptor.getFamilyEntries());
+ assertNull(descriptor.getReadHistory());
+ assertNull(descriptor.getWriteHistory());
+ assertFalse(descriptor.getUsesEnhancedDnsLogic());
+ assertFalse(descriptor.getCachesExtraInfo());
+ assertFalse(descriptor.getAllowSingleHopExits());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testRouterLineMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine(null);
+ }
+
+ @Test()
+ public void testRouterOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithRouterLine("opt router saberrider2008 "
+ + "94.134.192.243 9001 0 0");
+ assertEquals("saberrider2008", descriptor.getNickname());
+ assertEquals("94.134.192.243", descriptor.getAddress());
+ assertEquals(9001, (int) descriptor.getOrPort());
+ assertEquals(0, (int) descriptor.getSocksPort());
+ assertEquals(0, (int) descriptor.getDirPort());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testRouterLinePrecedingHibernatingLine()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("hibernating true\nrouter "
+ + "saberrider2008 94.134.192.243 9001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testNicknameMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router 94.134.192.243 9001 "
+ + "0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testNicknameInvalidChar() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router $aberrider2008 "
+ + "94.134.192.243 9001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testNicknameTooLong() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router "
+ + "saberrider2008ReallyLongNickname 94.134.192.243 9001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testAddress24() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192/24 9001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testAddress294() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "294.134.192.243 9001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testAddressMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 9001 "
+ + "0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testOrPort99001() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192.243 99001 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testOrPortMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192.243 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testOrPortOne() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192.243 one 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testOrPortNewline() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192.243 0\n 0 0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirPortMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterLine("router saberrider2008 "
+ + "94.134.192.243 9001 0 ");
+ }
+
+ @Test()
+ public void testPlatformMissing() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithPlatformLine(null);
+ assertNull(descriptor.getPlatform());
+ }
+
+ @Test()
+ public void testPlatformOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithPlatformLine("opt platform Tor 0.2.2.35 "
+ + "(git-b04388f9e7546a9f) on Linux i686");
+ assertEquals("Tor 0.2.2.35 (git-b04388f9e7546a9f) on Linux i686",
+ descriptor.getPlatform());
+ }
+
+ @Test()
+ public void testPlatformNoSpace() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithPlatformLine("platform");
+ assertEquals("", descriptor.getPlatform());
+ }
+
+ @Test()
+ public void testPlatformSpace() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithPlatformLine("platform ");
+ assertEquals("", descriptor.getPlatform());
+ }
+
+ @Test()
+ public void testProtocolsNoOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithProtocolsLine("protocols Link 1 2 Circuit 1");
+ assertEquals(Arrays.asList(new Integer[] {1, 2}),
+ descriptor.getLinkProtocolVersions());
+ assertEquals(Arrays.asList(new Integer[] {1}),
+ descriptor.getCircuitProtocolVersions());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testProtocolsAB() throws DescriptorParseException {
+ DescriptorBuilder.createWithProtocolsLine("opt protocols Link A B "
+ + "Circuit 1");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testProtocolsNoCircuitVersions()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithProtocolsLine("opt protocols Link 1 2");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testPublishedMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithPublishedLine(null);
+ }
+
+ @Test()
+ public void testPublishedOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithPublishedLine("opt published 2012-01-01 04:03:19");
+ assertEquals(1325390599000L, descriptor.getPublishedMillis());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testPublished3012() throws DescriptorParseException {
+ DescriptorBuilder.createWithPublishedLine("published 3012-01-01 "
+ + "04:03:19");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testPublished1912() throws DescriptorParseException {
+ DescriptorBuilder.createWithPublishedLine("published 1912-01-01 "
+ + "04:03:19");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testPublishedFeb31() throws DescriptorParseException {
+ DescriptorBuilder.createWithPublishedLine("published 2012-02-31 "
+ + "04:03:19");
+ }
+
+ @Test()
+ public void testFingerprintNoOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithFingerprintLine("fingerprint D873 3048 FC8E C910 2466 "
+ + "AD8F 3098 622B F1BF 71FD");
+ assertEquals("D8733048FC8EC9102466AD8F3098622BF1BF71FD",
+ descriptor.getFingerprint());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFingerprintG() throws DescriptorParseException {
+ DescriptorBuilder.createWithFingerprintLine("opt fingerprint G873 "
+ + "3048 FC8E C910 2466 AD8F 3098 622B F1BF 71FD");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFingerprintTooShort() throws DescriptorParseException {
+ DescriptorBuilder.createWithFingerprintLine("opt fingerprint D873 "
+ + "3048 FC8E C910 2466 AD8F 3098 622B F1BF");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFingerprintTooLong() throws DescriptorParseException {
+ DescriptorBuilder.createWithFingerprintLine("opt fingerprint D873 "
+ + "3048 FC8E C910 2466 AD8F 3098 622B F1BF 71FD D873");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFingerprintNoSpaces() throws DescriptorParseException {
+ DescriptorBuilder.createWithFingerprintLine("opt fingerprint "
+ + "D8733048FC8EC9102466AD8F3098622BF1BF71FD");
+ }
+
+ @Test()
+ public void testUptimeMissing() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithUptimeLine(null);
+ assertEquals(-1, (int) descriptor.getUptime());
+ }
+
+ @Test()
+ public void testUptimeOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithUptimeLine("opt uptime 48");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testUptimeFourtyEight() throws DescriptorParseException {
+ DescriptorBuilder.createWithUptimeLine("uptime fourty-eight");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testUptimeMinusOne() throws DescriptorParseException {
+ DescriptorBuilder.createWithUptimeLine("uptime -1");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testUptimeSpace() throws DescriptorParseException {
+ DescriptorBuilder.createWithUptimeLine("uptime ");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testUptimeNoSpace() throws DescriptorParseException {
+ DescriptorBuilder.createWithUptimeLine("uptime");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testUptimeFourEight() throws DescriptorParseException {
+ DescriptorBuilder.createWithUptimeLine("uptime 4 8");
+ }
+
+ @Test()
+ public void testBandwidthOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithBandwidthLine("opt bandwidth 51200 51200 53470");
+ assertEquals(51200, (int) descriptor.getBandwidthRate());
+ assertEquals(51200, (int) descriptor.getBandwidthBurst());
+ assertEquals(53470, (int) descriptor.getBandwidthObserved());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testBandwidthMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithBandwidthLine(null);
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testBandwidthTwoValues() throws DescriptorParseException {
+ DescriptorBuilder.createWithBandwidthLine("bandwidth 51200 51200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testBandwidthFourValues() throws DescriptorParseException {
+ DescriptorBuilder.createWithBandwidthLine("bandwidth 51200 51200 "
+ + "53470 53470");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testBandwidthMinusOneTwoThree()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithBandwidthLine("bandwidth -1 -2 -3");
+ }
+
+ @Test()
+ public void testExtraInfoDigestNoOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithExtraInfoDigestLine("extra-info-digest "
+ + "1469D1550738A25B1E7B47CDDBCD7B2899F51B74");
+ assertEquals("1469D1550738A25B1E7B47CDDBCD7B2899F51B74",
+ descriptor.getExtraInfoDigest());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExtraInfoDigestNoSpace()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithExtraInfoDigestLine("opt "
+ + "extra-info-digest");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExtraInfoDigestTooShort()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithExtraInfoDigestLine("opt "
+ + "extra-info-digest 1469D1550738A25B1E7B47CDDBCD7B2899F5");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExtraInfoDigestTooLong()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithExtraInfoDigestLine("opt "
+ + "extra-info-digest "
+ + "1469D1550738A25B1E7B47CDDBCD7B2899F51B741469");
+ }
+
+ @Test()
+ public void testExtraInfoDigestMissing()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithExtraInfoDigestLine(null);
+ assertNull(descriptor.getExtraInfoDigest());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testOnionKeyMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithOnionKeyLines(null);
+ }
+
+ @Test()
+ public void testOnionKeyOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithOnionKeyLines("opt onion-key\n"
+ + "-----BEGIN RSA PUBLIC KEY-----\n"
+ + "MIGJAoGBAKM+iiHhO6eHsvd6Xjws9z9EQB1V/Bpuy5ciGJ1U4V9SeiKooSo5Bp"
+ + "PL\no3XT+6PIgzl3R6uycjS3Ejk47vLEJdcVTm/VG6E0ppu3olIynCI4QryfCE"
+ + "uC3cTF\n9wE4WXY4nX7w0RTN18UVLxrt1A9PP0cobFNiPs9rzJCbKFfacOkpAg"
+ + "MBAAE=\n"
+ + "-----END RSA PUBLIC KEY-----");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testSigningKeyMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithSigningKeyLines(null);
+ }
+
+ @Test()
+ public void testSigningKeyOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithSigningKeyLines("opt signing-key\n"
+ + "-----BEGIN RSA PUBLIC KEY-----\n"
+ + "MIGJAoGBALMm3r3QDh482Ewe6Ub9wvRIfmEkoNX6q5cEAtQRNHSDcNx41gjELb"
+ + "cl\nEniVMParBYACKfOxkS+mTTnIRDKVNEJTsDOwryNrc4X9JnPc/nn6ymYPiN"
+ + "DhUROG\n8URDIhQoixcUeyyrVB8sxliSstKimulGnB7xpjYOlO8JKaHLNL4TAg"
+ + "MBAAE=\n"
+ + "-----END RSA PUBLIC KEY-----");
+ }
+
+ @Test()
+ public void testHiddenServiceDirMissing()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHiddenServiceDirLine(null);
+ assertNull(descriptor.getHiddenServiceDirVersions());
+ }
+
+ @Test()
+ public void testHiddenServiceDirNoOpt()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHiddenServiceDirLine("hidden-service-dir");
+ assertEquals(Arrays.asList(new Integer[] {2}),
+ descriptor.getHiddenServiceDirVersions());
+ }
+
+ @Test()
+ public void testHiddenServiceDirVersions2And3()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHiddenServiceDirLine("hidden-service-dir 2 3");
+ assertEquals(Arrays.asList(new Integer[] {2, 3}),
+ descriptor.getHiddenServiceDirVersions());
+ }
+
+ @Test()
+ public void testContactMissing() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithContactLine(null);
+ assertNull(descriptor.getContact());
+ }
+
+ @Test()
+ public void testContactOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithContactLine("opt contact Random Person");
+ assertEquals("Random Person", descriptor.getContact());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testContactDuplicate() throws DescriptorParseException {
+ DescriptorBuilder.createWithContactLine("contact Random "
+ + "Person\ncontact Random Person");
+ }
+
+ @Test()
+ public void testContactNoSpace() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithContactLine("contact");
+ assertEquals("", descriptor.getContact());
+ }
+
+ @Test()
+ public void testExitPolicyRejectAllAcceptAll()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithExitPolicyLines("reject *:*\naccept *:*");
+ assertEquals(Arrays.asList(new String[] {"reject *:*", "accept *:*"}),
+ descriptor.getExitPolicyLines());
+ }
+
+ @Test()
+ public void testExitPolicyOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithExitPolicyLines("opt reject *:*");
+ assertEquals(Arrays.asList(new String[] {"reject *:*"}),
+ descriptor.getExitPolicyLines());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitPolicyNoPort() throws DescriptorParseException {
+ DescriptorBuilder.createWithExitPolicyLines("reject *");
+ }
+
+ @Test()
+ public void testExitPolicyAccept80RejectAll()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithExitPolicyLines("accept *:80\nreject *:*");
+ assertEquals(Arrays.asList(new String[] {"accept *:80",
+ "reject *:*"}), descriptor.getExitPolicyLines());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitPolicyReject321() throws DescriptorParseException {
+ DescriptorBuilder.createWithExitPolicyLines("reject "
+ + "123.123.123.321:80");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitPolicyRejectPort66666()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithExitPolicyLines("reject *:66666");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitPolicyProjectAll() throws DescriptorParseException {
+ DescriptorBuilder.createWithExitPolicyLines("project *:*");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitPolicyMissing() throws DescriptorParseException {
+ DescriptorBuilder.createWithExitPolicyLines(null);
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testRouterSignatureMissing()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterSignatureLines(null);
+ }
+
+ @Test()
+ public void testRouterSignatureOpt()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterSignatureLines("opt "
+ + "router-signature\n"
+ + "-----BEGIN SIGNATURE-----\n"
+ + "crypto lines are ignored anyway\n"
+ + "-----END SIGNATURE-----");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testRouterSignatureNotLastLine()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithRouterSignatureLines("router-signature\n"
+ + "-----BEGIN SIGNATURE-----\n"
+ + "o4j+kH8UQfjBwepUnr99v0ebN8RpzHJ/lqYsTojXHy9kMr1RNI9IDeSzA7PSqT"
+ + "uV\n4PL8QsGtlfwthtIoZpB2srZeyN/mcpA9fa1JXUrt/UN9K/+32Cyaad7h0n"
+ + "HE6Xfb\njqpXDpnBpvk4zjmzjjKYnIsUWTnADmu0fo3xTRqXi7g=\n"
+ + "-----END SIGNATURE-----\ncontact me");
+ }
+
+ @Test()
+ public void testHibernatingOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHibernatingLine("opt hibernating true");
+ assertTrue(descriptor.isHibernating());
+ }
+
+ @Test()
+ public void testHibernatingFalse() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHibernatingLine("hibernating false");
+ assertFalse(descriptor.isHibernating());
+ }
+
+ @Test()
+ public void testHibernatingTrue() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithHibernatingLine("hibernating true");
+ assertTrue(descriptor.isHibernating());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testHibernatingYep() throws DescriptorParseException {
+ DescriptorBuilder.createWithHibernatingLine("hibernating yep");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testHibernatingNoSpace() throws DescriptorParseException {
+ DescriptorBuilder.createWithHibernatingLine("hibernating");
+ }
+
+ @Test()
+ public void testFamilyOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithFamilyLine("opt family saberrider2008");
+ assertEquals(Arrays.asList(new String[] {"saberrider2008"}),
+ descriptor.getFamilyEntries());
+ }
+
+ @Test()
+ public void testFamilyFingerprint() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithFamilyLine("family "
+ + "$D8733048FC8EC9102466AD8F3098622BF1BF71FD");
+ assertEquals(Arrays.asList(new String[] {
+ "$D8733048FC8EC9102466AD8F3098622BF1BF71FD"}),
+ descriptor.getFamilyEntries());
+ }
+
+ @Test()
+ public void testFamilyNickname() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithFamilyLine("family saberrider2008");
+ assertEquals(Arrays.asList(new String[] {"saberrider2008"}),
+ descriptor.getFamilyEntries());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFamilyDuplicate() throws DescriptorParseException {
+ DescriptorBuilder.createWithFamilyLine("family "
+ + "saberrider2008\nfamily saberrider2008");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFamilyNicknamePrefix() throws DescriptorParseException {
+ DescriptorBuilder.createWithFamilyLine("family $saberrider2008");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testFamilyFingerprintNoPrefix()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithFamilyLine("family "
+ + "D8733048FC8EC9102466AD8F3098622BF1BF71FD");
+ }
+
+ @Test()
+ public void testWriteHistory() throws DescriptorParseException {
+ String writeHistoryLine = "write-history 2012-01-01 03:51:44 (900 s) "
+ + "4345856,261120,7591936,1748992";
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine(writeHistoryLine);
+ assertNotNull(descriptor.getWriteHistory());
+ BandwidthHistory parsedWriteHistory = descriptor.getWriteHistory();
+ assertEquals(writeHistoryLine, parsedWriteHistory.getLine());
+ assertEquals(1325389904000L, (long) parsedWriteHistory.
+ getHistoryEndMillis());
+ assertEquals(900L, (long) parsedWriteHistory.getIntervalLength());
+ SortedMap<Long, Long> bandwidthValues = parsedWriteHistory.
+ getBandwidthValues();
+ assertEquals(4345856L, (long) bandwidthValues.remove(1325387204000L));
+ assertEquals(261120L, (long) bandwidthValues.remove(1325388104000L));
+ assertEquals(7591936L, (long) bandwidthValues.remove(1325389004000L));
+ assertEquals(1748992L, (long) bandwidthValues.remove(1325389904000L));
+ assertTrue(bandwidthValues.isEmpty());
+ }
+
+ @Test()
+ public void testWriteHistoryOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine("opt write-history 2012-01-01 "
+ + "03:51:44 (900 s) 4345856,261120,7591936,1748992");
+ assertNotNull(descriptor.getWriteHistory());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistory3012() throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "3012-01-01 03:51:44 (900 s) 4345856,261120,7591936,1748992");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryNoSeconds()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51 (900 s) 4345856,261120,7591936,1748992");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryNoParathenses()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51:44 900 s 4345856,261120,7591936,1748992");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryNoSpaceSeconds()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51:44 (900s) 4345856,261120,7591936,1748992");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryTrailingComma()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51:44 (900 s) 4345856,261120,7591936,");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryOneTwoThree()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51:44 (900 s) one,two,three");
+ }
+
+ @Test()
+ public void testWriteHistoryNoValuesSpace()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine("write-history 2012-01-01 03:51:44 "
+ + "(900 s) ");
+ assertEquals(900, (long) descriptor.getWriteHistory().
+ getIntervalLength());
+ assertTrue(descriptor.getWriteHistory().getBandwidthValues().
+ isEmpty());
+ }
+
+ @Test()
+ public void testWriteHistoryNoValuesNoSpace()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine("write-history 2012-01-01 03:51:44 "
+ + "(900 s)");
+ assertEquals(900, (long) descriptor.getWriteHistory().
+ getIntervalLength());
+ assertTrue(descriptor.getWriteHistory().getBandwidthValues().
+ isEmpty());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryNoS() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine("write-history 2012-01-01 03:51:44 "
+ + "(900 ");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testWriteHistoryTrailingNumber()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-01-01 03:51:44 (900 s) 4345856 1");
+ }
+
+ @Test()
+ public void testWriteHistory1800Seconds()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithWriteHistoryLine("write-history 2012-01-01 03:51:44 "
+ + "(1800 s) 4345856");
+ assertEquals(1800L, (long) descriptor.getWriteHistory().
+ getIntervalLength());
+ }
+
+ @Test()
+ public void testReadHistory() throws DescriptorParseException {
+ String readHistoryLine = "read-history 2012-01-01 03:51:44 (900 s) "
+ + "4268032,139264,7797760,1415168";
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithReadHistoryLine(readHistoryLine);
+ assertNotNull(descriptor.getReadHistory());
+ BandwidthHistory parsedReadHistory = descriptor.getReadHistory();
+ assertEquals(readHistoryLine, parsedReadHistory.getLine());
+ assertEquals(1325389904000L, (long) parsedReadHistory.
+ getHistoryEndMillis());
+ assertEquals(900L, (long) parsedReadHistory.getIntervalLength());
+ SortedMap<Long, Long> bandwidthValues = parsedReadHistory.
+ getBandwidthValues();
+ assertEquals(4268032L, (long) bandwidthValues.remove(1325387204000L));
+ assertEquals(139264L, (long) bandwidthValues.remove(1325388104000L));
+ assertEquals(7797760L, (long) bandwidthValues.remove(1325389004000L));
+ assertEquals(1415168L, (long) bandwidthValues.remove(1325389904000L));
+ assertTrue(bandwidthValues.isEmpty());
+ }
+
+ /* TODO There are some old server descriptors with " read-history"
+ * lines. Find out if these were spec-compliant and if other lines may
+ * start with leading spaces, too. */
+ @Test(expected = DescriptorParseException.class)
+ public void testReadHistoryLeadingSpace()
+ throws DescriptorParseException {
+ String readHistoryLine = " read-history 2012-01-01 03:51:44 (900 s) "
+ + "4268032,139264,7797760,1415168";
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithReadHistoryLine(readHistoryLine);
+ }
+
+ @Test()
+ public void testEventdnsOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithEventdnsLine("opt eventdns true");
+ assertTrue(descriptor.getUsesEnhancedDnsLogic());
+ }
+
+ @Test()
+ public void testEventdnsTrue() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithEventdnsLine("eventdns true");
+ assertTrue(descriptor.getUsesEnhancedDnsLogic());
+ }
+
+ @Test()
+ public void testEventdnsFalse() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithEventdnsLine("eventdns false");
+ assertFalse(descriptor.getUsesEnhancedDnsLogic());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testEventdns1() throws DescriptorParseException {
+ DescriptorBuilder.createWithEventdnsLine("eventdns 1");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testEventdnsNo() throws DescriptorParseException {
+ DescriptorBuilder.createWithEventdnsLine("eventdns no");
+ }
+
+ @Test()
+ public void testCachesExtraInfoOpt() throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithCachesExtraInfoLine("opt caches-extra-info");
+ assertTrue(descriptor.getCachesExtraInfo());
+ }
+
+ @Test()
+ public void testCachesExtraInfoNoSpace()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithCachesExtraInfoLine("caches-extra-info");
+ assertTrue(descriptor.getCachesExtraInfo());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testCachesExtraInfoTrue() throws DescriptorParseException {
+ DescriptorBuilder.createWithCachesExtraInfoLine("caches-extra-info "
+ + "true");
+ }
+
+ @Test()
+ public void testAllowSingleHopExitsOpt()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithCachesExtraInfoLine("opt allow-single-hop-exits");
+ assertTrue(descriptor.getAllowSingleHopExits());
+ }
+
+ @Test()
+ public void testAllowSingleHopExitsNoSpace()
+ throws DescriptorParseException {
+ RelayServerDescriptor descriptor = DescriptorBuilder.
+ createWithCachesExtraInfoLine("allow-single-hop-exits");
+ assertTrue(descriptor.getAllowSingleHopExits());
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testAllowSingleHopExitsTrue()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithCachesExtraInfoLine(
+ "allow-single-hop-exits true");
+ }
+}
+
1
0

02 Jan '12
commit 6742230409043808a76328cdf2963723eddff99f
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Jan 2 13:15:12 2012 +0000
Update translations for vidalia
---
el/vidalia_el.po | 53 ++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/el/vidalia_el.po b/el/vidalia_el.po
index f72491e..e660d9c 100755
--- a/el/vidalia_el.po
+++ b/el/vidalia_el.po
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-09-07 14:40+0000\n"
-"PO-Revision-Date: 2012-01-02 12:41+0000\n"
+"PO-Revision-Date: 2012-01-02 13:12+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
@@ -3329,6 +3329,9 @@ msgid ""
"software. If Tor exited unexpectedly, select the \"Advanced\" tab above for "
"details about any errors encountered."
msgstr ""
+"Πατήστε \"Start Tor\" στον Πίνακα Ελέγχου του Vidalia για να επανεκκινήσετε "
+"το Tor. Αν το Tor τερματίστηκε αναπάντεχα, επιλέξτε το tab \"Advanced\" για "
+"λεπτομέρειες για πιθανά σφάλματα."
msgctxt "StatusEventWidget"
msgid ""
@@ -3337,6 +3340,9 @@ msgid ""
"software, which may contain important security, reliability and performance "
"fixes."
msgstr ""
+"Αυτή τη στιγμή εκτελείτε την έκδοση \"%1\" του Tor, η οποία δεν είναι πλέον "
+"η συνιστώμενη. Αναβαθμίστε το πρόγραμμα στην πιο πρόσφατη έκδοσή του η οποία"
+" ίσως περιέχει σημαντικές βελτιώσεις ασφαλείας, αξιοπιστίας και επιδόσεων."
msgctxt "StatusEventWidget"
msgid ""
@@ -3345,30 +3351,39 @@ msgid ""
"version of the software, which may contain important security, reliability "
"and performance fixes."
msgstr ""
+"Αυτή τη στιγμή εκτελείτε την έκδοση \"%1\" του Tor, η οποία ίσως δεν "
+"λειτουργεί με το τρέχον δίκτυο Tor. Αναβαθμίστε το πρόγραμμα στην πιο "
+"πρόσφατη έκδοσή του η οποία ίσως περιέχει σημαντικές βελτιώσεις ασφαλείας, "
+"αξιοπιστίας και επιδόσεων."
msgctxt "StatusEventWidget"
msgid "Your Tor Software is Out-of-date"
-msgstr ""
+msgstr "Το Λογισμικό σας δεν είναι ενημερωμένο"
msgctxt "StatusEventWidget"
msgid "Connected to the Tor Network"
-msgstr ""
+msgstr "Συνδέθηκε στο δίκτυο Tor"
msgctxt "StatusEventWidget"
msgid ""
"We were able to successfully establish a connection to the Tor network. You "
"can now configure your applications to use the Internet anonymously."
msgstr ""
+"Η σύνδεση με το δίκτυο Tor αποκαταστάθηκε με επιτυχία. Μπορείτε τώρα να "
+"ρυθμίσετε τις εφαρμογές σας ώστε να χρησιμοποιούν το Διαδίκτυο ανώνυμα."
msgctxt "StatusEventWidget"
msgid "Tor Software Error"
-msgstr ""
+msgstr "Σφάλμα Λογισμικού Tor"
msgctxt "StatusEventWidget"
msgid ""
"The Tor software encountered an internal bug. Please report the following "
"error message to the Tor developers at bugs.torproject.org: \"%1\""
msgstr ""
+"Το πρόγραμμα Tor έχει κάποιο εσωτερικό σφάλμα. Παρακαλούμε, αναφέρετε το "
+"μήνυμα σφάλματος που ακολουθεί στους προγραμματιστές του Tor, στην διεύθυνση"
+" bugs.torproject.org: \"%1\"."
msgctxt "StatusEventWidget"
msgid ""
@@ -3377,6 +3392,10 @@ msgid ""
"will not be able to function. Please verify your computer displays the "
"correct time."
msgstr ""
+"To Tor διαπίστωσε ότι το ρολόι του υπολογιστή σας είναι ρυθμισμένο πάει πίσω"
+" %1 δευτερολέπτα ως προς τον ρυθμιστικό υπολογιστή \"%2\". Αν το ρολόι του "
+"υπολογιστή σας δεν είναι σωστό, το Tor δεν θα μπορέσει να λειτουργήσει. "
+"Επιβεβαιώστε ότι ο υπολογιστής σας εμφανίζει την σωστή ώρα."
msgctxt "StatusEventWidget"
msgid ""
@@ -3385,6 +3404,10 @@ msgid ""
"will not be able to function. Please verify your computer displays the "
"correct time."
msgstr ""
+"Το Tor διαπίστωσε ότι το ρολόι του υπολογιστή σας είνα ρυθμισμένο πάει "
+"μπροστά %1 δευτερόλεπτα ως προς τον ρυθμιστικό υπολογιστή \"%2\". Αν το "
+"ρολόι του υπολογιστή σς δεν είναι σωστό, το Tor δεν θα μπορέσει να "
+"λειτουργήσει. Επιβεβαιώστε ότι ο υπολογιστής σας εμφανίζει την σωστή ώρα."
msgctxt "StatusEventWidget"
msgid "Your Computer's Clock is Potentially Incorrect"
@@ -3397,6 +3420,10 @@ msgid ""
"information over the Tor network is dangerous and not recommended. For your "
"protection, Tor has automatically closed this connection."
msgstr ""
+"Κάποια εφαρμογή του υπολογιστή σας ίσως προσπάθησε να συνδεθεί χωρίς "
+"κρυπτογράφηση μέσω του Tor στην θύρα %1. Η αποστολή μη κρυπτογραφημένων "
+"πληροφοριών μέσω του δικτύου Tor είναι επικίνδυνη και δεν συνιστάται. Για "
+"την δική σας προστασία το Tor έκλεισε την σύνδεση αυτή."
msgctxt "StatusEventWidget"
msgid ""
@@ -3404,10 +3431,13 @@ msgid ""
"unencrypted connection through Tor to port %1. Sending unencrypted "
"information over the Tor network is dangerous and not recommended."
msgstr ""
+"Κάποια εφαρμογή του υπολογιστή σας ίσως προσπάθησε να συνδεθεί χωρίς "
+"κρυπτογράφηση μέσω του Tor στην θύρα %1. Η αποστολή μη κρυπτογραφημένων "
+"πληροφοριών μέσω του δικτύου Tor είναι επικίνδυνη και δεν συνιστάται."
msgctxt "StatusEventWidget"
msgid "Potentially Dangerous Connection!"
-msgstr ""
+msgstr "Πιθανά Επικίνδυνη Σύνδεση!"
msgctxt "StatusEventWidget"
msgid ""
@@ -3416,10 +3446,15 @@ msgid ""
"ensure you configure your applications to use only SOCKS4a or SOCKS5 with "
"remote hostname resolution."
msgstr ""
+"Κάποια από τις εφαρμογές σας πραγματοποίησε σύνδεση μέσω του Tor στον/στην "
+"\"%1\" χρησιμοποιώντας ένα πρωτόκολο που μπορεί να διοχετεύει πληροφορίες "
+"σχετικές με τον προορισμό της. Βεβαιωθείτε ότι έχετε ρυθμίσει τις εφαρμογές "
+"σας ώστε να χρησιμοποιούν μόνον SOCKS4a ή SOCKS5 για την ανάλυση των "
+"ονομάτων των απομακρυσμένων υπολογιστών."
msgctxt "StatusEventWidget"
msgid "Unknown SOCKS Protocol"
-msgstr ""
+msgstr "Άγνωστο Πρωτόκολο SOCKS"
msgctxt "StatusEventWidget"
msgid ""
@@ -3427,10 +3462,14 @@ msgid ""
" protocol that Tor does not understand. Please ensure you configure your "
"applications to use only SOCKS4a or SOCKS5 with remote hostname resolution."
msgstr ""
+"Κάποια από τις εφαρμογές σας πραγματοποίησε σύνδεση μέσω του Tor "
+"χρησιμοποιώντας πρωτόκολο που το Tor δεν καταλαβαίνει. Βεβαιωθείτε ότι έχετε"
+" ρυθμίσει τις εφαρμογές σας ώστε να χρησιμοποιούν μόνον SOCKS4a ή SOCKS5 για"
+" την ανάλυση των ονομάτων των απομακρυσμένων υπολογιστών."
msgctxt "StatusEventWidget"
msgid "Invalid Destination Hostname"
-msgstr ""
+msgstr "Το Όνομα του υπολογιστή Προορισμού δεν είναι έγκυρο."
msgctxt "StatusEventWidget"
msgid ""
1
0

02 Jan '12
commit a93cda18d8ac46b2189b3bf1f1b6173ab2b54ee9
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Jan 2 12:45:12 2012 +0000
Update translations for vidalia
---
el/vidalia_el.po | 122 ++++++++++++++++++++++++++++++++++-------------------
1 files changed, 78 insertions(+), 44 deletions(-)
diff --git a/el/vidalia_el.po b/el/vidalia_el.po
index 6ef3d43..f72491e 100755
--- a/el/vidalia_el.po
+++ b/el/vidalia_el.po
@@ -1,5 +1,6 @@
#
# Translators:
+# <fragos.george(a)hotmail.com>, 2012.
# runasand <runa.sandvik(a)gmail.com>, 2011.
# <smartmediagr(a)gmail.com>, 2011.
# Γιάννης <yannanth(a)gmail.com>, 2011.
@@ -8,8 +9,8 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-09-07 14:40+0000\n"
-"PO-Revision-Date: 2011-09-08 00:47+0000\n"
-"Last-Translator: smartmedia <smartmediagr(a)gmail.com>\n"
+"PO-Revision-Date: 2012-01-02 12:41+0000\n"
+"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -287,7 +288,7 @@ msgstr "Άκυρο"
msgctxt "BridgeDownloader"
msgid "Starting HTTPS bridge request..."
-msgstr ""
+msgstr "Εκκίνηση HTTPS αιτήματος γεφυρών..."
msgctxt "BridgeDownloader"
msgid "Connecting to %1:%2..."
@@ -295,23 +296,23 @@ msgstr "Σύνδεση με το %1:%2..."
msgctxt "BridgeDownloader"
msgid "Sending an HTTPS request for bridges..."
-msgstr ""
+msgstr "Αποστολή HTTPS αιτήματος για γέφυρες..."
msgctxt "BridgeDownloader"
msgid "Downloading a list of bridges..."
-msgstr ""
+msgstr "Λήψη λίστας γεφυρών..."
msgctxt "BridgeDownloaderProgressDialog"
msgid "Downloading Bridges"
-msgstr ""
+msgstr "Γίνεται λήψη γεφυρών"
msgctxt "BridgeDownloaderProgressDialog"
msgid "Unable to download bridges: %1"
-msgstr ""
+msgstr "Αδυναμία λήψης γεφυρών: %1"
msgctxt "BridgeDownloaderProgressDialog"
msgid "Retrying bridge request..."
-msgstr ""
+msgstr "Επανάληψη αιτήματος γεφυρών..."
msgctxt "BridgeUsageDialog"
msgid "Country"
@@ -319,19 +320,21 @@ msgstr "Χώρα"
msgctxt "BridgeUsageDialog"
msgid "# Clients"
-msgstr ""
+msgstr "# Πελάτες"
msgctxt "BridgeUsageDialog"
msgid "Clients from the following countries have used your relay since %1"
msgstr ""
+"Πελάτες από τις ακόλουθες χώρες χρησιμοποιήσαν τον αναμεταδότη σας από την "
+"%1"
msgctxt "BridgeUsageDialog"
msgid "Bridge Usage Summary"
-msgstr ""
+msgstr "Σύνοψη Χρήσης της Γέφυρας"
msgctxt "BridgeUsageDialog"
msgid "Client Summary"
-msgstr ""
+msgstr "Σύνοψη Πελάτου"
msgctxt "Circuit"
msgid "New"
@@ -450,6 +453,8 @@ msgid ""
"Vidalia has connected to a running Tor process that requires a password. "
"Please enter your control password:"
msgstr ""
+"Το Vidalia συνδέθηκε σε μια ενεργή διαδικασία Tor η οποία απαιτεί κωδικό. "
+"Εισάγετε τον κωδικό σας ελέγχου:"
msgctxt "ControlSocket"
msgid "Control socket is not connected."
@@ -1389,11 +1394,11 @@ msgstr "%1 GB"
msgctxt "GraphFrame"
msgid "Recv:"
-msgstr ""
+msgstr "Παραλήθφηκαν:"
msgctxt "GraphFrame"
msgid "Sent:"
-msgstr ""
+msgstr "Απεστάλησαν:"
msgctxt "HelpBrowser"
msgid "Supplied XML file is not a valid Contents document."
@@ -1521,7 +1526,7 @@ msgstr "Βρέθηκαν Έγγραφα"
msgctxt "HelpBrowser"
msgid "Error Loading Help Contents:"
-msgstr ""
+msgstr "Σφάλμα κατά την φόρτωση των περιεχομένων της Βοήθειας:"
msgctxt "HelpTextBrowser"
msgid "Opening External Link"
@@ -1556,7 +1561,7 @@ msgstr ""
msgctxt "HelpTextBrowser"
msgid "Error opening help file:"
-msgstr ""
+msgstr "Σφάλμα κατά το άνοιγμα του αρχείου βοηθείας:"
msgctxt "LicenseDialog"
msgid "License Information"
@@ -2045,21 +2050,24 @@ msgid ""
"The currently installed version of Tor is out of date or no longer "
"recommended."
msgstr ""
+"Η εγκατεστημένη έκδοση του Tor είναι ξεπερασμένη ή δεν συνιστάται πλέον."
msgctxt "MainWindow"
msgid ""
"Would you like to check if a newer package is available for installation?"
msgstr ""
+"Θέλετε να γίνει έλεγχος για νεότερα διαθέσιμα πακέτα προς εγκατάσταση;"
msgctxt "MainWindow"
msgid "Potentially Unsafe Connection"
-msgstr ""
+msgstr "Πιθανόν μη ασφαλής σύνδεση"
msgctxt "MainWindow"
msgid ""
"Tor has automatically closed your connection in order to protect your "
"anonymity."
msgstr ""
+"Το Tor έκλεισε αυτόματα την σύνδεσή σας ώστε να προστατευθεί η ανωνυμία σας."
msgctxt "MainWindow"
msgid "Update Failed"
@@ -2067,13 +2075,14 @@ msgstr "Η Ενημέρωση Απέτυχε"
msgctxt "MainWindow"
msgid "Your software is up to date"
-msgstr ""
+msgstr "Το λογισμικό σας είναι ενημερωμένο"
msgctxt "MainWindow"
msgid ""
"There are no new Tor software packages available for your computer at this "
"time."
msgstr ""
+"Δεν υπάρχουν αυτή τη στιγμή νεότερα πακέτα Tor για τον υπολογιστή σας."
msgctxt "MainWindow"
msgid "Installation Failed"
@@ -2085,7 +2094,7 @@ msgstr "Το Vidalia δεν μπόρεσε να εγκαταστήσει τις
msgctxt "MainWindow"
msgid "The following error occurred:"
-msgstr ""
+msgstr "Έγινε το ακόλουθο σφάλμα:"
msgctxt "MainWindow"
msgid ""
@@ -2096,13 +2105,15 @@ msgstr ""
msgctxt "MainWindow"
msgid "failed (%1)"
-msgstr ""
+msgstr "απέτυχε (%1)"
msgctxt "MainWindow"
msgid ""
"Your relay is shutting down.\n"
"Click 'Stop' again to stop your relay now."
msgstr ""
+"Ο αναμεταδότης σας πρόκειται να κλείσει.\n"
+"Πατήστε 'Stop' ξανά για να διακόψετε τον αναμεταδότη σας τώρα."
msgctxt "MainWindow"
msgid "Bootstrapping torrc from %1 to %2"
@@ -2114,6 +2125,8 @@ msgid ""
"\n"
"Would you like to shutdown gracefully and give clients time to find a new relay?"
msgstr ""
+"Αυτή τη στιγμή εκτελείτε έναν αναμεταδότη. Ο τερματισμός του αναμεταδότη σας θα διακόψει κάθε ανοικτή επικοινωνία από άλλα προγράμματα.\n"
+"Θέλετε η διακοπή να γίνει ομαλά ώστε να δοθεί χρόνος στα προγράμματα-πελάτες για να βρουν νέο αναμεταδότη;"
msgctxt "MainWindow"
msgid ""
@@ -2121,6 +2134,8 @@ msgid ""
"\n"
"Please check the message log for recent warning or error messages."
msgstr ""
+"Το Vidalia διαπίστωσε ότι το Tor τερμάτισε αναπάντεχα.\n"
+"Ελέγξτε τα μηνύματα καταγραφής για πρόσφατες προειδοποιήσεις και μηνύματα σφάλματος."
msgctxt "MainWindow"
msgid "(probably Telnet)"
@@ -2420,12 +2435,16 @@ msgid ""
"Messages that appear when something has \n"
"gone very wrong and Tor cannot proceed."
msgstr ""
+"Μηνύματα που εμφανίζονται όταν συμβαίνει κάτι\n"
+"πολύ σοβαρό και το Tor δεν μπορεί να προχωρήσει."
msgctxt "MessageLog"
msgid ""
"Messages that only appear when \n"
"something has gone wrong with Tor."
msgstr ""
+"Μηνύματα που εμφανίζονται μόνον όταν\n"
+"κάτι σοβαρό συμβαίνει με το Tor."
msgctxt "MessageLog"
msgid ""
@@ -2434,18 +2453,25 @@ msgid ""
"not considered errors, but you may \n"
"care about."
msgstr ""
+"Μηνύματα που εμφανίζονται σπάνια\n"
+"στην διάρκεια φυσιολογικών λειτουργιών του Tor και δεν\n"
+"θεωρούνται σφάλματα, αλλά που θα πρέπει να τα ελέγξετε."
msgctxt "MessageLog"
msgid ""
"Messages that appear frequently \n"
"during normal Tor operation."
msgstr ""
+"Μηνύματα που εμφανίζονται συχνά\n"
+"στη διάρκεια φυσιολογικών λειτουργιών του Tor."
msgctxt "MessageLog"
msgid ""
"Hyper-verbose messages primarily of \n"
"interest to Tor developers."
msgstr ""
+"Υπερφλύαρα μηνύματα που κυρίως\n"
+"αφορούν στους προγραμματιστές του Tor."
msgctxt "MessageLog"
msgid ""
@@ -2453,6 +2479,9 @@ msgid ""
"\n"
"%2."
msgstr ""
+"Αδυναμία εγγραφής του αρχείου %1\n"
+"\n"
+"%2."
msgctxt "NetViewer"
msgid "Tor Network Map"
@@ -2536,15 +2565,15 @@ msgstr "Ctrl+Z"
msgctxt "NetViewer"
msgid "Relay Not Found"
-msgstr ""
+msgstr "Δεν βρέθηκε αναμεταδότης"
msgctxt "NetViewer"
msgid "No details on the selected relay are available."
-msgstr ""
+msgstr "Δεν είναι διαθέσιμες οι λεπτομέρειες για τον επιλεγμένο αναμεταδότη."
msgctxt "NetViewer"
msgid "Unknown"
-msgstr ""
+msgstr "Άγνωστο"
msgctxt "NetViewer"
msgid "Full Screen"
@@ -2552,7 +2581,7 @@ msgstr "Μέγιστη Οθόνη"
msgctxt "NetViewer"
msgid "View the network map as a full screen window"
-msgstr ""
+msgstr "Εμφάνιση του δικτυακού χάρτη σε προβολή πλήρους οθόνης"
msgctxt "NetViewer"
msgid "Ctrl+F"
@@ -2674,25 +2703,28 @@ msgstr "Αντιγραφή επιλεγμένων συνδέσεων γέφυρ
msgctxt "NetworkPage"
msgid "Find Bridges Now"
-msgstr ""
+msgstr "Αναζήτηση Γεφυρών Τώρα"
msgctxt "NetworkPage"
msgid "<a href=\"bridges.finding\">How else can I find bridges?</a>"
-msgstr ""
+msgstr "<a href=\"bridges.finding\">Με ποιόν άλλο τρόπο μπορώ να βρω γέφυρες;</a>"
msgctxt "NetworkPage"
msgid "<a href=\"bridges.finding\">How can I find bridges?</a>"
-msgstr ""
+msgstr "<a href=\"bridges.finding\">Πώς μπορώ να βρω γέφυρες;</a>"
msgctxt "NetworkPage"
msgid ""
"No new bridges are currently available. You can either wait a while and try "
"again, or try another method of finding new bridges."
msgstr ""
+"Δεν υπάρχουν διαθέσιμες γέφυρες αυτή τη στιγμή. Μπορείτε είτε να περιμένετε "
+"για λίγο και να προσπαθήσετε εκ νέου, είτε να δοκιμάσετε διαφορετική μέθοδο "
+"αναζήτησης νέων γεφυρών."
msgctxt "NetworkPage"
msgid "Click Help to see other methods of finding new bridges."
-msgstr ""
+msgstr "Πατήστε Help για να δείτε άλλους τρόπους αναζήτησης νέων γεφυρών."
msgctxt "NetworkPage"
msgid "Address:"
@@ -2712,15 +2744,15 @@ msgstr ""
msgctxt "NetworkPage"
msgid "SOCKS 5"
-msgstr ""
+msgstr "SOCKS 5"
msgctxt "NetworkPage"
msgid "HTTP"
-msgstr ""
+msgstr "HTTP"
msgctxt "NetworkPage"
msgid "HTTP / HTTPS"
-msgstr ""
+msgstr "HTTP / HTTPS"
msgctxt "Policy"
msgid "accept"
@@ -2784,11 +2816,11 @@ msgstr "Αποσυνδεδεμένο"
msgctxt "RouterInfoDialog"
msgid "Unknown"
-msgstr ""
+msgstr "Άγνωστο"
msgctxt "RouterInfoDialog"
msgid "Relay Details"
-msgstr ""
+msgstr "Λεπτομέρειες αναμεταδότη"
msgctxt "RouterInfoDialog"
msgid "Summary"
@@ -2812,19 +2844,19 @@ msgstr "Διεύθυνση IP:"
msgctxt "RouterInfoDialog"
msgid "Platform:"
-msgstr ""
+msgstr "Πλατφόρμα:"
msgctxt "RouterInfoDialog"
msgid "Bandwidth:"
-msgstr ""
+msgstr "Εύρος ζώνης:"
msgctxt "RouterInfoDialog"
msgid "Uptime:"
-msgstr ""
+msgstr "Χρόνος λειτουργίας:"
msgctxt "RouterInfoDialog"
msgid "Contact:"
-msgstr ""
+msgstr "Επαφές:"
msgctxt "RouterInfoDialog"
msgid "Last Updated:"
@@ -2832,7 +2864,7 @@ msgstr "Τελευταία Ενημέρωση:"
msgctxt "RouterInfoDialog"
msgid "Descriptor"
-msgstr ""
+msgstr "Περιγραφή:"
msgctxt "RouterListItem"
msgid "Offline"
@@ -3123,11 +3155,13 @@ msgstr ""
msgctxt "ServerPage"
msgid "No Recent Usage"
-msgstr ""
+msgstr "Δεν υπάρχει πρόσφατη χρήση"
msgctxt "ServerPage"
msgid "No clients have used your relay recently."
msgstr ""
+"Δεν υπάρχουν προγράμματα-πελάτες που χρησιμοποίησαν πρόσφατα τον αναμεταδότη"
+" σας."
msgctxt "ServerPage"
msgid ""
@@ -3163,11 +3197,11 @@ msgstr ""
msgctxt "ServerPage"
msgid "<a href=\"#bridgeHelp\">What's this?</a>"
-msgstr ""
+msgstr "<a href=\"#bridgeHelp\">Τι είναι αυτό;</a>"
msgctxt "ServerPage"
msgid "Automatically distribute my bridge address"
-msgstr ""
+msgstr "Αυτόματη διανομή της διεύθυνσης του αναμεταδότη μου"
msgctxt "ServerPage"
msgid "Mirror the Relay Directory"
@@ -3275,19 +3309,19 @@ msgstr "Δημιουργήθηκε από το Tor"
msgctxt "StatusEventWidget"
msgid "Copy to Clipboard"
-msgstr ""
+msgstr "Αντιγραφή στο πρόχειρο"
msgctxt "StatusEventWidget"
msgid "The Tor Software is Running"
-msgstr ""
+msgstr "Το Λογισμικό Tor εκτελείται"
msgctxt "StatusEventWidget"
msgid "You are currently running version \"%1\" of the Tor software."
-msgstr ""
+msgstr "Αυτή τη στιγμή εκτελείτε την έκδοση \"%1\" του προγράμματος Tor."
msgctxt "StatusEventWidget"
msgid "The Tor Software is not Running"
-msgstr ""
+msgstr "Το πρόγραμμα Tor δεν εκτελείται"
msgctxt "StatusEventWidget"
msgid ""
1
0