tor-commits
Threads by month
- ----- 2025 -----
- 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
January 2012
- 14 participants
- 852 discussions

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

r25280: {website} add a new mirror, update the mirrors table. (in website/trunk: . include)
by Andrew Lewman 02 Jan '12
by Andrew Lewman 02 Jan '12
02 Jan '12
Author: phobos
Date: 2012-01-02 04:57:06 +0000 (Mon, 02 Jan 2012)
New Revision: 25280
Modified:
website/trunk/include/mirrors-table.wmi
website/trunk/update-mirrors.pl
Log:
add a new mirror, update the mirrors table.
Modified: website/trunk/include/mirrors-table.wmi
===================================================================
--- website/trunk/include/mirrors-table.wmi 2012-01-01 16:40:45 UTC (rev 25279)
+++ website/trunk/include/mirrors-table.wmi 2012-01-02 04:57:06 UTC (rev 25280)
@@ -137,36 +137,36 @@
<tr>
- <td>IR</td>
+ <td>DE</td>
- <td>Ninjas</td>
+ <td>CCC-Hanau</td>
<td>Up to date</td>
+ <td><a href="ftp://key-server.org/tor">ftp</a></td>
+ <td><a href="http://tor.key-server.org/dist/">http</a></td>
+ <td><a href="http://tor.key-server.org/">http</a></td>
+ <td><a href="https://tor.key-server.org/dist/">https</a></td>
+ <td><a href="https://tor.key-server.org/">https</a></td>
<td> - </td>
- <td><a href="http://onion.anonymo.us.org/dist/">http</a></td>
- <td><a href="http://onion.anonymo.us.org/">http</a></td>
<td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
</tr>
<tr>
- <td>DE</td>
+ <td>AT</td>
- <td>CCC-Hanau</td>
+ <td></td>
<td>Up to date</td>
- <td><a href="ftp://key-server.org/tor">ftp</a></td>
- <td><a href="http://tor.key-server.org/dist/">http</a></td>
- <td><a href="http://tor.key-server.org/">http</a></td>
- <td><a href="https://tor.key-server.org/dist/">https</a></td>
- <td><a href="https://tor.key-server.org/">https</a></td>
<td> - </td>
+ <td><a href="http://tor.mirror.reisenb.at/dist/">http</a></td>
+ <td><a href="http://tor.mirror.reisenb.at/">http</a></td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
@@ -205,6 +205,23 @@
<tr>
+ <td>AT</td>
+
+ <td>cyberarmy</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.cyberarmy.at/dist/">http</a></td>
+ <td><a href="http://tor.cyberarmy.at/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>US</td>
<td>searchprivate</td>
@@ -358,23 +375,6 @@
<tr>
- <td>US</td>
-
- <td>AskApache</td>
-
- <td>Up to date</td>
-
- <td> - </td>
- <td><a href="http://tor.askapache.com/dist/">http</a></td>
- <td><a href="http://tor.askapache.com/">http</a></td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
-</tr>
-
-<tr>
-
<td>FR</td>
<td>LazyTiger</td>
@@ -460,19 +460,19 @@
<tr>
- <td>IS</td>
+ <td>US</td>
- <td>crypto.is</td>
+ <td>AskApache</td>
- <td>Up to date</td>
+ <td>Out of date</td>
<td> - </td>
- <td><a href="https://torproject.crypto.is/dist/">http</a></td>
- <td><a href="https://torproject.crypto.is/">http</a></td>
- <td><a href="https://torproject.crypto.is/dist/">https</a></td>
- <td><a href="https://torproject.crypto.is/">https</a></td>
+ <td><a href="http://tor.askapache.com/dist/">http</a></td>
+ <td><a href="http://tor.askapache.com/">http</a></td>
<td> - </td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
@@ -562,6 +562,23 @@
<tr>
+ <td>IR</td>
+
+ <td>Ninjas</td>
+
+ <td>Unknown</td>
+
+ <td> - </td>
+ <td><a href="http://onion.anonymo.us.org/dist/">http</a></td>
+ <td><a href="http://onion.anonymo.us.org/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>AT</td>
<td>FoDT.IT</td>
@@ -579,34 +596,34 @@
<tr>
- <td>AT</td>
+ <td>NL</td>
- <td>cyberarmy</td>
+ <td></td>
- <td>Unknown</td>
+ <td>Out of date</td>
<td> - </td>
- <td><a href="http://tor.cyberarmy.at/dist/">http</a></td>
- <td><a href="http://tor.cyberarmy.at/">http</a></td>
<td> - </td>
<td> - </td>
+ <td><a href="https://www.coevoet.nl/tor/dist/">https</a></td>
<td> - </td>
<td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>NL</td>
+ <td>IS</td>
- <td></td>
+ <td>crypto.is</td>
- <td>Out of date</td>
+ <td>Unknown</td>
<td> - </td>
+ <td><a href="https://torproject.crypto.is/dist/">http</a></td>
+ <td><a href="https://torproject.crypto.is/">http</a></td>
+ <td><a href="https://torproject.crypto.is/dist/">https</a></td>
+ <td><a href="https://torproject.crypto.is/">https</a></td>
<td> - </td>
<td> - </td>
- <td><a href="https://www.coevoet.nl/tor/dist/">https</a></td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
</tr>
Modified: website/trunk/update-mirrors.pl
===================================================================
--- website/trunk/update-mirrors.pl 2012-01-01 16:40:45 UTC (rev 25279)
+++ website/trunk/update-mirrors.pl 2012-01-02 04:57:06 UTC (rev 25280)
@@ -767,7 +767,25 @@
httpsDistMirror => "https://mirror.open-networx.org/torproject.org/dist/",
rsyncDistMirror => "",
hiddenServiceMirror => "",
- }
+ },
+ mirror047 => {
+ adminContact => "",
+ orgName => "",
+ isoCC => "AT",
+ subRegion => "",
+ region => "AT",
+ ipv4 => "True",
+ ipv6 => "False",
+ loadBalanced => "No",
+ httpWebsiteMirror => "http://tor.mirror.reisenb.at/",
+ httpsWebsiteMirror => "",
+ rsyncWebsiteMirror => "",
+ ftpWebsiteMirror => "",
+ httpDistMirror => "http://tor.mirror.reisenb.at/dist/",
+ httpsDistMirror => "",
+ rsyncDistMirror => "",
+ hiddenServiceMirror => "",
+ }
);
my $count = values %m;
1
0
commit d5ce86841d2cfed2d467e67260d40da8d15cad4e
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun Jan 1 22:15:04 2012 +0000
Update translations for tsum
---
el_GR/tsum.po | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/el_GR/tsum.po b/el_GR/tsum.po
index 345472b..7ad4150 100644
--- a/el_GR/tsum.po
+++ b/el_GR/tsum.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-11-05 17:16+0000\n"
-"PO-Revision-Date: 2012-01-01 21:43+0000\n"
+"PO-Revision-Date: 2012-01-01 22:13+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -81,6 +81,10 @@ msgid ""
"The green monitors represent relays in the Tor network, while the three keys"
" represent the layers of encryption between the user and each relay."
msgstr ""
+"Η παραπάνω εικόνα δείχνει έναν χρήστη να περιηγείται σε διάφορους ιστοχώρους"
+" μέσω Tor. Οι πράσινες οθόνες αναπαριστούν αναμεταδότες του δικτύου Tor, ενώ"
+" τα τρία κλειδιά αναπαριστούν τα επίπεδα κρυπτογράφησης μεταξύ του χρήστη "
+"και καθενός εκ των αναμεταδοτών."
#. type: Plain text
#: en/tsum.text:31
@@ -548,6 +552,8 @@ msgid ""
"### How to use a bridge\n"
"Once you have a set of bridges to use, open the Vidalia control panel, click on *Settings*, *Network* and tick the box that says *My ISP blocks connections to the Tor network*. Enter the bridges in the box below, hit *OK* and start Tor again."
msgstr ""
+"###Πώς να χρησιμοποιήσετε μια γέφυρα\n"
+"Μόλις αποκτήσετε την λίστα γεφυρών, ανοίξτε τον πίνακα ελέγχου του Vidalia, πατήστε *Settings*, *Network* και επιλέξτε την λειτουργία *My ISP blocks connections to the Tor network*. Εισάγετε τις γέφυρες που διαθέτετε στο πλαίσιο ακριβώς από κάτω, πατήστε *OK* και επανεκκινήστε το Tor."
#. type: Plain text
#: en/tsum.text:220
@@ -555,6 +561,8 @@ msgid ""
"### How to use an open proxy\n"
"If using a bridge does not work, try configuring Tor to use any HTTPS or SOCKS proxy to get access to the Tor network. This means even if Tor is blocked by your local network, open proxies can be safely used to connect to the Tor Network and on to the uncensored Internet."
msgstr ""
+"###Πώς να χρησιμοποιήσετε έναν ανοικτό πληρεξούσιο διακομηστή\n"
+"Αν η χρήση γεφυρών δεν αποδίδει, ρυθμίστε το Tor ώστε να χρησιμοποιεί οποιονδήποτε πληρεξούσιο διακομηστή HTTPS ή SOCKS ώστε να συνδεθεί στο δίκτυο Tor. Αυτό σημαίνει ότι, ακόμη και αν το τοπικό δίκτυό σας φράσσει το Tor, οι ανοικτοί πληρεξούσιοι διακομηστές μπορούν να χρησιμοποιηθούν με ασφάλεια για την σύνδεση στο δίκτυο Tor και στο μη λογοκριμένο Διαδίκτυο."
#. type: Plain text
#: en/tsum.text:223
@@ -607,6 +615,8 @@ msgid ""
"## Frequently Asked Questions\n"
"This section will answer some of the most common questions. If your question is not mentioned here, please send an email to help(a)rt.torproject.org."
msgstr ""
+"###Συχνές Ερωτήσεις\n"
+"Στην ενότητα αυτή θα απαντηθούν μερικές από τις πιο κοινές ερωτήσεις. Αν η ερώτησή σας δεν εμφανίζεται εδώ, παρακαλούμε ειδοποιήστε μας στην διεύθυνση help(a)rt.torproject.org."
#. type: Plain text
#: en/tsum.text:244
@@ -614,6 +624,8 @@ msgid ""
"### Unable to extract the archive\n"
"If you are using Windows and find that you cannot extract the archive, download and install [7-Zip](http://www.7-zip.org/)."
msgstr ""
+"###Αδυναμία αποσυμπίεσης του πακέτου\n"
+"Αν χρησιμοποιείτε Windows και διαπιστώσετε ότι δεν μπορείτε να αποσυμπιέσετε το αρχείο, κατεβάστε και εγκαταστείστε το [7-Zip](http://www.7-zip.org/)."
#. type: Plain text
#: en/tsum.text:248
@@ -622,6 +634,10 @@ msgid ""
"and use winzip to extract the archive. Before renaming the file, tell "
"Windows to show file extensions:"
msgstr ""
+"Αν δεν μπορείτε να κατεβάσετε το 7-Zip, προσπαθείστε να μετονομάσετε το "
+"αρχείο από .z σε .zip και χρησιμοποιήστε το winzip για την αποσυμίεσή του. "
+"Πριν μετονομάσετε το αρχείο, ρυθμίστε τα Windows ώστε να εμφανίζουν τις "
+"επεκτάσεις των αρχείων:"
#. type: Plain text
#: en/tsum.text:254
@@ -632,6 +648,11 @@ msgid ""
"3. Click on the *View* tab\n"
"4. Uncheck *Hide extensions for known file types* and click *OK*"
msgstr ""
+"###Windows XP\n"
+"1. Ανοίξτε *Ο υπολογιστής μου*\n"
+"2. Πατήστε *Εργαλεία* και από το μενούεπιλέξτε *Επιλογές φακέλων...*\n"
+"3. Πατήστε στο tab *Εμφάνιση*\n"
+"4. Αποεπιλέξτε το *Απόκρυψη των επεκτάσεων για γνωστούς τύπους αρχείων* και πατήστε *ΟΚ*"
#. type: Plain text
#: en/tsum.text:260
@@ -642,6 +663,11 @@ msgid ""
"3. Click on the *View* tab\n"
"4. Uncheck *Hide extensions for known file types* and click *OK*"
msgstr ""
+"###Windows Vista\n"
+"1. Ανοίξτε *Υπολογιστής*\n"
+"2. Πατήστε *Οργάνωση* και από το μενού επιλέξτε *Φάκελοι και επιλογές αναζήτησης*\n"
+"3. Πατήστε στο tab *Εμφάνιση*\n"
+"4. Αποεπιλέξτε την λειτουργία *Απόκρυψη της επέκτασης για γνωστούς τύπους αρχείων* και πατήστε *ΟΚ*"
#. type: Plain text
#: en/tsum.text:266
@@ -652,6 +678,11 @@ msgid ""
"3. Click on the *View* tab\n"
" 4. Uncheck *Hide extensions for known file types* and click *OK*"
msgstr ""
+"###Windows 7\n"
+"1. Ανοίξτε *Υπολογιστής*\n"
+"2. Πατήστε στο *Οργάνωση* και από το μενού επιλέξτε *Φάκελοι και επιλογές αναζήτησης*\n"
+"3. Πατήστε το tab *Εμφάνιση*\n"
+"4. Αποεπιλέξτε την λειτουργία *Απόκρυψη της επέκτασης για γνωστούς τύπους αρχείων* και πατήστε *ΟΚ*"
#. type: Plain text
#: en/tsum.text:273
@@ -659,6 +690,8 @@ msgid ""
"### What to do with split packages\n"
"When you request a split package, the parts may arrive out of order. You need to make sure you have received all the parts before you attempt to unpack them. Save all the parts into one directory on your computer, unzip them, and double-click the file that ends in \"..split.part01.exe\" to start the unpacking process."
msgstr ""
+"###Τι να κάνετε με τα τμηματικά αρχεία\n"
+"Όταν ζητήσετε τμηματικό πακέτο, τα κομμάτια του ίσως φθάσουν χωρίς συγκεκριμένη σειρά. Πρέπει να βεβαιωθείτε ότι παραλάβατε όλα τα κομμάτια πριν επιχειρήσετε να τα αποσυμπιέσετε. Αποθηκεύστε τα κομμάτια μέσα σε έναν κατάλογο του υπολογιστή σας, αποσυμπιέστε τα και διπλοπατήστε στο αρχείο που τελειώνει με \"..split.part01.exe\" για να ξεκινήσει η διαδικασία αποσυμπίεσης."
#. type: Plain text
#: en/tsum.text:277
@@ -677,6 +710,8 @@ msgid ""
"### Vidalia asks for a password\n"
"You should not have to enter a password when starting Vidalia. If you are prompted for one, you are likely affected by one of these problems:"
msgstr ""
+"###Το Vidalia ζητά κωδική λέξη\n"
+"Κανονικά, δεν χρειάζεται να δώσετε κάποιον κωδικό όταν ξεκινά το Vidalia. Αν, αντιθέτως, σας ζητείτε κωδικός τότε πιθανόν να έχετε κάποιο από τα εξής προβλήματα:"
#. type: Plain text
#: en/tsum.text:287
@@ -725,6 +760,8 @@ msgid ""
"### Flash does not work\n"
"For security reasons, Flash, Java, and other plugins are currently disabled for Tor. Plugins operate independently from Firefox and can perform activity on your computer that ruins your anonymity."
msgstr ""
+"###Το flash δεν λειτουργεί\n"
+"Για λόγους ασφαλείας τα Flash και Java είναι απενεργοποιημένα στο Tor. Τα πρόσθετα προγράμματα λειτουργούν ανεξάρτητα από το Firefox και μπορούν να εκτελούν λειτουργίες οι οποίες αχρηστεύουν την ανωνυμία σας."
#. type: Plain text
#: en/tsum.text:308
@@ -764,6 +801,8 @@ msgid ""
"### I want to use another browser\n"
"For security reasons, we recommend that you only browse the web through Tor using the Tor Browser Bundle. It is technically possible to use Tor with other browsers, but by doing so you open yourself up to potential attacks."
msgstr ""
+"###Επιθυμώ να χρησιμοποιώ άλλον φυλλομετρητή\n"
+"Για λόγους ασφαλείας προτείνουμε να περιηγείστε στον ιστό μέσω του Tor χρησιμοποιώντας το Πακέτο Φυλλομετρητή Tor. Τεχνικά, είναι εφικτή η χρήση του Tor με άλλους φυλλομετρητές, αλλά κάνοντας κάτι τέτοιο εκτίθεστε σε πιθανές επιθέσεις."
#. type: Plain text
#: en/tsum.text:325
@@ -771,5 +810,7 @@ msgid ""
"### Why Tor is slow\n"
"Tor can sometimes be a bit slower than your normal Internet connection. After all, your traffic is sent through many different countries, sometimes across oceans around the world!"
msgstr ""
+"###Γιατί το Tor είναι αργό\n"
+"Μερικές φορές το Tor θα είναι λίγο αργό σε σύγκριση με την ταχύτητα σύνδεσης στο Διαδίκτυο. Και αυτό διότι η κυκλοφορία σας διανέμεται μέσω διαφορετικών χωρών και, μερικές φορές, οι συνδέσεις είναι υπερπόντιες!"
1
0
commit cd5abb78f0804ec547255c13595d94cd0589144e
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun Jan 1 21:45:04 2012 +0000
Update translations for tsum
---
el_GR/tsum.po | 38 +++++++++++++++++++++++++++++++++++++-
1 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/el_GR/tsum.po b/el_GR/tsum.po
index 7c2f0da..345472b 100644
--- a/el_GR/tsum.po
+++ b/el_GR/tsum.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-11-05 17:16+0000\n"
-"PO-Revision-Date: 2012-01-01 20:42+0000\n"
+"PO-Revision-Date: 2012-01-01 21:43+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -138,6 +138,9 @@ msgid ""
" browse to the [Tor Project website](https://www.torproject.org/) and "
"download it there, or you can use GetTor, the email autoresponder."
msgstr ""
+"Με δυο τρόπους μπορείτε να λάβετε το Tor. Είτε με περιήγηση στοn [Ιστότοπο "
+"Tor Project](https://www.torproject.org/) και να το κατεβάσετε από εκεί, "
+"είτε με την χρήση του GetTor."
#. type: Plain text
#: en/tsum.text:53
@@ -145,6 +148,8 @@ msgid ""
"### How to get Tor via email\n"
"To receive the English Tor Browser Bundle for Windows, send an email to gettor(a)torproject.org with **windows** in the body of the message. You can leave the subject blank."
msgstr ""
+"###Πώς να λάβετε το Tor μέσω ηλεκτρινικής αλληλογραφίας\n"
+"Για να παραλάβετε το αγγλικό Πακέτο Φυλλομετρητή Tor για τα Windows, στείλτε email προς gettor(a)torproject.org με την λέξη **windows** στο σώμα του μηνύματος. Μπορείτε να αφήσετε κενό το Θέμα."
#. type: Plain text
#: en/tsum.text:57
@@ -177,6 +182,11 @@ msgid ""
"want, send an email to help(a)rt.torproject.org and we\n"
"will give you a list of website mirrors to use.\n"
msgstr ""
+"**Σημείωση**: Τα Πακέτα Φυλλομετρητή Tor για Linux και Mac OS X είναι μάλλον\n"
+"μεγάλα και θα μπορέσετε να λάβετε οποιοδήποτε από αυτά τα πακέτα μέσω\n"
+"Gmail, Hotmail ή Yahoo. Αν δεν μπορείτε να παραλάβετε το πακέτο που\n"
+"θέλετε, στείλτε μήνυμα στο help(a)rt.torproject.org και εμείς\n"
+"θα σας δώσουμε μια λίστα με ιστοσελίδες για να το παραλάβετε.\n"
#. type: Plain text
#: en/tsum.text:73
@@ -184,6 +194,8 @@ msgid ""
"#### How to get Tor as several small sized packages\n"
"It is possible to request the Tor Browser Bundle for Windows as several small sized packages, instead of one big package. This can be useful if you don't have a lot of bandwidth available, or if your email provider does not allow you to receive large attachments."
msgstr ""
+"###Πώς να λάβετε το Tor σε πολλά και μικρά πακέτα\n"
+"Μπορείτε να ζητήσετε το Πακέτο Φυλλομετρητή Tor για Windows σε πολλά πακέτα μικρού μεγέθους, αντί για ένα μεγάλο αρχείο. Αυτό είναι χρήσιμο σε περίπτωση που δεν διαθέτετε αρκετό εύρος ζώνης ή αν ο πάροχος διεύθυνσης ηλεκτρονικού ταχυδρομίου δεν επιτρέπει την λήψη μεγάλων συνειμμένων αρχείων."
#. type: Plain text
#: en/tsum.text:76
@@ -211,6 +223,9 @@ msgid ""
"*What to do with split packages* for information on how to unpack and re-"
"assemble the small sized packages."
msgstr ""
+"Είναι σημαντικό να γράψετε την λέξη *split* σε δική της, ξεχωριστή γραμμή. "
+"Για πληροφορίες για τον τρόπο αποσυμπίεσης και επανασύνδεσης των μικρών "
+"πακέτων δείτε το *What do do with split packages*."
#. type: Plain text
#: en/tsum.text:89
@@ -218,6 +233,8 @@ msgid ""
"### Tor for smartphones\n"
"You can get Tor on your Android device by installing the package named *Orbot*. For information about how to download and install Orbot, please see the [Tor Project website](https://www.torproject.org/docs/android.html.en)."
msgstr ""
+"###Το Tor για έξυπνα τηλέφωνα\n"
+"Μπορείτε να έχετε το Tor στην Android συσκευή σας εγκαθιστώντας το πακέτο με όνομα *Orbot*. Για πληροφορίες για τον τρόπο λήψης και εγκατάστασης του Orbot δείτε τoν [Ιστοχώρο του Tor Project](https://www.torproject.org/docs/android.html.en)."
#. type: Plain text
#: en/tsum.text:93
@@ -226,6 +243,9 @@ msgid ""
"Maemo/N900](https://www.torproject.org/docs/N900.html.en) and [Apple "
"iOS](http://sid77.slackware.it/iphone/)."
msgstr ""
+"Διαθέτουμε επίσης πειραματικά πακέτα για τα [Nokia "
+"Maemo/N900](https://www.torproject.org/docs/N900.html.en) και το [Apple "
+"iOS](http://sid77.slackware.it/iphone/)."
#. type: Plain text
#: en/tsum.text:97
@@ -233,6 +253,8 @@ msgid ""
"### How to verify that you have the right version\n"
"Before running the Tor Browser Bundle, you should make sure that you have the right version."
msgstr ""
+"###Πώς να διαπιστώσετε ότι έχετε την σωστή έκδοση\n"
+"Πριν εκτελέσετε το Πακέτο Φυλλομετρητή Tor πρέπει να σιγουρευτείτε ότι έχετε την σωστή έκδοση."
#. type: Plain text
#: en/tsum.text:102
@@ -361,6 +383,11 @@ msgid ""
"about where you downloaded the package from, how you verified the signature,"
" and the output from GnuPG in an email to help(a)rt.torproject.org."
msgstr ""
+"Το αποτέλεσμα πρέπει να λέει *\"Good signature\"*. Κακή υπογραφή σημαίνει "
+"ότι το αρχείο διαβληθεί. Αν διαπιστώσετε κακή υπογραφή, στείλτε πληροφορίες "
+"για την τοποθεσία παραλαβής του πακέτου, τον τρόπο με τον οποίο εξακριβώσατε"
+" την υπογραφή του και το αποτέλεσμα του GnuPG, στην διεύθυνση "
+"help(a)rt.torproject.org."
#. type: Plain text
#: en/tsum.text:147
@@ -385,6 +412,8 @@ msgid ""
"### How to use the Tor Browser Bundle\n"
"After downloading the Tor Browser Bundle and extracting the package, you should have a directory with a few files in it. One of the files is an executable called \"Start Tor Browser\" (or \"start-tor-browser\", depending on your operating system)."
msgstr ""
+"###Πώς να χρησιμοποιήσετε το Πακέτο Φυλλομετρητή Tor\n"
+"Μετά την λήψη του Πακέτου Φυλλομετρητή Tor και την αποσυμπίεση του αρχείου θα δημιουργηθεί ένας κατάλογος με μερικά αρχεία. Ένα από αρχεία είναι εκτελέσιμο με όνομα \"Start Tor Browser\" (ή \"start-tor-browser\", ανάλογα με το λειτουργικό σας σύστημα)."
#. type: Plain text
#: en/tsum.text:160
@@ -418,6 +447,8 @@ msgid ""
"### What to do when Tor does not connect\n"
"Some users will notice that Vidalia gets stuck when trying to connect to the Tor network. If this happens, make sure that you are connected to the Internet. If you need to connect to a proxy server, see *How to use an open proxy* below."
msgstr ""
+"###Τι να κάνετε αν το Tor δεν συνδέεται\n"
+"Μερικοί χρήστες θα παρατηρήσουν ότι το Vidalia κολλάει στην προσπάθειά του να συνδεθεί με τον δίκτυο Tor. Αν συμβεί κάτι τέτοιο, βεβαιωθείτε ότι είστε συνδεδεμένοι στο Διαδίκτυο. Αν πρέπει να συνδεθείτε σε κάποιος πληρεξούσιο διακομηστή, δείτε την ενότητα *Πώς να χρησιμοποιήσετε έναν ανοικτό πληρεξούσιο διακομηστή*, πιο κάτω."
#. type: Plain text
#: en/tsum.text:174
@@ -486,6 +517,9 @@ msgid ""
"If you need help with figuring out why Tor can't connect, send an email to "
"help(a)rt.torproject.org and include the relevant parts from the log file."
msgstr ""
+"Αν χρειαστείτε βοήθεια όταν το Tor δεν μπορεί να συνδεθεί, στείλτε "
+"ηλεκτρονικό μήνυμα στην διεύθυνση help(a)rt.torproject.org και προσθέστε τα "
+"σχετικά τμήματα από το αρχείο καταγραφής."
#. type: Plain text
#: en/tsum.text:203
@@ -493,6 +527,8 @@ msgid ""
"### How to find a bridge\n"
"To use a bridge, you will first have to locate one; you can either browse to [bridges.torproject.org](https://bridges.torproject.org/), or you can send an email to bridges(a)torproject.org. If you do send an email, please make sure that you write **get bridges** in the body of the email. Without this, you will not get a reply. Note that you need to send this email from either a gmail.com or a yahoo.com address."
msgstr ""
+"###Πώς να βρείτε μια γέφυρα\n"
+"Για να χρησιμοποιήσετε μια γέφυρα, πρέπει πρώτα να την βρείτε· μπορείτε είτε να επισκεφθείτε την σελίδα [bridges.torproject.org](https://bridges.torproject.org/), είτε να στείλετε ένα ηλεκτρονικό μήνυμα στην διεύθυνση bridges(a)torproject.org. Αν στείλετε email βεβαιωθείτε ότι στο σώμα του μηνύματος γράψατε **get bridges**. Χωρίς αυτή τη φράση δεν θα λάβετε απάντηση. Σημειώστε ότι το μήνυμα αυτό πρέπει να το στείλετε είτε από λογαριασμό Gmail, είτε από λογαριασμό Yahoo."
#. type: Plain text
#: en/tsum.text:208
1
0
commit bfd59435fbd6bbec8eb2fe834f06edfa0a3f4a0f
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun Jan 1 20:45:03 2012 +0000
Update translations for tsum
---
el_GR/tsum.po | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/el_GR/tsum.po b/el_GR/tsum.po
index ba675a2..7c2f0da 100644
--- a/el_GR/tsum.po
+++ b/el_GR/tsum.po
@@ -3,13 +3,13 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# <fragos.george(a)hotmail.com>, 2011.
+# <fragos.george(a)hotmail.com>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-11-05 17:16+0000\n"
-"PO-Revision-Date: 2011-12-29 20:56+0000\n"
+"PO-Revision-Date: 2012-01-01 20:42+0000\n"
"Last-Translator: anvo <fragos.george(a)hotmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -103,6 +103,10 @@ msgid ""
"to a website with a username and password, make sure that you are using "
"HTTPS (e.g. **https**://torproject.org/, not **http**://torproject.org/)."
msgstr ""
+"Αν μεταδίδεται ευαίσθητες πληροφορίες, για παράδειγμα όταν συνδέεστε σε έναν"
+" ιστότοπο με χρήση ονόματος χρήστη και κωδικού, βεβαιωθείτε ότι "
+"χρησιμοποιείτε HTTPS (e.g. **https**://torproject.org/, not "
+"**http**://torproject.org/)."
#. type: Plain text
#: en/tsum.text:38
1
0