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

[translation/vidalia_alpha] Update translations for vidalia_alpha
by translation@torproject.org 14 Dec '13
by translation@torproject.org 14 Dec '13
14 Dec '13
commit 0844c96b47ad428bcbcfef94b98f3e70718731b6
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 14 00:45:23 2013 +0000
Update translations for vidalia_alpha
---
fr/vidalia_fr.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fr/vidalia_fr.po b/fr/vidalia_fr.po
index 76c5627..66aeb39 100644
--- a/fr/vidalia_fr.po
+++ b/fr/vidalia_fr.po
@@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: translations(a)vidalia-project.net\n"
"POT-Creation-Date: 2012-03-21 17:46+0000\n"
-"PO-Revision-Date: 2013-11-12 09:41+0000\n"
+"PO-Revision-Date: 2013-12-14 00:30+0000\n"
"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/torproject/language/fr/)\n"
"MIME-Version: 1.0\n"
1
0

[translation/vidalia_completed] Update translations for vidalia_completed
by translation@torproject.org 14 Dec '13
by translation@torproject.org 14 Dec '13
14 Dec '13
commit bc310e723ef8cc1933b10c144a8aab31f5a686aa
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 14 00:45:20 2013 +0000
Update translations for vidalia_completed
---
fr/vidalia_fr.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fr/vidalia_fr.po b/fr/vidalia_fr.po
index b3ff4ee..38c47ff 100644
--- a/fr/vidalia_fr.po
+++ b/fr/vidalia_fr.po
@@ -13,7 +13,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2012-03-21 17:52+0000\n"
-"PO-Revision-Date: 2013-11-12 09:41+0000\n"
+"PO-Revision-Date: 2013-12-14 00:30+0000\n"
"Last-Translator: Onizuka\n"
"Language-Team: French (http://www.transifex.com/projects/p/torproject/language/fr/)\n"
"MIME-Version: 1.0\n"
1
0

14 Dec '13
commit f40b2d9c50af21c73addc8b1c8923dbfdff49e1b
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 14 00:45:14 2013 +0000
Update translations for vidalia
---
fr/vidalia_fr.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fr/vidalia_fr.po b/fr/vidalia_fr.po
index b3ff4ee..38c47ff 100644
--- a/fr/vidalia_fr.po
+++ b/fr/vidalia_fr.po
@@ -13,7 +13,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2012-03-21 17:52+0000\n"
-"PO-Revision-Date: 2013-11-12 09:41+0000\n"
+"PO-Revision-Date: 2013-12-14 00:30+0000\n"
"Last-Translator: Onizuka\n"
"Language-Team: French (http://www.transifex.com/projects/p/torproject/language/fr/)\n"
"MIME-Version: 1.0\n"
1
0
Author: mttp
Date: 2013-12-13 20:12:11 +0000 (Fri, 13 Dec 2013)
New Revision: 26478
Modified:
website/trunk/docs/en/faq.wml
Log:
6 new FAQ entires.
Modified: website/trunk/docs/en/faq.wml
===================================================================
--- website/trunk/docs/en/faq.wml 2013-12-13 13:34:03 UTC (rev 26477)
+++ website/trunk/docs/en/faq.wml 2013-12-13 20:12:11 UTC (rev 26478)
@@ -158,6 +158,20 @@
<li><a href="#ProvideAHiddenService">How do I provide a hidden service</a></li>
</ul>
+ <p>Development</p>
+ <ul>
+ <li><a href="#WhoIsResponsible">Who is responsible for Tor?</a></li>
+ <li><a href="#VersionNumbers">What do these weird version numbers
+ mean?</a></li>
+ <li><a href="#PrivateTorNetwork">How do I set up my own private
+ Tor network?</a></li>
+ <li><a href="#UseTorWithJava">How can I make my Java program use the
+ Tor network?</a></li>
+ <li><a href="#WhatIsLibevent">What is Libevent?</a></li>
+ <li><a href="#MyNewFeature">What do I need to do to get a new feature
+ into Tor?</a></li>
+ </ul>
+
<p>Anonymity and Security:</p>
<ul>
<li><a href="#WhatProtectionsDoesTorProvide">What protections does Tor
@@ -544,7 +558,7 @@
<a id="Forum"></a>
<h3><a class="anchor" href="#Forum">Is there a Tor forum?</a></h3>
- <p>We have <a href="https://tor.stackexchange.com/">a StackExchange
+ <p>We have a <a href="https://tor.stackexchange.com/">StackExchange
page</a> that is currently in public beta.
</p>
@@ -2742,24 +2756,213 @@
<hr>
+ <a id="WhoIsResponsible"></a>
+ <h3><a class="anchor" href="#WhoIsResponsible">Who is responsible
+ for Tor?</a></h3>
+
+ <p>
+ <a href="http://www.freehaven.net/~arma/cv.html">Roger Dingledine</a> and
+ <a href="http://www.wangafu.net/~nickm/">Nick Mathewson</a> are the main
+ developers of Tor. You can read more at
+ <a href="https://www.torproject.org/about/corepeople">Tor's People
+ page</a>.
+ </p>
+
+ <hr>
+
+ <a id="VersionNumbers"></a>
+ <h3><a class="anchor" href="#VersionNumbers">What do these weird
+ version numbers mean?</a></h3>
+
+ <p>
+ Versions of Tor before 0.1.0 used a strange and hard-to-explain version scheme. Let's forget about those.
+ </p>
+ <p>
+ Starting with 0.1.0, versions all look like this:
+ MAJOR.MINOR.MICRO(.PATCHLEVEL)(-TAG). The stuff in parenthesis is
+ optional. MAJOR, MINOR, MICRO, and PATCHLEVEL are all numbers. Only one
+ release is ever made with any given set of these version numbers. The
+ TAG lets you know how stable we think the release is: "alpha" is pretty
+ unstable; "rc" is a release candidate; and no tag at all means that we
+ have a final release. If the tag ends with "-cvs", you're looking at
+ a development snapshot that came after a given release.
+ </p>
+ <p>
+ So for example, we might start a development branch with (say)
+ 0.1.1.1-alpha. The patchlevel increments consistently as the status
+ tag changes, for example, as in: 0.1.1.2-alpha, 0.1.1.3-alpha,
+ 0.1.1.4-rc, 0.1.1.5-rc, etc. Eventually, we would release 0.1.1.6.
+ The next stable release would be 0.1.1.7.
+ </p>
+ <p>
+ Why do we do it like this? Because every release has a unique
+ version number, it is easy for tools like package manager to tell
+ which release is newer than another. The tag makes it easy for users
+ to tell how stable the release is likely to be.
+ </p>
+
+ <hr>
+
+ <a id="PrivateTorNetwork"></a>
+ <h3><a class="anchor" href="#PrivateTorNetwork">How do I set up my
+ own private Tor network?</a></h3>
+
+ <p>
+ If you want to experiment locally with your own network, or you're
+ cut off from the Internet and want to be able to mess with Tor still,
+ then you may want to set up your own separate Tor network.
+ </p>
+ <p>
+ To set up your own Tor network, you need to run your own authoritative
+ directory servers, and your clients and relays must be configured so
+ they know about your directory servers rather than the default public
+ ones.
+ </p>
+ <p>
+ Apart from the somewhat tedious method of manually configuring a couple
+ of directory authorities, relays and clients there are two separate
+ tools that could help. One is Chutney, the other is Shadow.
+ </p>
+ <p>
+ <a href="https://gitweb.torproject.org/chutney.git">Chutney</a> is a
+ tool for configuring, controlling and running tests on a
+ testing Tor network. It requires that you have Tor and Python (2.5 or
+ later) installed on your system. You can use Chutney to create a testing
+ network by generating Tor configuration files (torrc) and necssary keys
+ (for the directory authorities). Then you can let Chutney start your Tor
+ authorities, relays and clients and wait for the network to bootstrap.
+ Finally, you can have Chutney run tests on your network to see which
+ things work and which do not. Chutney is typically used for running a
+ testing network with about 10 instances of Tor. Every instance of Tor
+ binds to one or two ports on localhost (127.0.0.1) and all Tor
+ communication is done over the loopback interface. The <a
+ href="https://gitweb.torproject.org/chutney.git/blob/HEAD:/README">Chutney
+ README</a> is a good starting point for getting it up and running.
+ </p>
+ <p>
+ <a href="https://github.com/shadow/shadow">Shadow</a> is a network
+ simulator that can run Tor through its Scallion plug-in. Although
+ it's typically used for running load and performance tests on
+ substantially larger Tor test networks than what's feasible with
+ Chutney, it also makes for an excellent debugging tool since you can
+ run completely deterministic experiments. A large Shadow network is on
+ the size of thousands of instances of Tor, and you can run experiments
+ out of the box using one of Shadow's several included scallion experiment
+ configurations. Shadow can be run on any linux machine without root,
+ and can also run on EC2 using a pre-configured image. Also, Shadow
+ controls the time of the simulation with the effect that
+ time-consuming tests can be done more efficiently than in an
+ ordinary testing network. The <a
+ href="https://github.com/shadow/shadow/wiki">Shadow wiki</a> and
+ <a href="http://shadow.github.io/">Shadow website</a> are
+ good places to get started.
+ </p>
+
+ <hr>
+
+ <a id="UseTorInJava"></a>
+ <h3><a class="anchor" href="UseTorInJava">How can I make my Java
+ program use the Tor Network?</a></h3>
+
+ <p>
+ The newest versions of Java now have SOCKS4/5 support built in.
+ Unfortunately, the SOCKS interface is not very well documented and
+ may still leak your DNS lookups. The safest way to use Tor is to
+ interface the SOCKS protocol directly or go through an application-level
+ proxy that speaks SOCKS4a. For an example and libraries that implement
+ the SOCKS4a connection, go to Joe Foley's TorLib in the <a
+ href="http://web.mit.edu/foley/www/TinFoil/">TinFoil Project</a>.
+ </p>
+
+ <p>
+ A fully Java implementation of the Tor client is now available as <a
+ href="http://www.subgraph.com/orchid.html">Orchid</a>. We still consider
+ Orchid to be experimental, so use with care.
+ </p>
+
+ <hr>
+
+
+ <a id="WhatIsLibevent"></a>
+ <h3><a class="anchor" href="#WhatIsLibevent">What is Libevent?</a></h3>
+
+ <p>
+ When you want to deal with a bunch of net connections at once, you
+ have a few options:
+ </p>
+ <p>
+ One is multithreading: you have a separate micro-program inside the
+ main program for each net connection that reads and writes to the
+ connection as needed.This, performance-wise, sucks.
+ </p>
+ <p>
+ Another is asynchronous network programming: you have a single main
+ program that finds out when various net connections are ready to
+ read/write, and acts accordingly.
+ </p>
+ <p>
+ The problem is that the oldest ways to find out when net connections
+ are ready to read/write, suck. And the newest ways are finally fast,
+ but are not available on all platforms.
+ </p>
+ <p>
+ This is where Libevent comes in and wraps all these ways to find
+ out whether net connections are ready to read/write, so that Tor
+ (and other programs) can use the fastest one that your platform
+ supports, but can still work on older platforms (these methods are
+ all different depending on the platorm) So Libevent presents a
+ consistent and fast interface to select, poll, kqueue, epoll,
+ /dev/poll, and windows select.
+ </p>
+ <p>
+ However, On the the Win32 platform (by Microsoft) the only good
+ way to do fast IO on windows with hundreds of sockets is using
+ overlapped IO, which is grossly unlike every other BSD sockets
+ interface.
+ </p>
+ <p>Libevent has <a href="http://www.monkey.org/~provos/libevent/">its
+ own website</a>.
+ </p>
+ <hr>
+
+ <a id="MyNewFeature"></a>
+ <h3><a class="anchor" href="#MyNewFeature">What do I need to do to get
+ a new feature into Tor?</a></h3>
+
+ <p>
+ For a new feature to go into Tor, it needs to be designed (explain what
+ you think Tor should do), argued to be secure (explain why it's better
+ or at least as good as what Tor does now), specified (explained at the
+ byte level at approximately the level of detail in tor-spec.txt), and
+ implemented (done in software).
+ </p>
+
+ <p>
+ You probably shouldn't count on other people doing all of these steps
+ for you: people who are skilled enough to do this stuff generally
+ have their own favorite feature requests.
+ </p>
+
+ <hr>
+
<a id="WhatProtectionsDoesTorProvide"></a>
<h3><a class="anchor" href="#WhatProtectionsDoesTorProvide">What
protections does Tor provide?</a></h3>
<p>
- Internet communication is based on a store-and-forward model that
- can be understood in analogy to postal mail: Data is transmitted in
- blocks called IP datagrams or packets. Every packet includes a source
- IP address (of the sender) and a destination IP address (of the
- receiver), just as ordinary letters contain postal addresses of sender
- and receiver. The way from sender to receiver involves multiple hops of
- routers, where each router inspects the destination IP address and
- forwards the packet closer to its destination. Thus, every router
- between sender and receiver learns that the sender is communicating
- with the receiver. In particular, your local ISP is in the position to
- build a complete profile of your Internet usage. In addition, every
- server in the Internet that can see any of the packets can profile your
- behaviour.
+ Internet communication is based on a store-and-forward model that
+ can be understood in analogy to postal mail: Data is transmitted in
+ blocks called IP datagrams or packets. Every packet includes a source
+ IP address (of the sender) and a destination IP address (of the
+ receiver), just as ordinary letters contain postal addresses of sender
+ and receiver. The way from sender to receiver involves multiple hops of
+ routers, where each router inspects the destination IP address and
+ forwards the packet closer to its destination. Thus, every router
+ between sender and receiver learns that the sender is communicating
+ with the receiver. In particular, your local ISP is in the position to
+ build a complete profile of your Internet usage. In addition, every
+ server in the Internet that can see any of the packets can profile your
+ behaviour.
</p>
<p>
1
0

[translation/tails-greeter_completed] Update translations for tails-greeter_completed
by translation@torproject.org 13 Dec '13
by translation@torproject.org 13 Dec '13
13 Dec '13
commit 5d35738a9dcf46531b200c511bf6421649b0cb3d
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Dec 13 18:46:07 2013 +0000
Update translations for tails-greeter_completed
---
pt_BR/pt_BR.po | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pt_BR/pt_BR.po b/pt_BR/pt_BR.po
index 449e17f..850af57 100644
--- a/pt_BR/pt_BR.po
+++ b/pt_BR/pt_BR.po
@@ -15,7 +15,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-11-22 13:49+0100\n"
-"PO-Revision-Date: 2013-12-13 04:20+0000\n"
+"PO-Revision-Date: 2013-12-13 18:40+0000\n"
"Last-Translator: ebonsi\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/torproject/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -38,7 +38,7 @@ msgstr "Bem-vindo ao Tails"
#: ../glade/persistencewindow.glade.h:4
msgid "Use persistence?"
-msgstr "Usar a persistência?"
+msgstr "Usar persistência?"
#: ../glade/persistencewindow.glade.h:5
msgid "Yes"
1
0

[translation/tails-greeter] Update translations for tails-greeter
by translation@torproject.org 13 Dec '13
by translation@torproject.org 13 Dec '13
13 Dec '13
commit 3799b6673a521fa358d6c3c42ce3c703c4bff57f
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Dec 13 18:46:03 2013 +0000
Update translations for tails-greeter
---
pt_BR/pt_BR.po | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pt_BR/pt_BR.po b/pt_BR/pt_BR.po
index 449e17f..850af57 100644
--- a/pt_BR/pt_BR.po
+++ b/pt_BR/pt_BR.po
@@ -15,7 +15,7 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-11-22 13:49+0100\n"
-"PO-Revision-Date: 2013-12-13 04:20+0000\n"
+"PO-Revision-Date: 2013-12-13 18:40+0000\n"
"Last-Translator: ebonsi\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/torproject/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -38,7 +38,7 @@ msgstr "Bem-vindo ao Tails"
#: ../glade/persistencewindow.glade.h:4
msgid "Use persistence?"
-msgstr "Usar a persistência?"
+msgstr "Usar persistência?"
#: ../glade/persistencewindow.glade.h:5
msgid "Yes"
1
0

13 Dec '13
Author: phobos
Date: 2013-12-13 13:34:03 +0000 (Fri, 13 Dec 2013)
New Revision: 26477
Modified:
website/trunk/include/mirrors-table.wmi
website/trunk/include/tor-mirrors.csv
Log:
re-run mirror script
Modified: website/trunk/include/mirrors-table.wmi
===================================================================
--- website/trunk/include/mirrors-table.wmi 2013-12-12 22:46:22 UTC (rev 26476)
+++ website/trunk/include/mirrors-table.wmi 2013-12-13 13:34:03 UTC (rev 26477)
@@ -1,6 +1,125 @@
<tr>
+ <td>IS</td>
+
+ <td>torproject.is</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.is/dist/">http</a></td>
+ <td><a href="http://torproject.is/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DE</td>
+
+ <td>spline</td>
+
+ <td>Up to date</td>
+
+ <td><a href="ftp://ftp.spline.de/pub/tor">ftp</a></td>
+ <td><a href="http://tor.spline.de/dist/">http</a></td>
+ <td><a href="http://tor.spline.de/">http</a></td>
+ <td><a href="https://tor.spline.inf.fu-berlin.de/dist/">https</a></td>
+ <td><a href="https://tor.spline.inf.fu-berlin.de/">https</a></td>
+ <td><a href="rsync://ftp.spline.de/tor/dist">rsync</a></td>
+ <td><a href="rsync://ftp.spline.de/tor">rsync</a></td>
+</tr>
+
+<tr>
+
+ <td>RO</td>
+
+ <td>me0w.cc</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.me0w.cc/dist/">http</a></td>
+ <td><a href="http://tor.me0w.cc/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DE</td>
+
+ <td>borgmann.tv</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.borgmann.tv/dist/">http</a></td>
+ <td><a href="http://tor.borgmann.tv/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>HU</td>
+
+ <td>Unknown</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://mirror.tor.hu/dist/">http</a></td>
+ <td><a href="http://mirror.tor.hu/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>NL</td>
+
+ <td>CCC</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.ccc.de/dist/">http</a></td>
+ <td><a href="http://tor.ccc.de/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>AT</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.dont-know-me.at/dist/">http</a></td>
+ <td><a href="http://tor.dont-know-me.at/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>INT</td>
<td>CoralCDN</td>
@@ -18,6 +137,74 @@
<tr>
+ <td>AT</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.ph3x.at/dist/">http</a></td>
+ <td><a href="http://torproject.ph3x.at/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>IS</td>
+
+ <td>Frenn vun der Enn A.S.B.L.</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.lu/dist/">http</a></td>
+ <td><a href="http://torproject.lu/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>CH</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.pillo-srv.ch/dist/">http</a></td>
+ <td><a href="http://torproject.pillo-srv.ch/">http</a></td>
+ <td><a href="https://torproject.pillo-srv.ch/dist/">https</a></td>
+ <td><a href="https://torproject.pillo-srv.ch/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>BE</td>
+
+ <td>teambelgium</td>
+
+ <td>Up to date</td>
+
+ <td><a href="ftp://tor.teambelgium.net:2121/torproject/">ftp</a></td>
+ <td><a href="http://tor.teambelgium.net:8082/dist/">http</a></td>
+ <td><a href="http://tor.teambelgium.net:8082/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>DE</td>
<td>beme it</td>
@@ -35,34 +222,51 @@
<tr>
- <td>LT</td>
+ <td>MX</td>
<td>Tor Supporter</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.vesta.nu/dist/">http</a></td>
- <td><a href="http://tor.vesta.nu/">http</a></td>
+ <td><a href="http://fbnaia.homelinux.net/torproject/dist/">http</a></td>
+ <td><a href="http://fbnaia.homelinux.net/torproject/">http</a></td>
+ <td><a href="https://fbnaia.homelinux.net/torproject//dist/">https</a></td>
+ <td><a href="https://fbnaia.homelinux.net/torproject/">https</a></td>
<td> - </td>
<td> - </td>
+</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>hessmo</td>
+
+ <td>Up to date</td>
+
<td> - </td>
+ <td><a href="http://mirror.hessmo.com/tor/dist/">http</a></td>
+ <td><a href="http://mirror.hessmo.com/tor/">http</a></td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>AT</td>
+ <td>DE</td>
- <td>TechAsk.IT</td>
+ <td>Tor Supporter</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://www.unicorncloud.org/public/torproject.org/dist">http</a></td>
- <td><a href="http://www.unicorncloud.org/public/torproject.org/">http</a></td>
- <td><a href="https://www.unicorncloud.org/public/torproject.org/dist">https</a></td>
- <td><a href="https://www.unicorncloud.org/public/torproject.org/">https</a></td>
+ <td><a href="http://tor.dev-random.de/dist/">http</a></td>
+ <td><a href="http://tor.dev-random.de/">http</a></td>
+ <td><a href="https://tor.dev-random.de/dist/">https</a></td>
+ <td><a href="https://tor.dev-random.de/">https</a></td>
<td> - </td>
<td> - </td>
</tr>
@@ -71,6 +275,23 @@
<td>FR</td>
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.mirror.chekanov.net/dist/">http</a></td>
+ <td><a href="http://tor.mirror.chekanov.net/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>FR</td>
+
<td>BarkerJr</td>
<td>Up to date</td>
@@ -86,6 +307,57 @@
<tr>
+ <td>DE</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.linuxlounge.net/dist/">http</a></td>
+ <td><a href="http://tor.linuxlounge.net/">http</a></td>
+ <td><a href="https://tor.linuxlounge.net/dist/">https</a></td>
+ <td><a href="https://tor.linuxlounge.net/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>AT</td>
+
+ <td>cyberarmy</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td> - </td>
+ <td><a href="http://tor.cyberarmy.at/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DE</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.cryptowars.info/dist/">http</a></td>
+ <td><a href="http://torproject.cryptowars.info/">http</a></td>
+ <td><a href="https://torproject.cryptowars.info/dist/">https</a></td>
+ <td><a href="https://torproject.cryptowars.info/">https</a></td>
+ <td> - </td>
+ <td><a href="rsync://torproject.cryptowars.info/">rsync</a></td>
+</tr>
+
+<tr>
+
<td>IS</td>
<td>TheOnionRouter</td>
@@ -137,6 +409,40 @@
<tr>
+ <td>DE</td>
+
+ <td>chaos darmstadt</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://mirrors.chaos-darmstadt.de/tor-mirror/dist/">http</a></td>
+ <td><a href="http://mirrors.chaos-darmstadt.de/tor-mirror/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>RU</td>
+
+ <td>Soviet Anonymous</td>
+
+ <td>Up to date</td>
+
+ <td><a href="ftp://creep.im/mirrors/tor">ftp</a></td>
+ <td><a href="http://creep.im/tor/dist/">http</a></td>
+ <td><a href="http://creep.im/tor">http</a></td>
+ <td><a href="https://creep.im/tor/dist/">https</a></td>
+ <td><a href="https://creep.im/tor">https</a></td>
+ <td><a href="rsync://creep.im/tor-dist">rsync</a></td>
+ <td><a href="rsync://creep.im/tor">rsync</a></td>
+</tr>
+
+<tr>
+
<td>GB</td>
<td>torland</td>
@@ -171,6 +477,23 @@
<tr>
+ <td>CZ</td>
+
+ <td>Lightning-bolt.net</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.lightning-bolt.net/dist/">http</a></td>
+ <td><a href="http://torproject.lightning-bolt.net/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>LU</td>
<td>BarkerJr</td>
@@ -202,3 +525,326 @@
<td> - </td>
<td> - </td>
</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://mirror.nametoday.me/tor/dist/">http</a></td>
+ <td><a href="http://mirror.nametoday.me/tor/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DK</td>
+
+ <td>Zentrum der Gesundheit</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.idnr.ws/dist/">http</a></td>
+ <td><a href="http://tor.idnr.ws/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>NO</td>
+
+ <td>MultiNet AS</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.multinet.no/dist/">http</a></td>
+ <td><a href="http://tor.multinet.no/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>NL</td>
+
+ <td>BBLN</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://t02.nl/mirror/dist/">http</a></td>
+ <td><a href="http://t02.nl/mirror/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://mirror.nametoday.me/tor/dist/">http</a></td>
+ <td><a href="http://mirror.nametoday.me/tor/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>Xpdm</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproj.xpdm.us/dist/">http</a></td>
+ <td><a href="http://torproj.xpdm.us/">http</a></td>
+ <td><a href="https://torproj.xpdm.us/dist/">https</a></td>
+ <td><a href="https://torproj.xpdm.us/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DE</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tormirror.almnet.de/dist/">http</a></td>
+ <td><a href="http://tormirror.almnet.de/">http</a></td>
+ <td><a href="https://tormirror.almnet.de/dist/">https</a></td>
+ <td><a href="https://tormirror.almnet.de/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>FR</td>
+
+ <td>linsrv</td>
+
+ <td>Up to date</td>
+
+ <td><a href="ftp://ftp.linsrv.net/pub/torproject/">ftp</a></td>
+ <td><a href="http://mirrors.linsrv.net/torproject/dist/">http</a></td>
+ <td><a href="http://mirrors.linsrv.net/torproject/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td><a href="mirrors.linsrv.net::pub/torproject/dist">rsync</a></td>
+ <td><a href="mirrors.linsrv.net::pub/torproject">rsync</a></td>
+</tr>
+
+<tr>
+
+ <td>AT</td>
+
+ <td>TechAsk.IT</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://www.unicorncloud.org/public/torproject.org/dist">http</a></td>
+ <td><a href="http://www.unicorncloud.org/public/torproject.org/">http</a></td>
+ <td><a href="https://www.unicorncloud.org/public/torproject.org/dist">https</a></td>
+ <td><a href="https://www.unicorncloud.org/public/torproject.org/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>NL</td>
+
+ <td>Amorphis</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.amorphis.eu/dist/">http</a></td>
+ <td><a href="http://tor.amorphis.eu/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>AU</td>
+
+ <td>CoffsWiFi</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://torproject.coffswifi.net/dist">http</a></td>
+ <td><a href="http://torproject.coffswifi.net">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>DE</td>
+
+ <td>torservers</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://www.torservers.net/mirrors/torproject.org/dist/">http</a></td>
+ <td><a href="http://www.torservers.net/mirrors/torproject.org/">http</a></td>
+ <td><a href="https://www.torservers.net/mirrors/torproject.org/dist/">https</a></td>
+ <td><a href="https://www.torservers.net/mirrors/torproject.org/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>SE</td>
+
+ <td>homosu</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.homosu.net/dist/">http</a></td>
+ <td><a href="http://tor.homosu.net/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>IS</td>
+
+ <td>myRL.net</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.myrl.net/dist/">http</a></td>
+ <td><a href="http://tor.myrl.net/">http</a></td>
+ <td><a href="https://tor.myrl.net/dist/">https</a></td>
+ <td><a href="https://tor.myrl.net/">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>NL</td>
+
+ <td>DevRandom</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://devrandom.co/tor-mirror/dist">http</a></td>
+ <td><a href="http://devrandom.co/tor-mirror">http</a></td>
+ <td><a href="https://devrandom.co/tor-mirror/dist">https</a></td>
+ <td><a href="https://devrandom.co/tor-mirror">https</a></td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>ES</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.zilog.es/dist/">http</a></td>
+ <td><a href="http://tor.zilog.es/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<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>US</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://199.175.55.215/dist/">http</a></td>
+ <td><a href="http://199.175.55.215/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
+ <td>LT</td>
+
+ <td>Tor Supporter</td>
+
+ <td>Up to date</td>
+
+ <td> - </td>
+ <td><a href="http://tor.vesta.nu/dist/">http</a></td>
+ <td><a href="http://tor.vesta.nu/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
Modified: website/trunk/include/tor-mirrors.csv
===================================================================
--- website/trunk/include/tor-mirrors.csv 2013-12-12 22:46:22 UTC (rev 26476)
+++ website/trunk/include/tor-mirrors.csv 2013-12-13 13:34:03 UTC (rev 26477)
@@ -1,73 +1,73 @@
adminContact, orgName, isoCC, subRegion, region, ipv4, ipv6, loadBalanced, httpWebsiteMirror, httpsWebsiteMirror, rsyncWebsiteMirror, ftpWebsiteMirror, httpDistMirror, httpsDistMirror, rsyncDistMirror, hiddenServiceMirror, updateDate
-Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://mirror.nametoday.me/tor/, , , , http://mirror.nametoday.me/tor/dist/, , , , Sat Dec 7 13:59:38 2013
+Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://mirror.nametoday.me/tor/, , , , http://mirror.nametoday.me/tor/dist/, , , , Thu Dec 12 17:18:11 2013
Tor Fan, Tor Supporter, US, United States, US, True, True, No, http://tor.loritsu.com/, , , , http://tor.loritsu.com/dist/, , , ,
-info AT zentrum-der-gesundheit DOT de, Zentrum der Gesundheit, DK, Denmark, Europe, True, False, No, http://tor.idnr.ws/, , , , http://tor.idnr.ws/dist/, , , , Sat Dec 7 13:59:38 2013
-http://www.multinet.no, MultiNet AS, NO, Trondheim, Trondheim, True, True, No, http://tor.multinet.no/, , , , http://tor.multinet.no/dist/, , , , Sat Dec 7 13:59:38 2013
+info AT zentrum-der-gesundheit DOT de, Zentrum der Gesundheit, DK, Denmark, Europe, True, False, No, http://tor.idnr.ws/, , , , http://tor.idnr.ws/dist/, , , , Thu Dec 12 17:18:11 2013
+http://www.multinet.no, MultiNet AS, NO, Trondheim, Trondheim, True, True, No, http://tor.multinet.no/, , , , http://tor.multinet.no/dist/, , , , Thu Dec 12 17:18:11 2013
Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://tor.mirrors.whitedholdings.org/, https://tor.mirrors.whitedholdings.org/, rsync://mirrors.whitedholdings.org/tor, , http://tor.mirrors.whitedholdings.org/dist/, https://tor.mirrors.whitedholdings.org/dist/, rsync://tor.mirrors.whitedholdings.org/tor-dist, ,
-haskell at gmx.es, Tor Supporter, ES, Spain, Europe, True, False, No, http://tor.zilog.es/, , , , http://tor.zilog.es/dist/, , , , Sat Dec 7 13:59:38 2013
-webmaster AT bbln DOT nl, BBLN, NL, The Netherlands, Europe, True, True, No, http://t02.nl/mirror/, , , , http://t02.nl/mirror/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://199.175.55.215/, , , , http://199.175.55.215/dist/, , , , Sat Dec 7 13:59:38 2013
-margus.random at mail.ee, CyberSIDE, EE, Estonia, EE, True, False, No, http://cyberside.planet.ee/tor/, , , , http://cyberside.net.ee/tor/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, torproject.is, IS, Iceland, IS, True, False, No, http://torproject.is/, , , , http://torproject.is/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, spline, DE, Germany, DE, True, False, No, http://tor.spline.de/, https://tor.spline.inf.fu-berlin.de/, rsync://ftp.spline.de/tor, ftp://ftp.spline.de/pub/tor, http://tor.spline.de/dist/, https://tor.spline.inf.fu-berlin.de/dist/, rsync://ftp.spline.de/tor/dist, , Sat Dec 7 13:59:38 2013
-Tor Fan, me0w.cc, RO, Romania, RO, True, False, No, http://tor.me0w.cc/, , , , http://tor.me0w.cc/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, borgmann.tv, DE, Germany, DE, True, False, No, http://tor.borgmann.tv/, , , , http://tor.borgmann.tv/dist/, , , , Sat Dec 7 13:59:38 2013
-security AT hostoffice DOT hu, Unknown, HU, Hungary, Europe, True, False, No, http://mirror.tor.hu/, , , , http://mirror.tor.hu/dist/, , , , Sat Dec 7 13:59:38 2013
+haskell at gmx.es, Tor Supporter, ES, Spain, Europe, True, False, No, http://tor.zilog.es/, , , , http://tor.zilog.es/dist/, , , , Thu Dec 12 15:11:57 2013
+webmaster AT bbln DOT nl, BBLN, NL, The Netherlands, Europe, True, True, No, http://t02.nl/mirror/, , , , http://t02.nl/mirror/dist/, , , , Thu Dec 12 17:18:11 2013
+Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://199.175.55.215/, , , , http://199.175.55.215/dist/, , , , Wed Dec 11 05:52:42 2013
+margus.random at mail.ee, CyberSIDE, EE, Estonia, EE, True, False, No, http://cyberside.planet.ee/tor/, , , , http://cyberside.net.ee/tor/, , , , Thu Dec 12 17:18:11 2013
+Tor Fan, torproject.is, IS, Iceland, IS, True, False, No, http://torproject.is/, , , , http://torproject.is/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, spline, DE, Germany, DE, True, False, No, http://tor.spline.de/, https://tor.spline.inf.fu-berlin.de/, rsync://ftp.spline.de/tor, ftp://ftp.spline.de/pub/tor, http://tor.spline.de/dist/, https://tor.spline.inf.fu-berlin.de/dist/, rsync://ftp.spline.de/tor/dist, , Fri Dec 13 00:49:43 2013
+Tor Fan, me0w.cc, RO, Romania, RO, True, False, No, http://tor.me0w.cc/, , , , http://tor.me0w.cc/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, borgmann.tv, DE, Germany, DE, True, False, No, http://tor.borgmann.tv/, , , , http://tor.borgmann.tv/dist/, , , , Fri Dec 13 00:49:43 2013
+security AT hostoffice DOT hu, Unknown, HU, Hungary, Europe, True, False, No, http://mirror.tor.hu/, , , , http://mirror.tor.hu/dist/, , , , Fri Dec 13 00:49:43 2013
Tor Fan, Tor Supporter, TN, Tunisia, TN, True, False, No, http://torproject.antagonism.org/, https://torproject.antagonism.org/, , , , , , , Fri Jun 21 10:33:04 2013
-webmaster AT ccc DOT de, CCC, NL, The Netherlands, Europe, True, False, No, http://tor.ccc.de/, , , , http://tor.ccc.de/dist/, , , , Sat Dec 7 13:59:38 2013
+webmaster AT ccc DOT de, CCC, NL, The Netherlands, Europe, True, False, No, http://tor.ccc.de/, , , , http://tor.ccc.de/dist/, , , , Fri Dec 13 00:49:43 2013
Tor Fan, searchprivate, US, TX, US, True, False, No, http://tor.searchprivate.com/, , , , http://tor.searchprivate.com/dist/, , , , Sun Jul 29 23:49:26 2012
-Tor Fan, Tor Supporter, AT, Austria, AT, True, True, No, http://tor.dont-know-me.at/, , , , http://tor.dont-know-me.at/dist/, , , , Sat Dec 7 13:59:38 2013
+Tor Fan, Tor Supporter, AT, Austria, AT, True, True, No, http://tor.dont-know-me.at/, , , , http://tor.dont-know-me.at/dist/, , , , Fri Dec 13 00:49:43 2013
marz.michael at gmail.com, Tor Supporter, DE, Germany, DE, True, False, No, http://tor.taskserver.de/, , , , http://tor.taskserver.de/dist/, , , ,
Tor Fan, Tor Supporter, LU, Luxemborg, LU, True, False, No, http://torproject.adamas.ai/, , , , http://torproject.adamas.ai/dist/, , , ,
-mirror ntzk de, Netzkonstrukt Berlin, DE, Germany, Europe, True, False, No, http://mirror.ntzk.de/torproject.org/, , , , http://mirror.ntzk.de/torproject.org/dist/, , , , Sat Dec 7 13:59:38 2013
-coralcdn.org, CoralCDN, INT, International, INT, True, False, Yes, http://www.torproject.org.nyud.net/, , , , http://www.torproject.org.nyud.net/dist/, , , , Tue Dec 10 04:17:39 2013
-Tor Fan, Tor Supporter, US, United States, US, True, True, No, http://mirror.nametoday.me/tor/, , , , http://mirror.nametoday.me/tor/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, AT, Austria, AT, True, False, No, http://torproject.ph3x.at/, , , , http://torproject.ph3x.at/dist/, , , , Sat Dec 7 13:59:38 2013
-info /AT enn /DOT lu, Frenn vun der Enn A.S.B.L., IS, Iceland, Europe, True, False, No, http://torproject.lu/, , , , http://torproject.lu/dist/, , , http://btn6gqzqevlhoryd.onion, Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, CH, Switzerland, CH, True, False, No, http://torproject.pillo-srv.ch/, https://torproject.pillo-srv.ch/, , , http://torproject.pillo-srv.ch/dist/, https://torproject.pillo-srv.ch/dist/, , , Sat Dec 7 13:59:38 2013
-neutrino8 AT gmail DOT com, teambelgium, BE, Belgium, Europe, True, False, No, http://tor.teambelgium.net:8082/, , , ftp://tor.teambelgium.net:2121/torproject/, http://tor.teambelgium.net:8082/dist/, , , , Sat Dec 7 13:59:38 2013
-tormaster AT xpdm DOT us, Xpdm, US, United States, North America, True, False, No, http://torproj.xpdm.us/, https://torproj.xpdm.us/, , , http://torproj.xpdm.us/dist/, https://torproj.xpdm.us/dist/, , http://h3prhz46uktgm4tt.onion/, Sat Dec 7 13:59:38 2013
+mirror ntzk de, Netzkonstrukt Berlin, DE, Germany, Europe, True, False, No, http://mirror.ntzk.de/torproject.org/, , , , http://mirror.ntzk.de/torproject.org/dist/, , , , Fri Dec 13 00:49:43 2013
+coralcdn.org, CoralCDN, INT, International, INT, True, False, Yes, http://www.torproject.org.nyud.net/, , , , http://www.torproject.org.nyud.net/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, US, United States, US, True, True, No, http://mirror.nametoday.me/tor/, , , , http://mirror.nametoday.me/tor/dist/, , , , Thu Dec 12 17:18:11 2013
+Tor Fan, Tor Supporter, AT, Austria, AT, True, False, No, http://torproject.ph3x.at/, , , , http://torproject.ph3x.at/dist/, , , , Fri Dec 13 00:49:43 2013
+info /AT enn /DOT lu, Frenn vun der Enn A.S.B.L., IS, Iceland, Europe, True, False, No, http://torproject.lu/, , , , http://torproject.lu/dist/, , , http://btn6gqzqevlhoryd.onion, Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, CH, Switzerland, CH, True, False, No, http://torproject.pillo-srv.ch/, https://torproject.pillo-srv.ch/, , , http://torproject.pillo-srv.ch/dist/, https://torproject.pillo-srv.ch/dist/, , , Fri Dec 13 00:49:43 2013
+neutrino8 AT gmail DOT com, teambelgium, BE, Belgium, Europe, True, False, No, http://tor.teambelgium.net:8082/, , , ftp://tor.teambelgium.net:2121/torproject/, http://tor.teambelgium.net:8082/dist/, , , , Fri Dec 13 00:49:43 2013
+tormaster AT xpdm DOT us, Xpdm, US, United States, North America, True, False, No, http://torproj.xpdm.us/, https://torproj.xpdm.us/, , , http://torproj.xpdm.us/dist/, https://torproj.xpdm.us/dist/, , http://h3prhz46uktgm4tt.onion/, Thu Dec 12 17:18:11 2013
Tor Fan, Tor Supporter, UA, Ukraine, UA, True, False, No, http://torua.reactor-xg.kiev.ua/, , , , http://torua.reactor-xg.kiev.ua/dist/, , , ,
- mail AT benjamin-meier DOT info, beme it, DE, Germany, DE, True, False, No, http://tor.beme-it.de/, https://tor.beme-it.de/, rsync://tor.beme-it.de/tor, , http://tor.beme-it.de/dist/, https://tor.beme-it.de/dist/, rsync://tor.beme-it.de/tor/dist, , Tue Dec 10 04:17:39 2013
-wollomatic at posteo.eu, Tor Supporter, DE, Germany, Europe, True, True, No, http://tormirror.almnet.de/, https://tormirror.almnet.de/, , , http://tormirror.almnet.de/dist/, https://tormirror.almnet.de/dist/, , , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, LT, Lithuania, LT, True, False, No, http://tor.vesta.nu/, , , , http://tor.vesta.nu/dist/, , , , Tue Dec 10 04:17:39 2013
-Tor Fan, Tor Supporter, MX, Mexico, MX, True, False, No, http://fbnaia.homelinux.net/torproject/, https://fbnaia.homelinux.net/torproject/, , , http://fbnaia.homelinux.net/torproject/dist/, https://fbnaia.homelinux.net/torproject//dist/, , , Sat Dec 7 13:59:38 2013
+ mail AT benjamin-meier DOT info, beme it, DE, Germany, DE, True, False, No, http://tor.beme-it.de/, https://tor.beme-it.de/, rsync://tor.beme-it.de/tor, , http://tor.beme-it.de/dist/, https://tor.beme-it.de/dist/, rsync://tor.beme-it.de/tor/dist, , Fri Dec 13 00:49:43 2013
+wollomatic at posteo.eu, Tor Supporter, DE, Germany, Europe, True, True, No, http://tormirror.almnet.de/, https://tormirror.almnet.de/, , , http://tormirror.almnet.de/dist/, https://tormirror.almnet.de/dist/, , , Thu Dec 12 17:18:11 2013
+Tor Fan, Tor Supporter, LT, Lithuania, LT, True, False, No, http://tor.vesta.nu/, , , , http://tor.vesta.nu/dist/, , , , Wed Dec 11 05:52:42 2013
+Tor Fan, Tor Supporter, MX, Mexico, MX, True, False, No, http://fbnaia.homelinux.net/torproject/, https://fbnaia.homelinux.net/torproject/, , , http://fbnaia.homelinux.net/torproject/dist/, https://fbnaia.homelinux.net/torproject//dist/, , , Fri Dec 13 00:49:43 2013
Tor Fan, Tor Supporter, FR, France, FR, True, False, No, http://37.187.0.127/tormirror/, , , , http://37.187.0.127/tormirror/dist/, , , ,
Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://tor.minibofh.org/, , , , http://tor.minibofh.org/dist/, , , ,
Tor Fan, Tor Supporter, UK, United Kingdom, UK, True, False, No, http://tor.mage.me.uk/, , , , http://tor.mage.me.uk/dist/, , , ,
-webmaster AT askapache DOT com, AskApache, US, California, US, True, False, No, http://tor.askapache.com/, , , , http://tor.askapache.com/dist/, , , , Sat Dec 7 13:59:38 2013
+webmaster AT askapache DOT com, AskApache, US, California, US, True, False, No, http://tor.askapache.com/, , , , http://tor.askapache.com/dist/, , , , Thu Dec 12 05:09:13 2013
nsane2307 eml cc, tor-mirror.de, DE, Germany, Europe, True, False, No, http://tor-mirror.de/, https://tor-mirror.de/, , , http://tor-mirror.de/dist/, https://tor-mirror.de/dist/, , ,
-Tor Fan, hessmo, US, United States, US, True, False, No, http://mirror.hessmo.com/tor/, , , , http://mirror.hessmo.com/tor/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://tor.dev-random.de/, https://tor.dev-random.de/, , , http://tor.dev-random.de/dist/, https://tor.dev-random.de/dist/, , , Sat Dec 7 13:59:38 2013
+Tor Fan, hessmo, US, United States, US, True, False, No, http://mirror.hessmo.com/tor/, , , , http://mirror.hessmo.com/tor/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://tor.dev-random.de/, https://tor.dev-random.de/, , , http://tor.dev-random.de/dist/, https://tor.dev-random.de/dist/, , , Fri Dec 13 00:49:43 2013
Tor Fan, India Tor Fans, IN, India, IN, True, False, No, http://www.torproject.org.in/, , , , http://www.torproject.org.in/dist/, , , , Mon Nov 25 18:31:18 2013
-mirror-admin(a)linsrv.net, linsrv, FR, France, Europe, True, False, No, http://mirrors.linsrv.net/torproject/, , mirrors.linsrv.net::pub/torproject, ftp://ftp.linsrv.net/pub/torproject/, http://mirrors.linsrv.net/torproject/dist/, , mirrors.linsrv.net::pub/torproject/dist, , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, FR, France, FR, True, False, No, http://tor.mirror.chekanov.net/, , , , http://tor.mirror.chekanov.net/dist/, , , , Sat Dec 7 13:59:38 2013
-http://sebastian.pfeifer.or.at/, TechAsk.IT, AT, Favoriten, Wien, True, True, No, http://www.unicorncloud.org/public/torproject.org/, https://www.unicorncloud.org/public/torproject.org/, , , http://www.unicorncloud.org/public/torproject.org/dist, https://www.unicorncloud.org/public/torproject.org/dist, , , Tue Dec 10 04:17:39 2013
-BarkerJr AT barkerjr DOT net, BarkerJr, FR, France, FR, True, False, No, http://www.oignon.net/, https://www.oignon.net/, , , http://www.oignon.net/dist/, https://www.oignon.net/dist/, , , Tue Dec 10 04:17:39 2013
-root AT amorphis DOT eu, Amorphis, NL, The Netherlands, Europe, True, False, No, http://tor.amorphis.eu/, , , , http://tor.amorphis.eu/dist/, , , , Sat Dec 7 13:59:38 2013
-hackthissite.org, HackThisSite.org, US, United States, US, True, True, No, http://tor.hackthissite.org/, https://tor.hackthissite.org/, , , http://mirror.hackthissite.org/tor, https://mirror.hackthissite.org/tor, , , Sat Dec 7 13:59:38 2013
+mirror-admin(a)linsrv.net, linsrv, FR, France, Europe, True, False, No, http://mirrors.linsrv.net/torproject/, , mirrors.linsrv.net::pub/torproject, ftp://ftp.linsrv.net/pub/torproject/, http://mirrors.linsrv.net/torproject/dist/, , mirrors.linsrv.net::pub/torproject/dist, , Thu Dec 12 17:18:11 2013
+Tor Fan, Tor Supporter, FR, France, FR, True, False, No, http://tor.mirror.chekanov.net/, , , , http://tor.mirror.chekanov.net/dist/, , , , Fri Dec 13 00:49:43 2013
+http://sebastian.pfeifer.or.at/, TechAsk.IT, AT, Favoriten, Wien, True, True, No, http://www.unicorncloud.org/public/torproject.org/, https://www.unicorncloud.org/public/torproject.org/, , , http://www.unicorncloud.org/public/torproject.org/dist, https://www.unicorncloud.org/public/torproject.org/dist, , , Thu Dec 12 17:18:11 2013
+BarkerJr AT barkerjr DOT net, BarkerJr, FR, France, FR, True, False, No, http://www.oignon.net/, https://www.oignon.net/, , , http://www.oignon.net/dist/, https://www.oignon.net/dist/, , , Fri Dec 13 00:49:43 2013
+root AT amorphis DOT eu, Amorphis, NL, The Netherlands, Europe, True, False, No, http://tor.amorphis.eu/, , , , http://tor.amorphis.eu/dist/, , , , Thu Dec 12 17:18:11 2013
+hackthissite.org, HackThisSite.org, US, United States, US, True, True, No, http://tor.hackthissite.org/, https://tor.hackthissite.org/, , , http://mirror.hackthissite.org/tor, https://mirror.hackthissite.org/tor, , , Thu Dec 12 17:18:11 2013
citizen428 AT gmail DOT com, [[:bbs:]], DE, Germany, Europe, True, False, No, http://tor.blingblingsquad.net/, https://tor.blingblingsquad.net/, , , http://tor.blingblingsquad.net/dist/, https://tor.blingblingsquad.net/dist/, , ,
-Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://tor.linuxlounge.net/, https://tor.linuxlounge.net/, , , http://tor.linuxlounge.net/dist/, https://tor.linuxlounge.net/dist/, , , Sat Dec 7 13:59:38 2013
+Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://tor.linuxlounge.net/, https://tor.linuxlounge.net/, , , http://tor.linuxlounge.net/dist/, https://tor.linuxlounge.net/dist/, , , Fri Dec 13 00:49:43 2013
Tor Fan, Tor Supporter, US, United States, US, True, False, No, , , , , http://www.netgull.com/torproject/, , , ,
-paul at coffswifi.net, CoffsWiFi, AU, Australia and New Zealand, APNIC, True, False, No, http://torproject.coffswifi.net, , , , http://torproject.coffswifi.net/dist, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, cyberarmy, AT, Austria, AT, True, False, No, http://tor.cyberarmy.at/, , , , , , , , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://torproject.cryptowars.info/, https://torproject.cryptowars.info/, rsync://torproject.cryptowars.info/, , http://torproject.cryptowars.info/dist/, https://torproject.cryptowars.info/dist/, , , Sat Dec 7 13:59:38 2013
-hostmaster AT zombiewerks DOT com, TheOnionRouter, IS, Iceland, Iceland, True, False, No, http://theonionrouter.com/, , , , http://theonionrouter.com/dist/, , , , Tue Dec 10 04:17:39 2013
-Tor Fan, crazyhaze.de, DE, Germany, DE, True, False, No, http://tor.crazyhaze.de/, https://tor.crazyhaze.de/, , , http://tor.crazyhaze.de/dist/, https://tor.crazyhaze.de/dist/, , , Tue Dec 10 04:17:39 2013
-Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://torproject.guilhem.org/, https://torproject.guilhem.org/, , , http://torproject.guilhem.org/dist/, https://torproject.guilhem.org/dist/, , , Tue Dec 10 04:17:39 2013
-Tor Fan, chaos darmstadt, DE, Germany, Europe, True, False, No, http://mirrors.chaos-darmstadt.de/tor-mirror/, , , , http://mirrors.chaos-darmstadt.de/tor-mirror/dist/, , , , Sat Dec 7 13:59:38 2013
-Tor Fan, Soviet Anonymous, RU, Russia, RU, True, False, No, http://creep.im/tor, https://creep.im/tor, rsync://creep.im/tor, ftp://creep.im/mirrors/tor, http://creep.im/tor/dist/, https://creep.im/tor/dist/, rsync://creep.im/tor-dist, , Sat Dec 7 13:59:38 2013
-Tor Fan, Tor Supporter, US, United States, US, True, False, No, , , , ftp://mirrors.go-parts.com/tor/, http://mirrors.go-parts.com/tor/dist/, , rsync://mirrors.go-parts.com/mirrors/tor/, , Sat Dec 7 13:59:38 2013
+paul at coffswifi.net, CoffsWiFi, AU, Australia and New Zealand, APNIC, True, False, No, http://torproject.coffswifi.net, , , , http://torproject.coffswifi.net/dist, , , , Thu Dec 12 17:18:11 2013
+Tor Fan, cyberarmy, AT, Austria, AT, True, False, No, http://tor.cyberarmy.at/, , , , , , , , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, DE, Germany, DE, True, False, No, http://torproject.cryptowars.info/, https://torproject.cryptowars.info/, rsync://torproject.cryptowars.info/, , http://torproject.cryptowars.info/dist/, https://torproject.cryptowars.info/dist/, , , Fri Dec 13 00:49:43 2013
+hostmaster AT zombiewerks DOT com, TheOnionRouter, IS, Iceland, Iceland, True, False, No, http://theonionrouter.com/, , , , http://theonionrouter.com/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, crazyhaze.de, DE, Germany, DE, True, False, No, http://tor.crazyhaze.de/, https://tor.crazyhaze.de/, , , http://tor.crazyhaze.de/dist/, https://tor.crazyhaze.de/dist/, , , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, US, United States, US, True, False, No, http://torproject.guilhem.org/, https://torproject.guilhem.org/, , , http://torproject.guilhem.org/dist/, https://torproject.guilhem.org/dist/, , , Fri Dec 13 00:49:43 2013
+Tor Fan, chaos darmstadt, DE, Germany, Europe, True, False, No, http://mirrors.chaos-darmstadt.de/tor-mirror/, , , , http://mirrors.chaos-darmstadt.de/tor-mirror/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, Soviet Anonymous, RU, Russia, RU, True, False, No, http://creep.im/tor, https://creep.im/tor, rsync://creep.im/tor, ftp://creep.im/mirrors/tor, http://creep.im/tor/dist/, https://creep.im/tor/dist/, rsync://creep.im/tor-dist, , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, US, United States, US, True, False, No, , , , ftp://mirrors.go-parts.com/tor/, http://mirrors.go-parts.com/tor/dist/, , rsync://mirrors.go-parts.com/mirrors/tor/, , Thu Dec 12 17:18:11 2013
Tor Fan, NW Linux, US, WA, US, True, False, No, http://torproject.nwlinux.us/, , rsync://nwlinux.us/tor-web, , http://torproject.nwlinux.us/dist/, , rsync://nwlinux.us/tor-dist, ,
-Tor Fan, torservers, DE, Germany, DE, True, False, No, http://www.torservers.net/mirrors/torproject.org/, https://www.torservers.net/mirrors/torproject.org/, , , http://www.torservers.net/mirrors/torproject.org/dist/, https://www.torservers.net/mirrors/torproject.org/dist/, , http://hbpvnydyyjbmhx6b.onion/mirrors/torproject.org/, Sat Dec 7 13:59:38 2013
+Tor Fan, torservers, DE, Germany, DE, True, False, No, http://www.torservers.net/mirrors/torproject.org/, https://www.torservers.net/mirrors/torproject.org/, , , http://www.torservers.net/mirrors/torproject.org/dist/, https://www.torservers.net/mirrors/torproject.org/dist/, , http://hbpvnydyyjbmhx6b.onion/mirrors/torproject.org/, Thu Dec 12 17:18:11 2013
Tor Fan, Tor Supporter, NL, The Netherlands, NL, True, False, No, , , , , , https://www.coevoet.nl/tor/dist/, , ,
-Tor Fan, torland, GB, United Kingdom, GB, True, False, No, http://mirror.torland.me/torproject.org/, https://mirror.torland.me/torproject.org/, , , http://mirror.torland.me/torproject.org/dist/, https://mirror.torland.me/torproject.org/dist/, , , Tue Dec 10 04:17:39 2013
-Tor Fan, Tor Supporter, FR, France, FR, True, False, No, http://torproject.c3l.lu/, , , , http://torproject.c3l.lu/dist/, , , , Tue Dec 10 04:17:39 2013
-Tor Fan, Lightning-bolt.net, CZ, Czech Republic, CZ, True, False, No, http://torproject.lightning-bolt.net/, , , , http://torproject.lightning-bolt.net/dist/, , , , Sat Dec 7 13:59:38 2013
+Tor Fan, torland, GB, United Kingdom, GB, True, False, No, http://mirror.torland.me/torproject.org/, https://mirror.torland.me/torproject.org/, , , http://mirror.torland.me/torproject.org/dist/, https://mirror.torland.me/torproject.org/dist/, , , Fri Dec 13 00:49:43 2013
+Tor Fan, Tor Supporter, FR, France, FR, True, False, No, http://torproject.c3l.lu/, , , , http://torproject.c3l.lu/dist/, , , , Fri Dec 13 00:49:43 2013
+Tor Fan, Lightning-bolt.net, CZ, Czech Republic, CZ, True, False, No, http://torproject.lightning-bolt.net/, , , , http://torproject.lightning-bolt.net/dist/, , , , Fri Dec 13 00:49:43 2013
Tor Fan, LazyTiger, FR, France, FR, True, False, No, http://tor.taiga-san.net/, , , , http://tor.taiga-san.net/dist/, , , ,
Tor Fan, Tor Supporter, EE, Estonia, EE, True, False, No, http://tor.li/, https://tor.li/, , , http://tor.li/dist/, https://tor.li/dist/, , ,
-Tor Fan, homosu, SE, Sweden, SE, True, False, No, http://tor.homosu.net/, , , , http://tor.homosu.net/dist/, , , , Fri Dec 6 20:54:44 2013
-IceBear, myRL.net, IS, Iceland, IS, True, False, No, http://tor.myrl.net/, https://tor.myrl.net/, , , http://tor.myrl.net/dist/, https://tor.myrl.net/dist/, , , Sat Dec 7 13:59:38 2013
-barkerjr(a)gmail.com, BarkerJr, LU, Luxemborg, LU, TRUE, TRUE, No, http://www.tor.lu, https://www.tor.lu, , , http://www.tor.lu/dist/, https://www.tor.lu/dist/, , , Tue Dec 10 04:17:39 2013
-Tor Fan, DevRandom, NL, The Netherlands, NL, TRUE, FALSE, No, http://devrandom.co/tor-mirror, https://devrandom.co/tor-mirror, , , http://devrandom.co/tor-mirror/dist, https://devrandom.co/tor-mirror/dist, , , Sat Dec 7 13:59:38 2013
-kiro AT userzap DOT de, Userzap, DE, Germany, DE, TRUE, FALSE, No, http://torprojekt.userzap.de, https://torprojekt.userzap.de, , , http://torprojekt.userzap.de/dist/, https://torprojekt.userzap.de/dist/, , , Tue Dec 10 04:17:39 2013
+Tor Fan, homosu, SE, Sweden, SE, True, False, No, http://tor.homosu.net/, , , , http://tor.homosu.net/dist/, , , , Thu Dec 12 17:18:11 2013
+IceBear, myRL.net, IS, Iceland, IS, True, False, No, http://tor.myrl.net/, https://tor.myrl.net/, , , http://tor.myrl.net/dist/, https://tor.myrl.net/dist/, , , Thu Dec 12 17:18:11 2013
+barkerjr(a)gmail.com, BarkerJr, LU, Luxemborg, LU, TRUE, TRUE, No, http://www.tor.lu, https://www.tor.lu, , , http://www.tor.lu/dist/, https://www.tor.lu/dist/, , , Fri Dec 13 00:49:43 2013
+Tor Fan, DevRandom, NL, The Netherlands, NL, TRUE, FALSE, No, http://devrandom.co/tor-mirror, https://devrandom.co/tor-mirror, , , http://devrandom.co/tor-mirror/dist, https://devrandom.co/tor-mirror/dist, , , Thu Dec 12 17:18:11 2013
+kiro AT userzap DOT de, Userzap, DE, Germany, DE, TRUE, FALSE, No, http://torprojekt.userzap.de, https://torprojekt.userzap.de, , , http://torprojekt.userzap.de/dist/, https://torprojekt.userzap.de/dist/, , , Fri Dec 13 00:49:43 2013
1
0

[websocket/master] More closely match the style of the dummy programs.
by dcf@torproject.org 13 Dec '13
by dcf@torproject.org 13 Dec '13
13 Dec '13
commit bed953fa7d36e913259de52ec3e52ce29bc4d1a7
Author: David Fifield <david(a)bamsoftware.com>
Date: Thu Dec 12 22:20:55 2013 -0800
More closely match the style of the dummy programs.
---
README | 2 +-
websocket-client/websocket-client.go | 37 +++++++++++++++++++---------------
websocket-server/websocket-server.go | 16 ++++++++-------
3 files changed, 31 insertions(+), 24 deletions(-)
diff --git a/README b/README
index ea06122..f978662 100644
--- a/README
+++ b/README
@@ -21,5 +21,5 @@ Git master as of 15 August, 2013 works.
Add configuration like the following to the relay's torrc. You can
change the --port option; make sure that port is open in the firewall.
- ExtORPort 5555
+ ExtORPort 6669
ServerTransportPlugin websocket exec /usr/local/bin/websocket-server --port 9901
diff --git a/websocket-client/websocket-client.go b/websocket-client/websocket-client.go
index 547d217..09181db 100644
--- a/websocket-client/websocket-client.go
+++ b/websocket-client/websocket-client.go
@@ -1,8 +1,9 @@
// Tor websocket client transport plugin.
//
-// Usage:
-// ClientTransportPlugin websocket exec ./websocket-client
-
+// Usage in torrc:
+// UseBridges 1
+// Bridge websocket X.X.X.X:YYYY
+// ClientTransportPlugin websocket exec ./websocket-client
package main
import (
@@ -15,6 +16,7 @@ import (
"os"
"os/signal"
"sync"
+ "syscall"
"time"
)
@@ -145,6 +147,7 @@ func handleConnection(conn *pt.SocksConn) error {
}
proxy(conn.Conn.(*net.TCPConn), ws)
+
return nil
}
@@ -223,32 +226,34 @@ func main() {
pt.CmethodsDone()
var numHandlers int = 0
+ var sig os.Signal
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
- signalChan := make(chan os.Signal, 1)
- signal.Notify(signalChan, os.Interrupt)
- var sigint bool = false
- for !sigint {
+ // wait for first signal
+ sig = nil
+ for sig == nil {
select {
case n := <-handlerChan:
numHandlers += n
- case <-signalChan:
- Log("SIGINT")
- sigint = true
+ case sig = <-sigChan:
}
}
-
for _, ln := range listeners {
ln.Close()
}
- sigint = false
- for numHandlers != 0 && !sigint {
+ if sig == syscall.SIGTERM {
+ return
+ }
+
+ // wait for second signal or no more handlers
+ sig = nil
+ for sig == nil && numHandlers != 0 {
select {
case n := <-handlerChan:
numHandlers += n
- case <-signalChan:
- Log("SIGINT")
- sigint = true
+ case sig = <-sigChan:
}
}
}
diff --git a/websocket-server/websocket-server.go b/websocket-server/websocket-server.go
index 806dd51..28bcf35 100644
--- a/websocket-server/websocket-server.go
+++ b/websocket-server/websocket-server.go
@@ -1,8 +1,8 @@
// Tor websocket server transport plugin.
//
-// Usage:
-// ServerTransportPlugin websocket exec ./websocket-server --port 9901
-
+// Usage in torrc:
+// ExtORPort 6669
+// ServerTransportPlugin websocket exec ./websocket-server --port 9901
package main
import (
@@ -141,7 +141,6 @@ func newWebSocketConn(ws *websocket.WebSocket) webSocketConn {
// Copy from WebSocket to socket and vice versa.
func proxy(local *net.TCPConn, conn *webSocketConn) {
var wg sync.WaitGroup
-
wg.Add(2)
go func() {
@@ -153,7 +152,6 @@ func proxy(local *net.TCPConn, conn *webSocketConn) {
conn.Close()
wg.Done()
}()
-
go func() {
_, err := io.Copy(local, conn)
if err != nil {
@@ -171,19 +169,21 @@ func webSocketHandler(ws *websocket.WebSocket) {
// Undo timeouts on HTTP request handling.
ws.Conn.SetDeadline(time.Time{})
conn := newWebSocketConn(ws)
+ defer conn.Close()
handlerChan <- 1
defer func() {
handlerChan <- -1
}()
- s, err := pt.DialOr(&ptInfo, ws.Conn.RemoteAddr(), ptMethodName)
+ or, err := pt.DialOr(&ptInfo, ws.Conn.RemoteAddr(), ptMethodName)
if err != nil {
log("Failed to connect to ORPort: " + err.Error())
return
}
+ defer or.Close()
- proxy(s, &conn)
+ proxy(or, &conn)
}
func startListener(addr *net.TCPAddr) (*net.TCPListener, error) {
@@ -258,6 +258,7 @@ func main() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+ // wait for first signal
sig = nil
for sig == nil {
select {
@@ -276,6 +277,7 @@ func main() {
return
}
+ // wait for second signal or no more handlers
sig = nil
for sig == nil && numHandlers != 0 {
select {
1
0
commit 9ca17c7ae0c24168d1aa09dd4ad01068914386f5
Author: David Fifield <david(a)bamsoftware.com>
Date: Thu Dec 12 21:04:07 2013 -0800
Delete the local pt library.
Use goptlib instead.
---
Makefile | 4 +-
pt/.gitignore | 2 -
pt/examples/dummy-client/dummy-client.go | 137 -------
pt/examples/dummy-server/dummy-server.go | 121 ------
pt/pt.go | 611 ------------------------------
pt/pt_test.go | 61 ---
pt/socks/socks.go | 107 ------
websocket-client/websocket-client.go | 66 ++--
websocket-server/websocket-server.go | 22 +-
9 files changed, 49 insertions(+), 1082 deletions(-)
diff --git a/Makefile b/Makefile
index 95aa243..28a94ad 100644
--- a/Makefile
+++ b/Makefile
@@ -10,10 +10,10 @@ GOBUILDFLAGS =
all: websocket-server/websocket-server
-websocket-server/websocket-server: websocket-server/*.go websocket/*.go pt/*.go
+websocket-server/websocket-server: websocket-server/*.go websocket/*.go
cd websocket-server && go build $(GOBUILDFLAGS)
-websocket-client/websocket-client: websocket-client/*.go websocket/*.go pt/*.go
+websocket-client/websocket-client: websocket-client/*.go websocket/*.go
cd websocket-client && go build $(GOBUILDFLAGS)
install: websocket-server/websocket-server
diff --git a/pt/.gitignore b/pt/.gitignore
deleted file mode 100644
index d4d5132..0000000
--- a/pt/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/examples/dummy-client/dummy-client
-/examples/dummy-server/dummy-server
diff --git a/pt/examples/dummy-client/dummy-client.go b/pt/examples/dummy-client/dummy-client.go
deleted file mode 100644
index 3cf7b45..0000000
--- a/pt/examples/dummy-client/dummy-client.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Usage (in torrc):
-// UseBridges 1
-// Bridge dummy X.X.X.X:YYYY
-// ClientTransportPlugin dummy exec dummy-client
-// Because this transport doesn't do anything to the traffic, you can use any
-// ordinary relay's ORPort in the Bridge line.
-
-package main
-
-import (
- "io"
- "net"
- "os"
- "os/signal"
- "sync"
- "syscall"
-)
-
-import "git.torproject.org/pluggable-transports/websocket.git/src/pt"
-import "git.torproject.org/pluggable-transports/websocket.git/src/pt/socks"
-
-var ptInfo pt.ClientInfo
-
-// When a connection handler starts, +1 is written to this channel; when it
-// ends, -1 is written.
-var handlerChan = make(chan int)
-
-func copyLoop(a, b net.Conn) {
- var wg sync.WaitGroup
- wg.Add(2)
-
- go func() {
- io.Copy(b, a)
- wg.Done()
- }()
- go func() {
- io.Copy(a, b)
- wg.Done()
- }()
-
- wg.Wait()
-}
-
-func handleConnection(local net.Conn) error {
- defer local.Close()
-
- handlerChan <- 1
- defer func() {
- handlerChan <- -1
- }()
-
- var remote net.Conn
- err := socks.AwaitSocks4aConnect(local.(*net.TCPConn), func(dest string) (*net.TCPAddr, error) {
- var err error
- // set remote in outer function environment
- remote, err = net.Dial("tcp", dest)
- if err != nil {
- return nil, err
- }
- return remote.RemoteAddr().(*net.TCPAddr), nil
- })
- if err != nil {
- return err
- }
- defer remote.Close()
- copyLoop(local, remote)
-
- return nil
-}
-
-func acceptLoop(ln net.Listener) error {
- for {
- conn, err := ln.Accept()
- if err != nil {
- return err
- }
- go handleConnection(conn)
- }
- return nil
-}
-
-func startListener(addr string) (net.Listener, error) {
- ln, err := net.Listen("tcp", addr)
- if err != nil {
- return nil, err
- }
- go acceptLoop(ln)
- return ln, nil
-}
-
-func main() {
- ptInfo = pt.ClientSetup([]string{"dummy"})
-
- listeners := make([]net.Listener, 0)
- for _, methodName := range ptInfo.MethodNames {
- ln, err := startListener("127.0.0.1:0")
- if err != nil {
- pt.CmethodError(methodName, err.Error())
- continue
- }
- pt.Cmethod(methodName, "socks4", ln.Addr())
- listeners = append(listeners, ln)
- }
- pt.CmethodsDone()
-
- var numHandlers int = 0
- var sig os.Signal
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
-
- // wait for first signal
- sig = nil
- for sig == nil {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
- for _, ln := range listeners {
- ln.Close()
- }
-
- if sig == syscall.SIGTERM {
- return
- }
-
- // wait for second signal or no more handlers
- sig = nil
- for sig == nil && numHandlers != 0 {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
-}
diff --git a/pt/examples/dummy-server/dummy-server.go b/pt/examples/dummy-server/dummy-server.go
deleted file mode 100644
index 26314d0..0000000
--- a/pt/examples/dummy-server/dummy-server.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Usage (in torrc):
-// BridgeRelay 1
-// ORPort 9001
-// ExtORPort 6669
-// ServerTransportPlugin dummy exec dummy-server
-
-package main
-
-import (
- "io"
- "net"
- "os"
- "os/signal"
- "sync"
- "syscall"
-)
-
-import "git.torproject.org/pluggable-transports/websocket.git/src/pt"
-
-var ptInfo pt.ServerInfo
-
-// When a connection handler starts, +1 is written to this channel; when it
-// ends, -1 is written.
-var handlerChan = make(chan int)
-
-func copyLoop(a, b net.Conn) {
- var wg sync.WaitGroup
- wg.Add(2)
-
- go func() {
- io.Copy(b, a)
- wg.Done()
- }()
- go func() {
- io.Copy(a, b)
- wg.Done()
- }()
-
- wg.Wait()
-}
-
-func handleConnection(conn net.Conn) {
- handlerChan <- 1
- defer func() {
- handlerChan <- -1
- }()
-
- or, err := pt.ConnectOr(&ptInfo, conn, "dummy")
- if err != nil {
- return
- }
- copyLoop(conn, or)
-}
-
-func acceptLoop(ln net.Listener) error {
- for {
- conn, err := ln.Accept()
- if err != nil {
- return err
- }
- go handleConnection(conn)
- }
- return nil
-}
-
-func startListener(addr *net.TCPAddr) (net.Listener, error) {
- ln, err := net.ListenTCP("tcp", addr)
- if err != nil {
- return nil, err
- }
- go acceptLoop(ln)
- return ln, nil
-}
-
-func main() {
- ptInfo = pt.ServerSetup([]string{"dummy"})
-
- listeners := make([]net.Listener, 0)
- for _, bindAddr := range ptInfo.BindAddrs {
- ln, err := startListener(bindAddr.Addr)
- if err != nil {
- pt.SmethodError(bindAddr.MethodName, err.Error())
- continue
- }
- pt.Smethod(bindAddr.MethodName, ln.Addr())
- listeners = append(listeners, ln)
- }
- pt.SmethodsDone()
-
- var numHandlers int = 0
- var sig os.Signal
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
-
- // wait for first signal
- sig = nil
- for sig == nil {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
- for _, ln := range listeners {
- ln.Close()
- }
-
- if sig == syscall.SIGTERM {
- return
- }
-
- // wait for second signal or no more handlers
- sig = nil
- for sig == nil && numHandlers != 0 {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
-}
diff --git a/pt/pt.go b/pt/pt.go
deleted file mode 100644
index 526f3b7..0000000
--- a/pt/pt.go
+++ /dev/null
@@ -1,611 +0,0 @@
-// Tor pluggable transports library.
-//
-// Sample client usage:
-//
-// import "git.torproject.org/pluggable-transports/websocket.git/src/pt"
-// var ptInfo pt.ClientInfo
-// ptInfo = pt.ClientSetup([]string{"foo"})
-// for _, methodName := range ptInfo.MethodNames {
-// ln, err := startSocksListener()
-// if err != nil {
-// pt.CmethodError(methodName, err.Error())
-// continue
-// }
-// pt.Cmethod(methodName, "socks4", ln.Addr())
-// }
-// pt.CmethodsDone()
-//
-// Sample server usage:
-//
-// import "git.torproject.org/pluggable-transports/websocket.git/src/pt"
-// var ptInfo pt.ServerInfo
-// ptInfo = pt.ServerSetup([]string{"foo", "bar"})
-// for _, bindAddr := range ptInfo.BindAddrs {
-// ln, err := startListener(bindAddr.Addr, bindAddr.MethodName)
-// if err != nil {
-// pt.SmethodError(bindAddr.MethodName, err.Error())
-// continue
-// }
-// pt.Smethod(bindAddr.MethodName, ln.Addr())
-// }
-// pt.SmethodsDone()
-// func handler(conn net.Conn, methodName string) {
-// or, err := pt.ConnectOr(&ptInfo, conn, methodName)
-// if err != nil {
-// return
-// }
-// // Do something with or and conn.
-// }
-
-package pt
-
-import (
- "bufio"
- "bytes"
- "crypto/hmac"
- "crypto/rand"
- "crypto/sha256"
- "crypto/subtle"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "net"
- "os"
- "strings"
- "time"
-)
-
-func getenv(key string) string {
- return os.Getenv(key)
-}
-
-// Abort with an ENV-ERROR if the environment variable isn't set.
-func getenvRequired(key string) string {
- value := os.Getenv(key)
- if value == "" {
- EnvError(fmt.Sprintf("no %s environment variable", key))
- }
- return value
-}
-
-// Escape a string so it contains no byte values over 127 and doesn't contain
-// any of the characters '\x00' or '\n'.
-func escape(s string) string {
- var buf bytes.Buffer
- for _, b := range []byte(s) {
- if b == '\n' {
- buf.WriteString("\\n")
- } else if b == '\\' {
- buf.WriteString("\\\\")
- } else if 0 < b && b < 128 {
- buf.WriteByte(b)
- } else {
- fmt.Fprintf(&buf, "\\x%02x", b)
- }
- }
- return buf.String()
-}
-
-// Print a pluggable transports protocol line to stdout. The line consists of an
-// unescaped keyword, followed by any number of escaped strings.
-func Line(keyword string, v ...string) {
- var buf bytes.Buffer
- buf.WriteString(keyword)
- for _, x := range v {
- buf.WriteString(" " + escape(x))
- }
- fmt.Println(buf.String())
- os.Stdout.Sync()
-}
-
-// All of the *Error functions call os.Exit(1).
-
-// Emit an ENV-ERROR with explanation text.
-func EnvError(msg string) {
- Line("ENV-ERROR", msg)
- os.Exit(1)
-}
-
-// Emit a VERSION-ERROR with explanation text.
-func VersionError(msg string) {
- Line("VERSION-ERROR", msg)
- os.Exit(1)
-}
-
-// Emit a CMETHOD-ERROR with explanation text.
-func CmethodError(methodName, msg string) {
- Line("CMETHOD-ERROR", methodName, msg)
- os.Exit(1)
-}
-
-// Emit an SMETHOD-ERROR with explanation text.
-func SmethodError(methodName, msg string) {
- Line("SMETHOD-ERROR", methodName, msg)
- os.Exit(1)
-}
-
-// Emit a CMETHOD line. socks must be "socks4" or "socks5". Call this once for
-// each listening client SOCKS port.
-func Cmethod(name string, socks string, addr net.Addr) {
- Line("CMETHOD", name, socks, addr.String())
-}
-
-// Emit a CMETHODS DONE line. Call this after opening all client listeners.
-func CmethodsDone() {
- Line("CMETHODS", "DONE")
-}
-
-// Emit an SMETHOD line. Call this once for each listening server port.
-func Smethod(name string, addr net.Addr) {
- Line("SMETHOD", name, addr.String())
-}
-
-// Emit an SMETHODS DONE line. Call this after opening all server listeners.
-func SmethodsDone() {
- Line("SMETHODS", "DONE")
-}
-
-// Get a pluggable transports version offered by Tor and understood by us, if
-// any. The only version we understand is "1". This function reads the
-// environment variable TOR_PT_MANAGED_TRANSPORT_VER.
-func getManagedTransportVer() string {
- const transportVersion = "1"
- for _, offered := range strings.Split(getenvRequired("TOR_PT_MANAGED_TRANSPORT_VER"), ",") {
- if offered == transportVersion {
- return offered
- }
- }
- return ""
-}
-
-// Get the intersection of the method names offered by Tor and those in
-// methodNames. This function reads the environment variable
-// TOR_PT_CLIENT_TRANSPORTS.
-func getClientTransports(methodNames []string) []string {
- clientTransports := getenvRequired("TOR_PT_CLIENT_TRANSPORTS")
- if clientTransports == "*" {
- return methodNames
- }
- result := make([]string, 0)
- for _, requested := range strings.Split(clientTransports, ",") {
- for _, methodName := range methodNames {
- if requested == methodName {
- result = append(result, methodName)
- break
- }
- }
- }
- return result
-}
-
-// This structure is returned by ClientSetup. It consists of a list of method
-// names.
-type ClientInfo struct {
- MethodNames []string
-}
-
-// Check the client pluggable transports environments, emitting an error message
-// and exiting the program if any error is encountered. Returns a subset of
-// methodNames requested by Tor.
-func ClientSetup(methodNames []string) ClientInfo {
- var info ClientInfo
-
- ver := getManagedTransportVer()
- if ver == "" {
- VersionError("no-version")
- } else {
- Line("VERSION", ver)
- }
-
- info.MethodNames = getClientTransports(methodNames)
- if len(info.MethodNames) == 0 {
- CmethodsDone()
- os.Exit(1)
- }
-
- return info
-}
-
-// A combination of a method name and an address, as extracted from
-// TOR_PT_SERVER_BINDADDR.
-type BindAddr struct {
- MethodName string
- Addr *net.TCPAddr
-}
-
-// Resolve an address string into a net.TCPAddr.
-func resolveBindAddr(bindAddr string) (*net.TCPAddr, error) {
- addr, err := net.ResolveTCPAddr("tcp", bindAddr)
- if err == nil {
- return addr, nil
- }
- // Before the fixing of bug #7011, tor doesn't put brackets around IPv6
- // addresses. Split after the last colon, assuming it is a port
- // separator, and try adding the brackets.
- parts := strings.Split(bindAddr, ":")
- if len(parts) <= 2 {
- return nil, err
- }
- bindAddr = "[" + strings.Join(parts[:len(parts)-1], ":") + "]:" + parts[len(parts)-1]
- return net.ResolveTCPAddr("tcp", bindAddr)
-}
-
-// Return a new slice, the members of which are those members of addrs having a
-// MethodName in methodNames.
-func filterBindAddrs(addrs []BindAddr, methodNames []string) []BindAddr {
- var result []BindAddr
-
- for _, ba := range addrs {
- for _, methodName := range methodNames {
- if ba.MethodName == methodName {
- result = append(result, ba)
- break
- }
- }
- }
-
- return result
-}
-
-// Return a map from method names to bind addresses. The map is the contents of
-// TOR_PT_SERVER_BINDADDR, with keys filtered by TOR_PT_SERVER_TRANSPORTS, and
-// further filtered by the methods in methodNames.
-func getServerBindAddrs(methodNames []string) []BindAddr {
- var result []BindAddr
-
- // Get the list of all requested bindaddrs.
- var serverBindAddr = getenvRequired("TOR_PT_SERVER_BINDADDR")
- for _, spec := range strings.Split(serverBindAddr, ",") {
- var bindAddr BindAddr
-
- parts := strings.SplitN(spec, "-", 2)
- if len(parts) != 2 {
- EnvError(fmt.Sprintf("TOR_PT_SERVER_BINDADDR: %q: doesn't contain \"-\"", spec))
- }
- bindAddr.MethodName = parts[0]
- addr, err := resolveBindAddr(parts[1])
- if err != nil {
- EnvError(fmt.Sprintf("TOR_PT_SERVER_BINDADDR: %q: %s", spec, err.Error()))
- }
- bindAddr.Addr = addr
- result = append(result, bindAddr)
- }
-
- // Filter by TOR_PT_SERVER_TRANSPORTS.
- serverTransports := getenvRequired("TOR_PT_SERVER_TRANSPORTS")
- if serverTransports != "*" {
- result = filterBindAddrs(result, strings.Split(serverTransports, ","))
- }
-
- // Finally filter by what we understand.
- result = filterBindAddrs(result, methodNames)
-
- return result
-}
-
-// Read and validate the contents of an auth cookie file. Returns the 32-byte
-// cookie. See section 4.2.1.2 of pt-spec.txt.
-func readAuthCookieFile(filename string) ([]byte, error) {
- authCookieHeader := []byte("! Extended ORPort Auth Cookie !\x0a")
- header := make([]byte, 32)
- cookie := make([]byte, 32)
-
- f, err := os.Open(filename)
- if err != nil {
- return cookie, err
- }
- defer f.Close()
-
- n, err := io.ReadFull(f, header)
- if err != nil {
- return cookie, err
- }
- n, err = io.ReadFull(f, cookie)
- if err != nil {
- return cookie, err
- }
- // Check that the file ends here.
- n, err = f.Read(make([]byte, 1))
- if n != 0 {
- return cookie, errors.New(fmt.Sprintf("file is longer than 64 bytes"))
- } else if err != io.EOF {
- return cookie, errors.New(fmt.Sprintf("did not find EOF at end of file"))
- }
-
- if !bytes.Equal(header, authCookieHeader) {
- return cookie, errors.New(fmt.Sprintf("missing auth cookie header"))
- }
-
- return cookie, nil
-}
-
-// This structure is returned by ServerSetup. It consists of a list of
-// BindAddrs, an address for the ORPort, an address for the extended ORPort (if
-// any), and an authentication cookie (if any).
-type ServerInfo struct {
- BindAddrs []BindAddr
- OrAddr *net.TCPAddr
- ExtendedOrAddr *net.TCPAddr
- AuthCookie []byte
-}
-
-// Check the server pluggable transports environments, emitting an error message
-// and exiting the program if any error is encountered. Resolves the various
-// requested bind addresses, the server ORPort and extended ORPort, and reads
-// the auth cookie file. Returns a ServerInfo struct.
-func ServerSetup(methodNames []string) ServerInfo {
- var info ServerInfo
- var err error
-
- ver := getManagedTransportVer()
- if ver == "" {
- VersionError("no-version")
- } else {
- Line("VERSION", ver)
- }
-
- var orPort = getenvRequired("TOR_PT_ORPORT")
- info.OrAddr, err = net.ResolveTCPAddr("tcp", orPort)
- if err != nil {
- EnvError(fmt.Sprintf("cannot resolve TOR_PT_ORPORT %q: %s", orPort, err.Error()))
- }
-
- info.BindAddrs = getServerBindAddrs(methodNames)
- if len(info.BindAddrs) == 0 {
- SmethodsDone()
- os.Exit(1)
- }
-
- var extendedOrPort = getenv("TOR_PT_EXTENDED_SERVER_PORT")
- if extendedOrPort != "" {
- info.ExtendedOrAddr, err = net.ResolveTCPAddr("tcp", extendedOrPort)
- if err != nil {
- EnvError(fmt.Sprintf("cannot resolve TOR_PT_EXTENDED_SERVER_PORT %q: %s", extendedOrPort, err.Error()))
- }
- }
-
- var authCookieFilename = getenv("TOR_PT_AUTH_COOKIE_FILE")
- if authCookieFilename != "" {
- info.AuthCookie, err = readAuthCookieFile(authCookieFilename)
- if err != nil {
- EnvError(fmt.Sprintf("error reading TOR_PT_AUTH_COOKIE_FILE %q: %s", authCookieFilename, err.Error()))
- }
- }
-
- return info
-}
-
-// See 217-ext-orport-auth.txt section 4.2.1.3.
-func computeServerHash(info *ServerInfo, clientNonce, serverNonce []byte) []byte {
- h := hmac.New(sha256.New, info.AuthCookie)
- io.WriteString(h, "ExtORPort authentication server-to-client hash")
- h.Write(clientNonce)
- h.Write(serverNonce)
- return h.Sum([]byte{})
-}
-
-// See 217-ext-orport-auth.txt section 4.2.1.3.
-func computeClientHash(info *ServerInfo, clientNonce, serverNonce []byte) []byte {
- h := hmac.New(sha256.New, info.AuthCookie)
- io.WriteString(h, "ExtORPort authentication client-to-server hash")
- h.Write(clientNonce)
- h.Write(serverNonce)
- return h.Sum([]byte{})
-}
-
-func extOrPortAuthenticate(s *net.TCPConn, info *ServerInfo) error {
- r := bufio.NewReader(s)
-
- // Read auth types. 217-ext-orport-auth.txt section 4.1.
- var authTypes [256]bool
- var count int
- for count = 0; count < 256; count++ {
- b, err := r.ReadByte()
- if err != nil {
- return err
- }
- if b == 0 {
- break
- }
- authTypes[b] = true
- }
- if count >= 256 {
- return errors.New(fmt.Sprintf("read 256 auth types without seeing \\x00"))
- }
-
- // We support only type 1, SAFE_COOKIE.
- if !authTypes[1] {
- return errors.New(fmt.Sprintf("server didn't offer auth type 1"))
- }
- _, err := s.Write([]byte{1})
- if err != nil {
- return err
- }
-
- clientNonce := make([]byte, 32)
- clientHash := make([]byte, 32)
- serverNonce := make([]byte, 32)
- serverHash := make([]byte, 32)
-
- _, err = io.ReadFull(rand.Reader, clientNonce)
- if err != nil {
- return err
- }
- _, err = s.Write(clientNonce)
- if err != nil {
- return err
- }
-
- _, err = io.ReadFull(r, serverHash)
- if err != nil {
- return err
- }
- _, err = io.ReadFull(r, serverNonce)
- if err != nil {
- return err
- }
-
- expectedServerHash := computeServerHash(info, clientNonce, serverNonce)
- if subtle.ConstantTimeCompare(serverHash, expectedServerHash) != 1 {
- return errors.New(fmt.Sprintf("mismatch in server hash"))
- }
-
- clientHash = computeClientHash(info, clientNonce, serverNonce)
- _, err = s.Write(clientHash)
- if err != nil {
- return err
- }
-
- status := make([]byte, 1)
- _, err = io.ReadFull(r, status)
- if err != nil {
- return err
- }
- if status[0] != 1 {
- return errors.New(fmt.Sprintf("server rejected authentication"))
- }
-
- if r.Buffered() != 0 {
- return errors.New(fmt.Sprintf("%d bytes left after extended OR port authentication", r.Buffered()))
- }
-
- return nil
-}
-
-// See section 3.1 of 196-transport-control-ports.txt.
-const (
- extOrCmdDone = 0x0000
- extOrCmdUserAddr = 0x0001
- extOrCmdTransport = 0x0002
- extOrCmdOkay = 0x1000
- extOrCmdDeny = 0x1001
-)
-
-func extOrPortWriteCommand(s *net.TCPConn, cmd uint16, body []byte) error {
- var buf bytes.Buffer
- if len(body) > 65535 {
- return errors.New("command exceeds maximum length of 65535")
- }
- err := binary.Write(&buf, binary.BigEndian, cmd)
- if err != nil {
- return err
- }
- err = binary.Write(&buf, binary.BigEndian, uint16(len(body)))
- if err != nil {
- return err
- }
- err = binary.Write(&buf, binary.BigEndian, body)
- if err != nil {
- return err
- }
- _, err = s.Write(buf.Bytes())
- if err != nil {
- return err
- }
-
- return nil
-}
-
-// Send a USERADDR command on s. See section 3.1.2.1 of
-// 196-transport-control-ports.txt.
-func extOrPortSendUserAddr(s *net.TCPConn, conn net.Conn) error {
- return extOrPortWriteCommand(s, extOrCmdUserAddr, []byte(conn.RemoteAddr().String()))
-}
-
-// Send a TRANSPORT command on s. See section 3.1.2.2 of
-// 196-transport-control-ports.txt.
-func extOrPortSendTransport(s *net.TCPConn, methodName string) error {
- return extOrPortWriteCommand(s, extOrCmdTransport, []byte(methodName))
-}
-
-// Send a DONE command on s. See section 3.1 of 196-transport-control-ports.txt.
-func extOrPortSendDone(s *net.TCPConn) error {
- return extOrPortWriteCommand(s, extOrCmdDone, []byte{})
-}
-
-func extOrPortRecvCommand(s *net.TCPConn) (cmd uint16, body []byte, err error) {
- var bodyLen uint16
- data := make([]byte, 4)
-
- _, err = io.ReadFull(s, data)
- if err != nil {
- return
- }
- buf := bytes.NewBuffer(data)
- err = binary.Read(buf, binary.BigEndian, &cmd)
- if err != nil {
- return
- }
- err = binary.Read(buf, binary.BigEndian, &bodyLen)
- if err != nil {
- return
- }
- body = make([]byte, bodyLen)
- _, err = io.ReadFull(s, body)
- if err != nil {
- return
- }
-
- return cmd, body, err
-}
-
-// Send USERADDR and TRANSPORT commands followed by a DONE command. Wait for an
-// OKAY or DENY response command from the server. Returns nil if and only if
-// OKAY is received.
-func extOrPortSetup(s *net.TCPConn, conn net.Conn, methodName string) error {
- var err error
-
- err = extOrPortSendUserAddr(s, conn)
- if err != nil {
- return err
- }
- err = extOrPortSendTransport(s, methodName)
- if err != nil {
- return err
- }
- err = extOrPortSendDone(s)
- if err != nil {
- return err
- }
- cmd, _, err := extOrPortRecvCommand(s)
- if err != nil {
- return err
- }
- if cmd == extOrCmdDeny {
- return errors.New("server returned DENY after our USERADDR and DONE")
- } else if cmd != extOrCmdOkay {
- return errors.New(fmt.Sprintf("server returned unknown command 0x%04x after our USERADDR and DONE", cmd))
- }
-
- return nil
-}
-
-// Connect to info.ExtendedOrAddr if defined, or else info.OrAddr, and return an
-// open *net.TCPConn. If connecting to the extended OR port, extended OR port
-// authentication à la 217-ext-orport-auth.txt is done before returning; an
-// error is returned if authentication fails.
-func ConnectOr(info *ServerInfo, conn net.Conn, methodName string) (*net.TCPConn, error) {
- if info.ExtendedOrAddr == nil {
- return net.DialTCP("tcp", nil, info.OrAddr)
- }
-
- s, err := net.DialTCP("tcp", nil, info.ExtendedOrAddr)
- if err != nil {
- return nil, err
- }
- s.SetDeadline(time.Now().Add(5 * time.Second))
- err = extOrPortAuthenticate(s, info)
- if err != nil {
- s.Close()
- return nil, err
- }
- err = extOrPortSetup(s, conn, methodName)
- if err != nil {
- s.Close()
- return nil, err
- }
- s.SetDeadline(time.Time{})
-
- return s, nil
-}
diff --git a/pt/pt_test.go b/pt/pt_test.go
deleted file mode 100644
index cc7924a..0000000
--- a/pt/pt_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-package pt
-
-import "os"
-import "testing"
-
-func stringIsSafe(s string) bool {
- for _, c := range []byte(s) {
- if c == '\x00' || c == '\n' || c > 127 {
- return false
- }
- }
- return true
-}
-
-func TestEscape(t *testing.T) {
- tests := [...]string{
- "",
- "abc",
- "a\nb",
- "a\\b",
- "ab\\",
- "ab\\\n",
- "ab\n\\",
- }
-
- check := func(input string) {
- output := escape(input)
- if !stringIsSafe(output) {
- t.Errorf("escape(%q) → %q", input, output)
- }
- }
- for _, input := range tests {
- check(input)
- }
- for b := 0; b < 256; b++ {
- // check one-byte string with each byte value 0–255
- check(string([]byte{byte(b)}))
- // check UTF-8 encoding of each character 0–255
- check(string(b))
- }
-}
-
-func TestGetManagedTransportVer(t *testing.T) {
- tests := [...]struct {
- input, expected string
- }{
- {"1", "1"},
- {"1,1", "1"},
- {"1,2", "1"},
- {"2,1", "1"},
- {"2", ""},
- }
-
- for _, test := range tests {
- os.Setenv("TOR_PT_MANAGED_TRANSPORT_VER", test.input)
- output := getManagedTransportVer()
- if output != test.expected {
- t.Errorf("%q → %q (expected %q)", test.input, output, test.expected)
- }
- }
-}
diff --git a/pt/socks/socks.go b/pt/socks/socks.go
deleted file mode 100644
index 788d53c..0000000
--- a/pt/socks/socks.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// SOCKS4a server library.
-
-package socks
-
-import (
- "bufio"
- "errors"
- "fmt"
- "io"
- "net"
-)
-
-const (
- socksVersion = 0x04
- socksCmdConnect = 0x01
- socksResponseVersion = 0x00
- socksRequestGranted = 0x5a
- socksRequestFailed = 0x5b
-)
-
-// Read a SOCKS4a connect request, and call the given connect callback with the
-// requested destination string. If the callback returns an error, sends a SOCKS
-// request failed message. Otherwise, sends a SOCKS request granted message for
-// the destination address returned by the callback.
-func AwaitSocks4aConnect(conn *net.TCPConn, connect func(string) (*net.TCPAddr, error)) error {
- dest, err := readSocks4aConnect(conn)
- if err != nil {
- sendSocks4aResponseFailed(conn)
- return err
- }
- destAddr, err := connect(dest)
- if err != nil {
- sendSocks4aResponseFailed(conn)
- return err
- }
- sendSocks4aResponseGranted(conn, destAddr)
- return nil
-}
-
-// Read a SOCKS4a connect request. Returns a "host:port" string.
-func readSocks4aConnect(s io.Reader) (string, error) {
- r := bufio.NewReader(s)
-
- var h [8]byte
- n, err := io.ReadFull(r, h[:])
- if err != nil {
- return "", errors.New(fmt.Sprintf("after %d bytes of SOCKS header: %s", n, err))
- }
- if h[0] != socksVersion {
- return "", errors.New(fmt.Sprintf("SOCKS header had version 0x%02x, not 0x%02x", h[0], socksVersion))
- }
- if h[1] != socksCmdConnect {
- return "", errors.New(fmt.Sprintf("SOCKS header had command 0x%02x, not 0x%02x", h[1], socksCmdConnect))
- }
-
- _, err = r.ReadBytes('\x00')
- if err != nil {
- return "", errors.New(fmt.Sprintf("reading SOCKS userid: %s", err))
- }
-
- var port int
- var host string
-
- port = int(h[2])<<8 | int(h[3])<<0
- if h[4] == 0 && h[5] == 0 && h[6] == 0 && h[7] != 0 {
- hostBytes, err := r.ReadBytes('\x00')
- if err != nil {
- return "", errors.New(fmt.Sprintf("reading SOCKS4a destination: %s", err))
- }
- host = string(hostBytes[:len(hostBytes)-1])
- } else {
- host = net.IPv4(h[4], h[5], h[6], h[7]).String()
- }
-
- if r.Buffered() != 0 {
- return "", errors.New(fmt.Sprintf("%d bytes left after SOCKS header", r.Buffered()))
- }
-
- return fmt.Sprintf("%s:%d", host, port), nil
-}
-
-// Send a SOCKS4a response with the given code and address.
-func sendSocks4aResponse(w io.Writer, code byte, addr *net.TCPAddr) error {
- var resp [8]byte
- resp[0] = socksResponseVersion
- resp[1] = code
- resp[2] = byte((addr.Port >> 8) & 0xff)
- resp[3] = byte((addr.Port >> 0) & 0xff)
- resp[4] = addr.IP[0]
- resp[5] = addr.IP[1]
- resp[6] = addr.IP[2]
- resp[7] = addr.IP[3]
- _, err := w.Write(resp[:])
- return err
-}
-
-var emptyAddr = net.TCPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 0}
-
-// Send a SOCKS4a response code 0x5a.
-func sendSocks4aResponseGranted(w io.Writer, addr *net.TCPAddr) error {
- return sendSocks4aResponse(w, socksRequestGranted, addr)
-}
-
-// Send a SOCKS4a response code 0x5b (with an all-zero address).
-func sendSocks4aResponseFailed(w io.Writer) error {
- return sendSocks4aResponse(w, socksRequestFailed, &emptyAddr)
-}
diff --git a/websocket-client/websocket-client.go b/websocket-client/websocket-client.go
index 7f838bb..547d217 100644
--- a/websocket-client/websocket-client.go
+++ b/websocket-client/websocket-client.go
@@ -18,11 +18,11 @@ import (
"time"
)
-import "../pt"
-import "../pt/socks"
+import "git.torproject.org/pluggable-transports/goptlib.git"
+
+var ptInfo pt.ClientInfo
const ptMethodName = "websocket"
-const socksTimeout = 2 * time.Second
const bufSiz = 1500
var logFile = os.Stderr
@@ -115,7 +115,7 @@ func proxy(local *net.TCPConn, ws *websocket.Conn) {
wg.Wait()
}
-func handleConnection(conn *net.TCPConn) error {
+func handleConnection(conn *pt.SocksConn) error {
defer conn.Close()
handlerChan <- 1
@@ -125,34 +125,32 @@ func handleConnection(conn *net.TCPConn) error {
var ws *websocket.Conn
- conn.SetDeadline(time.Now().Add(socksTimeout))
- err := socks.AwaitSocks4aConnect(conn, func(dest string) (*net.TCPAddr, error) {
- // Disable deadline.
- conn.SetDeadline(time.Time{})
- Log("SOCKS request for %s", dest)
- destAddr, err := net.ResolveTCPAddr("tcp", dest)
- if err != nil {
- return nil, err
- }
- wsUrl := url.URL{Scheme: "ws", Host: dest}
- ws, err = websocket.Dial(wsUrl.String(), "", wsUrl.String())
- if err != nil {
- return nil, err
- }
- Log("WebSocket connection to %s", ws.Config().Location.String())
- return destAddr, nil
- })
+ Log("SOCKS request for %s", conn.Req.Target)
+ destAddr, err := net.ResolveTCPAddr("tcp", conn.Req.Target)
if err != nil {
+ conn.Reject()
return err
}
+ wsUrl := url.URL{Scheme: "ws", Host: conn.Req.Target}
+ ws, err = websocket.Dial(wsUrl.String(), "", wsUrl.String())
+ if err != nil {
+ err = conn.Reject()
+ return err
+ }
+ Log("WebSocket connection to %s", ws.Config().Location.String())
defer ws.Close()
- proxy(conn, ws)
+ err = conn.Grant(destAddr)
+ if err != nil {
+ return err
+ }
+
+ proxy(conn.Conn.(*net.TCPConn), ws)
return nil
}
-func socksAcceptLoop(ln *net.TCPListener) error {
+func socksAcceptLoop(ln *pt.SocksListener) error {
for {
- socks, err := ln.AcceptTCP()
+ socks, err := ln.AcceptSocks()
if err != nil {
return err
}
@@ -166,12 +164,8 @@ func socksAcceptLoop(ln *net.TCPListener) error {
return nil
}
-func startListener(addrStr string) (*net.TCPListener, error) {
- addr, err := net.ResolveTCPAddr("tcp", addrStr)
- if err != nil {
- return nil, err
- }
- ln, err := net.ListenTCP("tcp", addr)
+func startListener(addrStr string) (*pt.SocksListener, error) {
+ ln, err := pt.ListenSocks("tcp", addrStr)
if err != nil {
return nil, err
}
@@ -188,6 +182,7 @@ func main() {
var logFilename string
var socksAddrStrs = []string{"127.0.0.1:0"}
var socksArg string
+ var err error
flag.Usage = usage
flag.StringVar(&logFilename, "log", "", "log file to write to")
@@ -208,15 +203,20 @@ func main() {
}
Log("starting")
- pt.ClientSetup([]string{ptMethodName})
+ ptInfo, err = pt.ClientSetup([]string{ptMethodName})
+ if err != nil {
+ Log("error in setup: %s", err)
+ os.Exit(1)
+ }
- listeners := make([]*net.TCPListener, 0)
+ listeners := make([]net.Listener, 0)
for _, socksAddrStr := range socksAddrStrs {
ln, err := startListener(socksAddrStr)
if err != nil {
pt.CmethodError(ptMethodName, err.Error())
+ continue
}
- pt.Cmethod(ptMethodName, "socks4", ln.Addr())
+ pt.Cmethod(ptMethodName, ln.Version(), ln.Addr())
Log("listening on %s", ln.Addr().String())
listeners = append(listeners, ln)
}
diff --git a/websocket-server/websocket-server.go b/websocket-server/websocket-server.go
index e5ed1c5..806dd51 100644
--- a/websocket-server/websocket-server.go
+++ b/websocket-server/websocket-server.go
@@ -20,9 +20,10 @@ import (
"time"
)
-import "../pt"
import "../websocket"
+import "git.torproject.org/pluggable-transports/goptlib.git"
+
const ptMethodName = "websocket"
const requestTimeout = 10 * time.Second
@@ -176,7 +177,7 @@ func webSocketHandler(ws *websocket.WebSocket) {
handlerChan <- -1
}()
- s, err := pt.ConnectOr(&ptInfo, ws.Conn, ptMethodName)
+ s, err := pt.DialOr(&ptInfo, ws.Conn.RemoteAddr(), ptMethodName)
if err != nil {
log("Failed to connect to ORPort: " + err.Error())
return
@@ -225,23 +226,28 @@ func main() {
}
log("starting")
- ptInfo = pt.ServerSetup([]string{ptMethodName})
+ var err error
+ ptInfo, err = pt.ServerSetup([]string{ptMethodName})
+ if err != nil {
+ log("error in setup: %s", err)
+ os.Exit(1)
+ }
listeners := make([]*net.TCPListener, 0)
- for _, bindAddr := range ptInfo.BindAddrs {
+ for _, bindaddr := range ptInfo.Bindaddrs {
// Override tor's requested port (which is 0 if this transport
// has not been run before) with the one requested by the --port
// option.
if port != 0 {
- bindAddr.Addr.Port = port
+ bindaddr.Addr.Port = port
}
- ln, err := startListener(bindAddr.Addr)
+ ln, err := startListener(bindaddr.Addr)
if err != nil {
- pt.SmethodError(bindAddr.MethodName, err.Error())
+ pt.SmethodError(bindaddr.MethodName, err.Error())
continue
}
- pt.Smethod(bindAddr.MethodName, ln.Addr())
+ pt.Smethod(bindaddr.MethodName, ln.Addr())
log("listening on %s", ln.Addr().String())
listeners = append(listeners, ln)
}
1
0
commit 569dcc51fd04cf96b086327e3ba2628e62c42717
Author: David Fifield <david(a)bamsoftware.com>
Date: Wed Dec 11 01:09:36 2013 -0800
websocket lives on its own now.
---
README | 2 --
1 file changed, 2 deletions(-)
diff --git a/README b/README
index a68ac45..ea06122 100644
--- a/README
+++ b/README
@@ -7,8 +7,6 @@ doc/websocket-transport.txt.
In order to build, you need development tools for the Go programming
language ("apt-get install golang" on Debian).
-
- $ cd websocket-transport
$ make
# make install
1
0