tor-commits
Threads by month
- ----- 2025 -----
- 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
March 2012
- 19 participants
- 1205 discussions
commit 14c94f93f207e8088fc56e5d192d29276fc7ca38
Author: Tomás Touceda <chiiph(a)torproject.org>
Date: Sat Mar 17 17:33:30 2012 -0300
Implement panic button
---
src/common/file.cpp | 27 +++++++
src/common/file.h | 3 +
src/vidalia/MainWindow.cpp | 80 +++++++++++++++++++
src/vidalia/MainWindow.h | 4 +
src/vidalia/config/AdvancedPage.cpp | 30 +++++++
src/vidalia/config/AdvancedPage.h | 3 +
src/vidalia/config/AdvancedPage.ui | 133 +++++++++++++++++++++++++++++++-
src/vidalia/config/VidaliaSettings.cpp | 28 +++++++
src/vidalia/config/VidaliaSettings.h | 10 +++
9 files changed, 314 insertions(+), 4 deletions(-)
diff --git a/src/common/file.cpp b/src/common/file.cpp
index f133565..7434bef 100644
--- a/src/common/file.cpp
+++ b/src/common/file.cpp
@@ -123,3 +123,30 @@ expand_filename(const QString &filename)
return fname;
}
+/** Recursively remove the directory with all its contents. */
+bool
+remove_dir(const QString &path)
+{
+ bool res = true;
+ QDir dir(path);
+
+ if(not dir.exists(path))
+ return false;
+
+ foreach(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot |
+ QDir::System |
+ QDir::Hidden |
+ QDir::AllDirs |
+ QDir::Files)) {
+ if(info.isDir())
+ res = remove_dir(info.absoluteFilePath());
+ else
+ res = QFile::remove(info.absoluteFilePath());
+
+ if(!res)
+ return res;
+ }
+ res = dir.rmdir(path);
+
+ return res;
+}
diff --git a/src/common/file.h b/src/common/file.h
index 30d4477..c4f0873 100644
--- a/src/common/file.h
+++ b/src/common/file.h
@@ -38,5 +38,8 @@ QString expand_filename(const QString &filename);
* otherwise. */
bool copy_dir(const QString &source, const QString &dest);
+/** Recursively remove the directory with all its contents. */
+bool remove_dir(const QString &dir);
+
#endif
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index 3b505ad..c568c80 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -180,6 +180,7 @@ MainWindow::createActions()
_actionStartStopTor = new QAction(QIcon(IMG_START_TOR_16), tr("Start Tor"), this);
_actionExit = new QAction(QIcon(IMG_EXIT), tr("Exit"), this);
_actionDebugDialog = new QAction(tr("Debug output"), this);
+ _actionPanic = new QAction(QIcon(IMG_EXIT), tr("Panic!"), this);
}
/** Creates the menu bar */
@@ -238,6 +239,10 @@ MainWindow::createToolBar()
tool->addAction(_actionNewIdentity);
tool->addAction(_actionConfigure);
+ VidaliaSettings settings;
+ if(settings.allowPanic())
+ tool->addAction(_actionPanic);
+
tool->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
}
@@ -256,6 +261,12 @@ MainWindow::createTrayMenu()
menu->addSeparator();
menu->addAction(_actionShowControlPanel);
+ VidaliaSettings settings;
+ if(settings.allowPanic()) {
+ menu->addSeparator();
+ menu->addAction(_actionPanic);
+ }
+
menu->addMenu(&_reattachMenu);
#if !defined(Q_WS_MAC)
@@ -365,6 +376,7 @@ MainWindow::retranslateUi()
_actionStatus->setText(tr("Status"));
_actionVidaliaHelp->setText(tr("Help"));
_actionNewIdentity->setText(tr("New Circuit"));
+ _actionPanic->setText(tr("Panic!"));
#if !defined(Q_WS_MAC)
_actionAbout->setText(tr("About"));
@@ -396,6 +408,8 @@ MainWindow::createConnections()
connect(_actionDebugDialog, SIGNAL(triggered()), this, SLOT(showDebugDialog()));
+ connect(_actionPanic, SIGNAL(triggered()), this, SLOT(panic()));
+
/* Catch signals when the application is running or shutting down */
connect(vApp, SIGNAL(running()), this, SLOT(running()));
connect(vApp, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()));
@@ -2138,3 +2152,69 @@ MainWindow::installUpdatesFailed(const QString &errmsg)
#endif
+/** Called when the panic button is pressed */
+void
+MainWindow::panic()
+{
+ VidaliaSettings settings;
+ QString binaryPath;
+ QFileInfo starter, vidalia;
+
+ // First some sanity checks so we don't remove any directory
+
+#if defined(Q_WS_WIN)
+ starter.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("Start Tor Browser.exe"));
+ vidalia.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("App/vidalia.exe"));
+
+ binaryPath = vidalia.absoluteFilePath();
+#elif defined(Q_WS_MAC)
+ starter.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("Contents/MacOS/TorBrowserBundle"));
+ vidalia.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("Contents/MacOS/Vidalia.app"));
+
+ binaryPath = QFileInfo(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("Contents/MacOS/Vidalia.app/Contents/MacOS/Vidalia")).absolutePath();
+#else
+ starter.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("start-tor-browser"));
+ vidalia.setFile(QString("%1/%2")
+ .arg(settings.panicPath())
+ .arg("App/vidalia"));
+
+ binaryPath = vidalia.absoluteFilePath();
+#endif
+
+ if(not (starter.exists() and vidalia.exists())) {
+ vWarn("Trying to panic but the directory is not what was expected.");
+ return;
+ }
+
+ if(binaryPath != QApplication::applicationFilePath()) {
+ vWarn("Trying to panic but the Panic Path does not contain Vidalia's binary");
+ return;
+ }
+
+ hide();
+ _trayIcon.setVisible(false);
+
+#if !defined(Q_WS_WIN)
+ bool res = remove_dir(settings.panicPath());
+#else
+ QProcess::startDetached(QString("cmd /C ping -n 1 127.0.0.1 >NUL && rmdir /Q /S \"%1\"")
+ .arg(settings.panicPath()));
+#endif
+ if(_torControl->isRunning()) {
+ // We have taken tor's ownership, so just quit
+ vApp->disconnect();
+ }
+ vApp->quit();
+}
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 6e60bb7..db9b7e1 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -162,6 +162,9 @@ private slots:
/** Called when tor detects a problem with the system clock */
void clockSkewed(int skew, const QString &source);
+ /** Called when the Panic! button is pressed */
+ void panic();
+
#if defined(USE_AUTOUPDATE)
/** Called when the user clicks the 'Check Now' button in the General
* settings page. */
@@ -291,6 +294,7 @@ private:
QAction *_actionAbout;
QAction *_actionExit;
QAction *_actionDebugDialog;
+ QAction *_actionPanic;
QMenu _reattachMenu; /**< Menu used to handle tab re-attaching */
QAction *_dummy; /**< Dummy action to display when there are no more tabs */
diff --git a/src/vidalia/config/AdvancedPage.cpp b/src/vidalia/config/AdvancedPage.cpp
index 7f9d884..084d17c 100644
--- a/src/vidalia/config/AdvancedPage.cpp
+++ b/src/vidalia/config/AdvancedPage.cpp
@@ -19,6 +19,7 @@
#include "VMessageBox.h"
#include "IpValidator.h"
#include "Local8BitStringValidator.h"
+#include "VidaliaSettings.h"
#include "file.h"
@@ -68,6 +69,8 @@ AdvancedPage::AdvancedPage(QWidget *parent)
connect(ui.btnBrowseSocketPath, SIGNAL(clicked()), this, SLOT(browseSocketPath()));
connect(ui.chkAuto, SIGNAL(toggled(bool)), this, SLOT(toggleAuto(bool)));
+ connect(ui.btnBrowsePanicPath, SIGNAL(clicked()), this, SLOT(browsePanicPath()));
+
/* Hide platform specific features */
#if defined(Q_WS_WIN)
#if 0
@@ -76,6 +79,11 @@ AdvancedPage::AdvancedPage(QWidget *parent)
/* Disable ControlSocket */
ui.rdoControlSocket->setEnabled(false);
#endif
+
+ ui.lblPanicWarn->setVisible(false);
+ ui.lblPanicPath->setVisible(false);
+ ui.linePanicPath->setVisible(false);
+ ui.btnBrowsePanicPath->setVisible(false);
}
/** Destructor */
@@ -209,6 +217,10 @@ AdvancedPage::save(QString &errmsg)
&& !ui.chkRandomPassword->isChecked())
_settings->setControlPassword(ui.linePassword->text());
+ VidaliaSettings vsettings;
+ vsettings.setAllowPanic(ui.chkEnablePanic->isChecked());
+ vsettings.setPanicPath(ui.linePanicPath->text());
+
#if 0
#if defined(Q_WS_WIN)
/* Install or uninstall the Tor service as necessary */
@@ -252,6 +264,11 @@ AdvancedPage::load()
ui.chkAuto->setChecked(false);
ui.chkAuto->setVisible(false);
}
+
+ VidaliaSettings settings;
+
+ ui.chkEnablePanic->setChecked(settings.allowPanic());
+ ui.linePanicPath->setText(settings.panicPath());
}
/** Called when the user selects a different authentication method from the
@@ -448,3 +465,16 @@ AdvancedPage::displayWarning(bool checked)
indexToAuthMethod(ui.cmbAuthMethod->currentIndex()) ==
TorSettings::PasswordAuth);
}
+
+/** Opens a QFileDialog for the user to browse to or create a directory for
+ * Tor's DataDirectory. */
+void
+AdvancedPage::browsePanicPath()
+{
+ QString panicPath = QFileDialog::getExistingDirectory(this,
+ tr("Select a Directory to Use for Panic"),
+ ui.linePanicPath->text());
+
+ if (!panicPath.isEmpty())
+ ui.linePanicPath->setText(panicPath);
+}
diff --git a/src/vidalia/config/AdvancedPage.h b/src/vidalia/config/AdvancedPage.h
index 0650376..ab91d0e 100644
--- a/src/vidalia/config/AdvancedPage.h
+++ b/src/vidalia/config/AdvancedPage.h
@@ -67,6 +67,9 @@ private slots:
/** Called when the user clicks "Browse" to choose the location of Tor's
* socket path. */
void browseSocketPath();
+ /** Called when the user clicks "Browse" to choose location of Tor config
+ * file */
+ void browsePanicPath();
/** Called when the user changes from ControlPort to ControlSocket or
* the other way aroud */
void toggleControl(bool);
diff --git a/src/vidalia/config/AdvancedPage.ui b/src/vidalia/config/AdvancedPage.ui
index 1799e24..a9c97fa 100644
--- a/src/vidalia/config/AdvancedPage.ui
+++ b/src/vidalia/config/AdvancedPage.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>586</width>
- <height>522</height>
+ <width>619</width>
+ <height>608</height>
</rect>
</property>
<property name="contextMenuPolicy">
@@ -252,7 +252,7 @@
<item>
<widget class="QLabel" name="lblWarn">
<property name="text">
- <string>WARNING: If you hand pick the password it will be saved as plain text in Vidalia's configuration file. Using a random password is safer.</string>
+ <string><b>WARNING</b>: If you hand pick the password it will be saved as plain text in Vidalia's configuration file. Using a random password is safer.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -415,6 +415,66 @@
</widget>
</item>
<item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Panic</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="3" column="1" colspan="2">
+ <widget class="QLabel" name="lblPanicWarn">
+ <property name="text">
+ <string><b>WARNING</b>: The panic button will erease the application if pressed</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QLineEdit" name="linePanicPath">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QPushButton" name="btnBrowsePanicPath">
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="chkEnablePanic">
+ <property name="text">
+ <string>Enable panic button</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QLabel" name="lblPanicPath">
+ <property name="text">
+ <string>Panic path:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>1</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -439,5 +499,70 @@
<tabstop>btnBrowseTorDataDirectory</tabstop>
</tabstops>
<resources/>
- <connections/>
+ <connections>
+ <connection>
+ <sender>chkEnablePanic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lblPanicWarn</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>319</x>
+ <y>448</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>316</x>
+ <y>472</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>chkEnablePanic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lblPanicPath</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>319</x>
+ <y>448</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>274</x>
+ <y>496</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>chkEnablePanic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>linePanicPath</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>319</x>
+ <y>448</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>274</x>
+ <y>529</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>chkEnablePanic</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnBrowsePanicPath</receiver>
+ <slot>setVisible(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>319</x>
+ <y>448</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>568</x>
+ <y>531</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
</ui>
diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp
index c848358..913b0b1 100644
--- a/src/vidalia/config/VidaliaSettings.cpp
+++ b/src/vidalia/config/VidaliaSettings.cpp
@@ -38,6 +38,8 @@
#define SETTING_LOCAL_GEOIP_DATABASE "LocalGeoIpDatabase"
#define SETTING_PLUGIN_PATH "PluginPath"
#define SETTING_SKIP_VERSION_CHECK "SkipVersionCheck"
+#define SETTING_ALLOW_PANIC "AllowPanic"
+#define SETTING_PANIC_PATH "PanicPath"
#if defined(Q_OS_WIN32)
#define STARTUP_REG_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
@@ -84,6 +86,8 @@ VidaliaSettings::VidaliaSettings()
setDefault(SETTING_ICON_PREF, Both);
setDefault(SETTING_SKIP_VERSION_CHECK, false);
setDefault(SETTING_REMEMBER_SHUTDOWN, false);
+ setDefault(SETTING_ALLOW_PANIC, false);
+ setDefault(SETTING_PANIC_PATH, "");
}
/** Gets the currently preferred language code for Vidalia. */
@@ -338,3 +342,27 @@ VidaliaSettings::setRememberShutdown(bool val)
{
setValue(SETTING_REMEMBER_SHUTDOWN, val);
}
+
+bool
+VidaliaSettings::allowPanic() const
+{
+ return value(SETTING_ALLOW_PANIC).toBool();
+}
+
+void
+VidaliaSettings::setAllowPanic(bool val)
+{
+ setValue(SETTING_ALLOW_PANIC, val);
+}
+
+QString
+VidaliaSettings::panicPath() const
+{
+ return value(SETTING_PANIC_PATH).toString();
+}
+
+void
+VidaliaSettings::setPanicPath(const QString &path)
+{
+ setValue(SETTING_PANIC_PATH, path);
+}
diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h
index d1c83a2..6f5efb1 100644
--- a/src/vidalia/config/VidaliaSettings.h
+++ b/src/vidalia/config/VidaliaSettings.h
@@ -136,6 +136,16 @@ public:
bool rememberShutdown();
/** Sets RememberShutdown to val */
void setRememberShutdown(bool val);
+
+ /** Returns true if AllowPanic is enabled */
+ bool allowPanic() const;
+ /** Sets AllowPanic to val */
+ void setAllowPanic(bool val);
+
+ /** Returns the path that should be eliminated for panic */
+ QString panicPath() const;
+ /** Sets the path for panic */
+ void setPanicPath(const QString &path);
};
#endif
1
0
commit d13d7b667156e2369439f3a37368a1f83cf454e6
Author: Tomás Touceda <chiiph(a)torproject.org>
Date: Tue Mar 20 14:58:55 2012 -0300
Add a changes file
---
changes/bug4107 | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/changes/bug4107 b/changes/bug4107
new file mode 100644
index 0000000..9c90b0b
--- /dev/null
+++ b/changes/bug4107
@@ -0,0 +1,4 @@
+ o Add a Panic button. Some users want to get rid of the Tor Browser
+ Bundle quickly in certain circumstances, this button does exactly
+ that but with a simple erease, not some secure method. Resolves
+ ticket 4107.
\ No newline at end of file
1
0

[torspec/master] Add proposal 198: Restore semantics of TLS ClientHello
by nickm@torproject.org 20 Mar '12
by nickm@torproject.org 20 Mar '12
20 Mar '12
commit 16115c77fb7f2ee764df3ebf8cc2360f4d8ce479
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Mon Mar 19 13:30:10 2012 -0400
Add proposal 198: Restore semantics of TLS ClientHello
---
proposals/000-index.txt | 2 +
proposals/198-restore-clienthello-semantics.txt | 160 +++++++++++++++++++++++
2 files changed, 162 insertions(+), 0 deletions(-)
diff --git a/proposals/000-index.txt b/proposals/000-index.txt
index c5f7707..d553084 100644
--- a/proposals/000-index.txt
+++ b/proposals/000-index.txt
@@ -118,6 +118,7 @@ Proposals by number:
195 TLS certificate normalization for Tor 0.2.4.x [DRAFT]
196 Extended ORPort and TransportControlPort [OPEN]
197 Message-based Inter-Controller IPC Channel [OPEN]
+198 Restore semantics of TLS ClientHello [OPEN]
Proposals by status:
@@ -156,6 +157,7 @@ Proposals by status:
194 Mnemonic .onion URLs
196 Extended ORPort and TransportControlPort [for 0.2.4.x]
197 Message-based Inter-Controller IPC Channel [for 0.2.4.x]
+ 198 Restore semantics of TLS ClientHello
ACCEPTED:
117 IPv6 exits [for 0.2.3.x]
140 Provide diffs between consensuses
diff --git a/proposals/198-restore-clienthello-semantics.txt b/proposals/198-restore-clienthello-semantics.txt
new file mode 100644
index 0000000..a28a3c7
--- /dev/null
+++ b/proposals/198-restore-clienthello-semantics.txt
@@ -0,0 +1,160 @@
+Filename: 198-restore-clienthello-semantics.txt
+Title: Restore semantics of TLS ClientHello
+Author: Nick Mathewson
+Created: 19-Mar-2012
+Status: Open
+
+Overview:
+
+ Currently, all supported Tor versions try to imitate an older version
+ of Firefox when advertising ciphers in their TLS ClientHello. This
+ feature is intended to make it harder for a censor to distinguish a
+ Tor client from other TLS traffic. Unfortunately, it makes the
+ contents of the ClientHello unreliable: a server cannot conclude that
+ a cipher is really supported by a Tor client simply because it is
+ advertised in the ClientHello.
+
+ This proposal suggests an approach for restoring sanity to our use of
+ ClientHello, so that we still avoid ciphersuite-based fingerprinting,
+ but allow nodes to negotiate better ciphersuites than they are
+ allowed to negotiate today.
+
+Background reading:
+
+ Section 2 of tor-spec.txt 2 describes our current baroque link
+ negotiation scheme. Proposals 176 and 184 describe more information
+ about how it got that way.
+
+ Bug 4744 is a big part of the motivation for this proposal: we want
+ to allow Tors to advertise even more ciphers, some of which we would
+ actually prefer to the ones we are using now.
+
+ What you need to know about the TLS handshake is that the client
+ sends a list of all the ciphersuites that it supports in its
+ ClientHello message, and then the server chooses one and tells the
+ client which one it picked.
+
+Motivation and constraints:
+
+ We'd like to use some of the ECDHE TLS ciphersuites, since they allow
+ us to get better forward-secrecy at lower cost than our current
+ DH-1024 usage. But right now, we can't ever use them, since Tor will
+ advertise them whether or not it has a version of OpenSSL that
+ supports them.
+
+ (OpenSSL before 1.0.0 did not support ECDHE ciphersuites; OpenSSL
+ before 1.0.0e or so had some security issues with them.)
+
+ We cannot have the rule be "Tors must only advertise ciphersuites
+ that they can use", since current Tors will advertise such
+ ciphersuites anyway.
+
+ We cannot have the rule be "Tors must support every ECDHE ciphersuite
+ on the following list", since current Tors don't do all that, and
+ since one prominent Linux distribution builds OpenSSL without ECC
+ support because of patent/freedom fears.
+
+ Fortunately, nearly every ciphersuite that we would like to advertise
+ to imitate FF8 (see bug 4744) is currently supported by OpenSSL 1.0.0
+ and later. This enables the following proposal to work:
+
+Proposed spec changes:
+
+ I propose that the rules for handling ciphersuites at the server side
+ become the following:
+
+ If the ciphersuites in the ClientHello contains no ciphers other than
+ the following[*], they indicate that the Tor v1 link protocol is in use.
+
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA
+ SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
+ SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
+
+ If the advertised ciphersuites in the ClientHello are _exactly_[*]
+ the following, they indicate that the Tor v2+ link protocol is in
+ use, AND that the ClientHello may have unsupported ciphers. In this
+ case, the server may choose DHE_RSA_WITH_AES_128_CBC_SHA or
+ DHE_RSA_WITH_AES_256_SHA, but may not choose any other cipher.
+
+ TLS1_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ TLS1_ECDHE_RSA_WITH_AES_256_CBC_SHA
+ TLS1_DHE_RSA_WITH_AES_256_SHA
+ TLS1_DHE_DSS_WITH_AES_256_SHA
+ TLS1_ECDH_RSA_WITH_AES_256_CBC_SHA
+ TLS1_ECDH_ECDSA_WITH_AES_256_CBC_SHA
+ TLS1_RSA_WITH_AES_256_SHA
+ TLS1_ECDHE_ECDSA_WITH_RC4_128_SHA
+ TLS1_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
+ TLS1_ECDHE_RSA_WITH_RC4_128_SHA
+ TLS1_ECDHE_RSA_WITH_AES_128_CBC_SHA
+ TLS1_DHE_RSA_WITH_AES_128_SHA
+ TLS1_DHE_DSS_WITH_AES_128_SHA
+ TLS1_ECDH_RSA_WITH_RC4_128_SHA
+ TLS1_ECDH_RSA_WITH_AES_128_CBC_SHA
+ TLS1_ECDH_ECDSA_WITH_RC4_128_SHA
+ TLS1_ECDH_ECDSA_WITH_AES_128_CBC_SHA
+ SSL3_RSA_RC4_128_MD5
+ SSL3_RSA_RC4_128_SHA
+ TLS1_RSA_WITH_AES_128_SHA
+ TLS1_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA
+ TLS1_ECDHE_RSA_WITH_DES_192_CBC3_SHA
+ SSL3_EDH_RSA_DES_192_CBC3_SHA
+ SSL3_EDH_DSS_DES_192_CBC3_SHA
+ TLS1_ECDH_RSA_WITH_DES_192_CBC3_SHA
+ TLS1_ECDH_ECDSA_WITH_DES_192_CBC3_SHA
+ SSL3_RSA_FIPS_WITH_3DES_EDE_CBC_SHA
+ SSL3_RSA_DES_192_CBC3_SHA
+
+ [*] The "extended renegotiation is supported" ciphersuite, 0x00ff, is
+ not counted when checking the list of ciphersuites.
+
+ Otherwise, the ClientHello has these semantics: The inclusion of any
+ cipher supported by OpenSSL 1.0.0 means that the client supports it,
+ with the exception of
+ SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA
+ which is never supported. Clients MUST advertise support for at least one of
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA or TLS_DHE_RSA_WITH_AES_128_CBC_SHA.
+
+ The server MUST choose a ciphersuite with ephemeral keys for forward
+ secrecy; MUST NOT choose a weak or null ciphersuite; and SHOULD NOT
+ choose any cipher other than AES or 3DES.
+
+Discussion and consequences:
+
+
+ Currently, OpenSSL 1.0.0 (in its default configuration) supports every
+ cipher that we would need in order to give the same list as Firefox
+ versions 8 through 11 give in their default configuration, with the
+ exception of the FIPS ciphersuite above. Therefore, wewill be able
+ to fake the new ciphersuite list correctly in all of our bundles that
+ include OpenSSL, and on every version of Unix that keeps up-to-date.
+
+ However, versions of Tor compiled to use older versions of OpenSSL, or
+ to use versions of OpenSSL with some ciphersuites disabled, will no
+ longer give the same ciphersuite lists as other versions of Tor. On
+ these platforms, Tor clients will no longer impersonate Firefox.
+ Users who need to do so will have to download one of our bundles, or
+ use a (non-system) OpenSSL.
+
+
+ The proposed spec change above tries to future-proof ourselves by not
+ declaring that we support every declared cipher, in case we someday
+ need to handle a new Firefox version. If a new Firefox version
+ comes out that uses ciphers not supported by OpenSSL 1.0.0, we will
+ need to define whether clients may advertise its ciphers without
+ supporting them; but existing servers will continue working whether
+ we decide yes or no.
+
+
+ The restriction to "servers SHOULD only pick AES or 3DES" is meant to
+ reflect our current behavior, not to represent a permanent refusal to
+ support other ciphers. We can revisit it later as appropriate, if for
+ some bizarre reason Camellia or Seed or Aria becomes a better bet than
+ AES.
+
+Open question:
+
+ Should the client drop connections if the server chooses a bad
+ cipher, or a suite without forward secrecy?
+
1
0

[torspec/master] Fixes and tweaks to 198 based on IRC suggestions and questions
by nickm@torproject.org 20 Mar '12
by nickm@torproject.org 20 Mar '12
20 Mar '12
commit e4895de78450b19a257cc743e3601e6248696880
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Mon Mar 19 18:09:34 2012 -0400
Fixes and tweaks to 198 based on IRC suggestions and questions
---
proposals/198-restore-clienthello-semantics.txt | 31 ++++++++++++++++++++--
1 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/proposals/198-restore-clienthello-semantics.txt b/proposals/198-restore-clienthello-semantics.txt
index a28a3c7..437946a 100644
--- a/proposals/198-restore-clienthello-semantics.txt
+++ b/proposals/198-restore-clienthello-semantics.txt
@@ -126,12 +126,12 @@ Discussion and consequences:
Currently, OpenSSL 1.0.0 (in its default configuration) supports every
cipher that we would need in order to give the same list as Firefox
versions 8 through 11 give in their default configuration, with the
- exception of the FIPS ciphersuite above. Therefore, wewill be able
+ exception of the FIPS ciphersuite above. Therefore, we will be able
to fake the new ciphersuite list correctly in all of our bundles that
include OpenSSL, and on every version of Unix that keeps up-to-date.
However, versions of Tor compiled to use older versions of OpenSSL, or
- to use versions of OpenSSL with some ciphersuites disabled, will no
+ versions of OpenSSL with some ciphersuites disabled, will no
longer give the same ciphersuite lists as other versions of Tor. On
these platforms, Tor clients will no longer impersonate Firefox.
Users who need to do so will have to download one of our bundles, or
@@ -153,8 +153,33 @@ Discussion and consequences:
some bizarre reason Camellia or Seed or Aria becomes a better bet than
AES.
-Open question:
+Open questions:
Should the client drop connections if the server chooses a bad
cipher, or a suite without forward secrecy?
+ Can we get OpenSSL to support the dubious FIPS suite excluded above,
+ in order to remove a distinguishing opportunity? It is not so simple
+ as just editing the SSL_CIPHER list in s3_lib.c, since the nonstandard
+ SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA cipher is (IIUC) defined to use the
+ TLS1 KDF, while declaring itself to be an SSL cipher (!).
+
+ Can we do anything to eventually allow the IE7+[**] cipher list as
+ well? IE does not support TLS_DHE_RSA_WITH_AES_{256,128}_SHA or
+ SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, and so wouldn't work with current
+ Tor servers, which _only_ support those. It looks like the only
+ forward-secure ciphersuites that IE7+ *does* support are ECDHE ones,
+ and DHE+DSS ones. So if we want this flexibility, we could mandate
+ server-side ECDHE, or somehow get DHE+DSS support (which would play
+ havoc with our current certificate generation code IIUC), or say that
+ it is sometimes acceptable to have a non-forward-secure link
+ protocol[***]. None of these answers seems like a great one. Is one
+ best? Are there other options?
+
+ [**] Actually, I think it's the Windows SChannel cipher list we
+ should be looking at here.
+ [***] If we did _that_, we'd want to specify that CREATE_FAST could
+ never be used on a non-forward-secure link. Even so, I don't like the
+ implications of leaking cell types and circuit IDs to a future
+ compromise.
+
1
0

r25560: {website} Reverting Arturo's mass whitespace changes Arturo stripped a (website/trunk/getinvolved/en)
by Damian Johnson 20 Mar '12
by Damian Johnson 20 Mar '12
20 Mar '12
Author: atagar
Date: 2012-03-20 15:12:10 +0000 (Tue, 20 Mar 2012)
New Revision: 25560
Modified:
website/trunk/getinvolved/en/volunteer.wml
Log:
Reverting Arturo's mass whitespace changes
Arturo stripped all trailing whitespace from the volunteer page wml while he
added his project. This bugs me and, since I make 95% of the changes to this
file, I'm gonna put it back the way I prefer.
Modified: website/trunk/getinvolved/en/volunteer.wml
===================================================================
--- website/trunk/getinvolved/en/volunteer.wml 2012-03-20 03:14:24 UTC (rev 25559)
+++ website/trunk/getinvolved/en/volunteer.wml 2012-03-20 15:12:10 UTC (rev 25560)
@@ -8,7 +8,7 @@
<a href="<page index>">Home » </a>
<a href="<page getinvolved/volunteer>">Volunteer</a>
</div>
- <div id="maincol">
+ <div id="maincol">
<!-- PUT CONTENT AFTER THIS TAG -->
<h1>A few things everyone can do now:</h1>
<ol>
@@ -30,7 +30,7 @@
yet described on that page, and you're comfortable sharing it with us,
we'd love to hear from you.</li>
</ol>
-
+
<a id="Documentation"></a>
<h2><a class="anchor" href="#Documentation">Documentation</a></h2>
<ol>
@@ -46,7 +46,7 @@
programs that interface to Tor</a>. Which ones are useful in which
situations? Please help us test them out and document your results.</li>
</ol>
-
+
<a id="Advocacy"></a>
<h2><a class="anchor" href="#Advocacy">Advocacy</a></h2>
<ol>
@@ -57,16 +57,16 @@
href="https://media.torproject.org/video/">Tor's Media server</a>,
<a
href="http://www.howcast.com/videos/90601-How-To-Circumvent-an-Internet-Proxy">Howcast</a>,
- and <a href="http://www.youtube.com/thetorproject">YouTube</a>.</li>
+ and <a href="http://www.youtube.com/thetorproject">YouTube</a>.</li>
<li>Create a poster, or a set of posters, around a theme,
such as "Tor for Freedom!".</li>
<li>Create a t-shirt design that incorporates "Congratulations!
You are using Tor!" in any language.</li>
</ol>
-
+
<a id="Projects"></a>
<h2><a class="anchor" href="#Projects">Projects</a></h2>
-
+
<p>
Below are a list of Tor related projects we're developing and/or
maintaining. Most discussions happen on IRC so if you're interested in any
@@ -75,7 +75,7 @@
to ask questions, and don't hesitate to ask even if the main contributors
aren't active at that moment.
</p>
-
+
<table id="projects">
<tr>
<th>Name</th>
@@ -84,7 +84,7 @@
<th>Activity</th>
<th>Contributors</th>
</tr>
-
+
<tr>
<td><a href="#project-tor">Tor</a></td>
<td>Core</td>
@@ -92,7 +92,7 @@
<td>Heavy</td>
<td>nickm, arma, Sebastian</td>
</tr>
-
+
<tr class="alt">
<td>*<a href="#project-jtor">JTor</a></td>
<td>Core</td>
@@ -100,7 +100,7 @@
<td>None</td>
<td></td>
</tr>
-
+
<tr>
<td><a href="#project-tbb">TBB</a></td>
<td>Usability</td>
@@ -108,7 +108,7 @@
<td>Moderate</td>
<td>Erinn</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-tails">Tails</a></td>
<td>Usability</td>
@@ -116,7 +116,7 @@
<td>Heavy</td>
<td><a href="https://tails.boum.org/chat/">#tails</a></td>
</tr>
-
+
<tr>
<td><a href="#project-torsocks">Torsocks</a></td>
<td>Usability</td>
@@ -124,7 +124,7 @@
<td>None</td>
<td>mwenge</td>
</tr>
-
+
<tr class="alt">
<td>*<a href="#project-torouter">Torouter</a></td>
<td>Usability</td>
@@ -132,7 +132,7 @@
<td>Light</td>
<td>ioerror, Runa</td>
</tr>
-
+
<tr>
<td><a href="#project-vidalia">Vidalia</a></td>
<td>User Interface</td>
@@ -140,7 +140,7 @@
<td>Light</td>
<td>chiiph</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-arm">Arm</a></td>
<td>User Interface</td>
@@ -148,7 +148,7 @@
<td>Light</td>
<td>atagar</td>
</tr>
-
+
<tr>
<td><a href="#project-orbot">Orbot</a></td>
<td>User Interface</td>
@@ -156,7 +156,7 @@
<td>Moderate</td>
<td>n8fr8</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-torbutton">Torbutton</a></td>
<td>Browser Add-on</td>
@@ -164,7 +164,7 @@
<td>Moderate</td>
<td>mikeperry</td>
</tr>
-
+
<tr>
<td><a href="#project-obfsproxy">Obfsproxy</a></td>
<td>Client Add-on</td>
@@ -172,7 +172,7 @@
<td>Moderate</td>
<td>nickm, asn</td>
</tr>
-
+
<tr class="alt">
<td>*<a href="#project-thandy">Thandy</a></td>
<td>Updater</td>
@@ -180,7 +180,7 @@
<td>Light</td>
<td>chiiph, Erinn, nickm</td>
</tr>
-
+
<tr>
<td>*<a href="#project-ooni-probe">Ooni Probe</a></td>
<td>Scanner</td>
@@ -188,7 +188,7 @@
<td>Moderate</td>
<td>hellais, ioerror</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-shadow">Shadow</a></td>
<td>Experimentation</td>
@@ -196,7 +196,7 @@
<td>Moderate</td>
<td>robgjansen</td>
</tr>
-
+
<tr>
<td><a href="#project-torctl">TorCtl</a></td>
<td>Library</td>
@@ -204,7 +204,7 @@
<td>Light</td>
<td>mikeperry</td>
</tr>
-
+
<tr class="alt">
<td>*<a href="#project-stem">Stem</a></td>
<td>Library</td>
@@ -212,7 +212,7 @@
<td>Heavy</td>
<td>atagar</td>
</tr>
-
+
<tr>
<td><a href="#project-metrics">Metrics</a></td>
<td>Client Service</td>
@@ -220,7 +220,7 @@
<td>Heavy</td>
<td>karsten</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-atlas">Atlas</a></td>
<td>Client Service</td>
@@ -228,7 +228,7 @@
<td>Moderate</td>
<td>hellais</td>
</tr>
-
+
<tr>
<td><a href="#project-torstatus">TorStatus</a></td>
<td>Client Service</td>
@@ -236,7 +236,7 @@
<td>None</td>
<td></td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-weather">Weather</a></td>
<td>Client Service</td>
@@ -244,7 +244,7 @@
<td>None</td>
<td>kaner</td>
</tr>
-
+
<tr>
<td><a href="#project-gettor">GetTor</a></td>
<td>Client Service</td>
@@ -252,7 +252,7 @@
<td>None</td>
<td>kaner</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-torcheck">TorCheck</a></td>
<td>Client Service</td>
@@ -260,7 +260,7 @@
<td>None</td>
<td></td>
</tr>
-
+
<tr>
<td><a href="#project-onionoo">Onionoo</a></td>
<td>Backend Service</td>
@@ -268,7 +268,7 @@
<td>Moderate</td>
<td>karsten</td>
</tr>
-
+
<tr class="alt">
<td><a href="#project-bridgedb">BridgeDB</a></td>
<td>Backend Service</td>
@@ -276,7 +276,7 @@
<td>None</td>
<td>kaner, nickm</td>
</tr>
-
+
<tr>
<td><a href="#project-torflow">TorFlow</a></td>
<td>Backend Service</td>
@@ -284,7 +284,7 @@
<td>Moderate</td>
<td>mikeperry</td>
</tr>
-
+
<tr class="alt">
<td>*<a href="#project-torbel">TorBEL</a></td>
<td>Backend Service</td>
@@ -293,24 +293,24 @@
<td>Sebastian</td>
</tr>
</table>
-
+
<sub>
* Project is still in an alpha state.
</sub>
-
+
<br /><br />
-
+
<a id="project-tor"></a>
<h3>Tor (<a href="https://gitweb.torproject.org/tor.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Central project, providing the core software for using and participating in
the Tor network. Numerous people contribute to the project to varying
extents, but the chief architects are Nick Mathewson and Roger Dingledine.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#resistCensorship">Improving Tor's ability to resist
@@ -318,43 +318,43 @@
<i><a href="#user-space-transport">Integrating Tor with user-space
transport protocol libraries</a></i>
</p>
-
+
<a id="project-jtor"></a>
<h3><a href="https://github.com/brl/JTor/wiki">JTor</a> (<a
href="https://github.com/brl/JTor">code</a>, <a
href="https://github.com/brl/JTor/issues">bug
tracker</a>)</h3>
-
+
<p>
Java implementation of Tor and successor to <a
href="http://onioncoffee.sourceforge.net/">OnionCoffee</a>. This project
isn't yet complete, and has been inactive since Fall 2010.
</p>
-
+
<a id="project-tbb"></a>
<h3><a href="<page projects/torbrowser>">Tor Browser Bundle</a> (<a
href="https://gitweb.torproject.org/torbrowser.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
The Tor Browser Bundle is an easy-to-use portable package of Tor, Vidalia,
and Firefox preconfigured to work together out of the box. This is actively
being worked on by Erinn Clark.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#auditTBB">Audit Tor Browser Bundles for data leaks</a></i><br />
<i><a href="#usabilityTesting">Usability testing of Tor</a></i>
</p>
-
+
<a id="project-tails"></a>
<h3><a href="https://tails.boum.org/">The Amnesic Incognito Live System</a> (<a
href="http://git.immerda.ch/?p=amnesia.git;a=summary">code</a>, <a
href="https://tails.boum.org/bugs/">bug
tracker</a>)</h3>
-
+
<p>
The Amnesic Incognito Live System is a live CD/USB distribution
preconfigured so that everything is safely routed through Tor and leaves no
@@ -362,7 +362,7 @@
href="http://www.anonymityanywhere.com/incognito/">Incognito</a> projects,
and still under very active development.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#tailsHiddenServicePetnames">Petname system for Tor hidden
@@ -370,68 +370,68 @@
<i><a href="#tailsServer">Tails server: Self-hosted services behind
Tails-powered Tor hidden services</a></i>
</p>
-
+
<a id="project-torsocks"></a>
<h3><a href="http://code.google.com/p/torsocks/">Torsocks</a> (<a
href="https://gitweb.torproject.org/torsocks.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Utility for adapting other applications to work with Tor. Development has
slowed and compatibility issues remain with some platforms, but it's
otherwise feature complete.
</p>
-
+
<!--
<p>
<b>Project Ideas:</b><br />
<i><a href="#torsocksForOSX">Make torsocks/dsocks work on OS X</a></i>
</p>
-->
-
+
<a id="project-torouter"></a>
<h3><a
href="<wiki>doc/Torouter">Torouter</a> (<a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Project to provide an easy-to-use, embedded Tor instance for routers. This
had high activity in late 2010, but has since been rather quiet.
</p>
-
+
<a id="project-vidalia"></a>
<h3><a href="<page projects/vidalia>">Vidalia</a> (<a
href="https://gitweb.torproject.org/vidalia.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
The most commonly used user interface for Tor. Matt Edman started the
project in 2006 and brought it to its current stable state. Development
slowed for several years, though Tomás Touceda has since taken a lead with
pushing the project forward.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#vidaliaStatusEventInterface">Tor Controller Status Event Interface for Vidalia</a></i><br />
<i><a href="#vidalia-hidden-service-panel">Torrc plugin and improved hidden service configuration panel</a></i>
</p>
-
+
<a id="project-arm"></a>
<h3><a href="http://www.atagar.com/arm/">Arm</a> (<a
href="https://gitweb.torproject.org/arm.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Command-line monitor for Tor. This has been under very active development
by its author, Damian Johnson, since early 2009 to make it a better
general-purpose controller for *nix environments.
</p>
-
+
<!--
<p>
<b>Project Ideas:</b><br />
@@ -439,18 +439,18 @@
<i><a href="#armGui">GUI for Arm</a></i>
</p>
-->
-
+
<a id="project-orbot"></a>
<h3><a href="https://guardianproject.info/apps/orbot/">Orbot</a> (<a
href="https://gitweb.torproject.org/orbot.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Provides Tor on the Android platform. This was under very active
development up through Fall 2010, after which things have been quiet.
</p>
-
+
<!--
<p>
<b>Project Ideas:</b><br />
@@ -459,13 +459,13 @@
<i><a href="#orbot-optimisation">Core Tor mobile optimisation</a></i>
</p>
-->
-
+
<a id="project-torbutton"></a>
<h3><a href="<page torbutton/index>">Torbutton</a> (<a
href="https://gitweb.torproject.org/torbutton.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Firefox addon that addresses many of the client-side threats to browsing
the Internet anonymously. Mike has since continued to adapt it to new
@@ -473,90 +473,90 @@
href="https://blog.torproject.org/blog/google-chrome-incognito-mode-tor-and-finge…">Chrome
as well</a>.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#torbuttonForThunderbird">Torbutton equivalent for Thunderbird</a></i>
</p>
-
+
<a id="project-obfsproxy"></a>
<h3><a href="https://gitweb.torproject.org/obfsproxy.git/tree/HEAD:/doc">Obfsproxy</a> (<a
href="https://gitweb.torproject.org/obfsproxy.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
A proxy that shapes Tor traffic, making it harder for censors to detect and
block Tor.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#obfsproxy-new-transports">New and innovative pluggable transports</a></i><br />
<i><a href="#obfsproxy-scanning-measures">Defensive bridge active scanning measures</a></i><br />
<i><a href="#obfsproxy-fuzzer">Fuzzer for the Tor protocol</a></i>
</p>
-
+
<a id="project-thandy"></a>
<h3>Thandy (<a
href="https://gitweb.torproject.org/thandy.git">code</a>)</h3>
-
+
<p>
Updater for Tor. The project began in the Summer of 2008 but wasn't
completed. Recently interest in it has been rekindled and many aspects of
its design (including the language it'll be in) are currently in flux.
</p>
-
+
<a id="project-ooni-probe"></a>
<h3>Ooni Probe (<a
href="https://gitweb.torproject.org/ooni-probe.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Censorship scanner, checking your local connection for blocked or modified
content.
</p>
-
+
<a id="project-shadow"></a>
<h3><a href="https://shadow.cs.umn.edu/">Shadow</a> (<a
href="https://github.com/shadow">code</a>, <a
href="https://github.com/shadow/shadow/issues">bug
tracker</a>)</h3>
-
+
<p>
Shadow is a discrete-event network simulator that runs the real
Tor software as a plug-in. Shadow is open-source software that enables
accurate, efficient, controlled, and repeatable Tor experimentation.
</p>
-
+
<a id="project-torctl"></a>
<h3>TorCtl (<a
href="https://gitweb.torproject.org/pytorctl.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Python bindings and utilities for using the Tor control port. It has been
stable for several years, with only minor revisions.
</p>
-
+
<a id="project-stem"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Stem</a> (<a
href="https://gitweb.torproject.org/stem.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Python controller library with a similar scope to TorCtl, but with better
testing, documentation, and API. This project is not yet feature complete.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#stemPathsupport">Stem PathSupport Capabilities</a></i>
</p>
-
+
<a id="project-metrics"></a>
<h3><a href="https://metrics.torproject.org/">Metrics</a> (code: <a
href="https://gitweb.torproject.org/metrics-db.git">db</a>, <a
@@ -564,32 +564,32 @@
href="https://gitweb.torproject.org/metrics-web.git">web</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Processing and analytics of consensus data, provided to users via the
metrics portal. This has been under active development for several years by
Karsten Loesing.
</p>
-
+
<p>
<b>Project Ideas:</b><br />
<i><a href="#metricsSearch">Searchable Tor descriptor and Metrics data archive</a></i> (Python/Django?)
</p>
-
+
<a id="project-atlas"></a>
<h3><a href="https://atlas.torproject.org/">Atlas</a> (<a
href="https://gitweb.torproject.org/atlas.git">code</a>)</h3>
-
+
<p>
Atlas is a web application to discover Tor relays and bridges. It provides
useful information on how relays are configured along with graphics about
their past usage. This is the third evolution of the TorStatus application.
</p>
-
+
<a id="project-torstatus"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/TorStatus">TorStatus</a> (<a
href="https://gitweb.torproject.org/torstatus.git">code</a>)</h3>
-
+
<p>
Portal providing an overview of the Tor network, and details on any of its
current relays. Though very actively used, this project has been
@@ -598,68 +598,68 @@
codebase</a> was written in PHP, and students from Wesleyan wrote the new
Django counterpart.
</p>
-
+
<a id="project-weather"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/Weather">Weather</a> (<a
href="https://gitweb.torproject.org/weather.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Provides automatic notification to subscribed relay operators when their
relay's unreachable. This underwent a rewrite by the <a
href="http://hfoss.wesleyan.edu/">Wesleyan HFOSS team</a>, which went live
in early 2011.
</p>
-
+
<a id="project-gettor"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/GetTor">GetTor</a> (<a
href="https://gitweb.torproject.org/gettor.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
E-mail autoresponder providing Tor's packages over SMTP. This has been
relatively unchanged for quite a while.
</p>
-
+
<a id="project-torcheck"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/TorCheck">TorCheck</a> (<a
href="https://svn.torproject.org/svn/check/trunk/">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Provides a simple site for determining if the visitor is using Tor or not.
This has been relatively unchanged for quite a while.
</p>
-
+
<a id="project-onionoo"></a>
<h3><a href="<page projects/onionoo>">Onionoo</a> (<a
href="https://gitweb.torproject.org/onionoo.git">code</a>)</h3>
-
+
<p>
Onionoo is a JSON based protocol to learn information about currently
running Tor relays and bridges.
</p>
-
+
<a id="project-bridgedb"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/BridgeDB">BridgeDB</a> (<a
href="https://gitweb.torproject.org/bridgedb.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Backend bridge distributor, handling the various pools they're distributed
in. This was actively developed until Fall of 2010.
</p>
-
+
<a id="project-torflow"></a>
<h3><a href="https://trac.torproject.org/projects/tor/wiki/org/roadmaps/TorFlow">TorFlow</a> (<a
href="https://gitweb.torproject.org/torflow.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
Library and collection of services for actively monitoring the Tor network.
These include the Bandwidth Scanners (measuring throughput of relays) and
@@ -668,14 +668,14 @@
months later. Both have been under active use since then, but development
has stopped.
</p>
-
+
<a id="project-torbel"></a>
<h3><a
href="https://blog.torproject.org/blog/torbel-tor-bulk-exit-list-tools">TorBEL</a> (<a
href="https://gitweb.torproject.org/torbel.git">code</a>, <a
href="https://trac.torproject.org/projects/tor/query?status=accepted&status=assig…">bug
tracker</a>)</h3>
-
+
<p>
The Tor Bulk Exitlist provides a method of identifying if IPs belong to
exit nodes or not. This is a replacement for TorDNSEL which is a stable
@@ -683,11 +683,11 @@
version of TorBEL was started in GSOC 2010 but since then the project has
been inactive.
</p>
-
+
<a id="Coding"></a>
<a id="Summer"></a>
<h2><a class="anchor" href="#Coding">Project Ideas</a></h2>
-
+
<p>
You may find some of these projects to be good <a href="<page
about/gsoc>">Google Summer of Code</a> ideas. We have labelled each idea
@@ -700,9 +700,9 @@
sending blind applications. You may also want to propose your own project
idea — which often results in the best applications.
</p>
-
+
<ol>
-
+
<a id="auditTBB"></a>
<li>
<b>Audit Tor Browser Bundles for data leaks</b>
@@ -727,7 +727,7 @@
application development on one or preferably all of Windows, Linux,
and Mac OS X, and be comfortable with C/C++ and shell scripting.</p>
</li>
-
+
<a id="firewallProbeTool"></a>
<li>
<b>Develop a fully automatic firewall-probing system</b>
@@ -757,7 +757,7 @@
DTLS, etc.).</li>
</ul>
</li>
-
+
<!--
<a id="orbot-torbutton"></a>
<li>
@@ -780,7 +780,7 @@
on this so far.</p>
</li>
-->
-
+
<a id="obfsproxy-new-transports"></a>
<li>
<b>New and innovative pluggable transports</b>
@@ -796,18 +796,18 @@
interesting. Other ideas like bittorrent transports might be relevant,
but you will have to provide security proofs on why they are harder to
detect and block than other less-sophisticated transports.</p>
-
+
<p>The whole point of this project, though, is to come up with new
transports that we haven't already thought of. Be creative.</p>
-
+
<p>Bonus points if your idea is interesting and still implementable
through the summer period.</p>
-
+
<p>More bonus points if it's implemented on top of obfsproxy, or if your
implementation has a pluggable transport interface on top of it (as
specified <a href="https://gitweb.torproject.org/torspec.git/blob/HEAD:/proposals/180-pluggabl…">here</a>).</p>
</li>
-
+
<a id="obfsproxy-scanning-measures"></a>
<li>
<b>Defensive bridge active scanning measures</b>
@@ -822,13 +822,13 @@
<p>Involves providing good answers to <a
href="https://lists.torproject.org/pipermail/tor-dev/2011-November/003073.html">this
thread</a> as well as concrete implementation plans for it.</p>
-
+
<p>This also involves implementing proposals <a
href="https://gitweb.torproject.org/torspec.git/blob/HEAD:/proposals/189-authoriz…">189</a>
and <a
href="https://gitweb.torproject.org/torspec.git/blob/HEAD:/proposals/190-shared-s…">190</a>.</p>
</li>
-
+
<a id="stemPathsupport"></a>
<li>
<b>Stem PathSupport Capabilities</b>
@@ -848,26 +848,26 @@
protocol</a> to help developers program against the tor process, enabling
them to build things similar to <a href="#project-vidalia">Vidalia</a> and
<a href="#project-arm">arm</a>.</p>
-
+
<p>While TorCtl provided a fine first draft for this sort of functionality,
it has not proved to be extensible nor maintainable. Stem is a rewrite of
TorCtl with a heavy focus on testing, documentation, and providing a
developer friendly API.</p>
-
+
<p>At the moment stem is still very much incomplete, missing several pieces
of functionality that TorCtl provides. This is a project to fix that by
porting TorCtl's <a
href="https://gitweb.torproject.org/pytorctl.git/blob/HEAD:/PathSupport.py">PathSupport
module</a> to stem, writing tests for it, and migrate a couple clients to
use it.</p>
-
+
<p>PathSupport provides applications with programmatic control over how
tor's circuits are built, for instance letting you exit from particular
relays. This is used by projects like <a href="#project-torbel">TorBEL</a>,
<a href="#project-torflow">the Bandwidth Scanners, and SoaT</a>.</p>
-
+
<p>This project can be broken into three parts...</p>
-
+
<ol style="list-style-type: decimal">
<li><p>Look at PathSupport's clients to figure out how it is used and
come up with the API that we will use for stem. Note that the goal if
@@ -885,7 +885,7 @@
API as we discover issues. A particularly good client to start with would
be TorBEL.</p></li>
</ol>
-
+
<!--
<a id="orbot-userInterface"></a>
<li>
@@ -913,7 +913,7 @@
Tablet.</p>
</li>
-->
-
+
<a id="user-space-transport"></a>
<li>
<b>Integrating Tor with user-space transport protocol libraries</b>
@@ -942,7 +942,7 @@
<p>Excellent C programming skills are needed, and knowledge of Tor
internals are highly desirable.</p>
</li>
-
+
<a id="resistCensorship"></a>
<li>
<b>Improving Tor's ability to resist censorship</b>
@@ -983,7 +983,7 @@
then trading off censorship resistance with usability and
robustness.</p>
</li>
-
+
<a id="tailsHiddenServicePetnames"></a>
<li>
<b>Petname system for Tor hidden services</b>
@@ -1026,7 +1026,7 @@
Development methods. Either in Ruby using Cucumber and RSpec, or in
Python using similar tools.</p>
</li>
-
+
<a id="tailsServer"></a>
<li>
<b>Tails server: Self-hosted services behind Tails-powered Tor hidden services</b>
@@ -1061,7 +1061,7 @@
amnesia property and limited support for persistent encrypted data
allows to protect content, to a great degree, even in such contexts.</p>
<p>In short, setting up a new Tails server would be done by:</p>
-
+
<ol style="list-style-type: decimal">
<li>Alice plugs a USB stick into a running desktop Tails system.</li>
<li>Alice uses a GUI to easily configure the needed services.</li>
@@ -1077,12 +1077,12 @@
services</b> project would be very complementary to this one, by the
way.)</li>
</ol>
-
+
<p>Tails server should content itself with hardware that is a bit old
(such as a PIII-450 laptop with 256MB of RAM) and/or half broken (e.g.
non-functional hard-disk, screen or keyboard).</p>
<p>The challenges behind this project are:</p>
-
+
<ul>
<li>Design and write the services configuration GUI [keywords: edit
configuration files, upgrade between major Debian versions,
@@ -1095,7 +1095,7 @@
encryption passphrase without X, and possibly with a broken keyboard
and/or screen [keywords: local network, SSL/TLS?, certificate?].</li>
</ul>
-
+
<p>This project can easily grow quite large, so the first task would
probably be to clarify what it would need to get an initial (minimal
but working) implementation ready to be shipped to users.</p>
@@ -1113,7 +1113,7 @@
would be most welcome.</p>
<p>For more information see https://tails.boum.org/todo/server_edition/</p>
</li>
-
+
<a id="geoIPUpgrade"></a>
<li>
<b>Improve our GeoIP file format</b>
@@ -1138,7 +1138,7 @@
designing the IPv6 format, this is not likely to be a good GSoC
project.</p>
</li>
-
+
<!--
<a id="armClientMode"></a>
<li>
@@ -1158,10 +1158,10 @@
operators. However, this doesn't need to be the case. This project would be
to expand and simplify arm to make it useful for Tor's client users
too.</p>
-
+
<p>This would include UI design, experimenting, and a lot of python
hacking. Here's some ideas for client functionality arm could provide:</p>
-
+
<ul>
<li>A panel for client connections, showing each hop of the user's
circuits with the ISP, country, and jurisdiction where those relays
@@ -1171,35 +1171,35 @@
information can be fetched safely (for instance, scraping rdns and whois
lookups could give hints about a relay's ISP, but we'd need to do it on
all Tor relays to avoid leaking our connections to the resolver).</li>
-
+
<li>Options to let the user request new circuits (the "New
Identity" feature in Vidalia), select the exit country, etc.</li>
-
+
<li>A panel showing Internet application and if their connections are
being routed through Tor or not (giving a warning if there's leaks).</li>
-
+
<li>The status of the bridges we're configured to use (ie, are they up?).
This would include adding control port functionality to Tor for <a
href="https://trac.torproject.org/projects/tor/ticket/2068">ticket
2068</a>.</li>
-
+
<li>A one click option to set Tor to be a client, relay, or bridge. The
goal would be to make it trivial for users to voluntarily contribute to
the Tor network.</li>
-
+
<li>Menus as an alternative to hotkeys to make the interface more
intuitive and usable for beginners (<a
href="http://gnosis.cx/publish/programming/charming_python_6.html">example</a>).</li>
-
+
<li>Look at Vidalia and TorK for ideas and solicit input from the Tor community.</li>
</ul>
-
+
<p>
More information is available in the following sections of arm's dev notes: <a href="https://trac.torproject.org/projects/tor/wiki/doc/arm#ConnectionListingExpa…">Connection Listing Expansion</a>, <a href="https://trac.torproject.org/projects/tor/wiki/doc/arm#CircuitDetails">Circuit Details</a>, and <a href="https://trac.torproject.org/projects/tor/wiki/doc/arm#ClientModeUseCases">Client Mode Use Cases</a>
</p>
</li>
-->
-
+
<a id="vidalia-hidden-service-panel"></a>
<li>
<b>Torrc plugin and improved hidden service configuration panel</b>
@@ -1215,18 +1215,18 @@
every Tor option is saved in the torrc file. With that change, the
Hidden Service configuration panel was removed due to its specificity
and its multiple bugs.</p>
-
+
<p>The idea would be to provide the new Torrc class' functionality to the
Plugin Engine and with that, create a better Hidden Service
configuration panel as a plugin.</p>
-
+
<p>A person undertaking this project should have good UI design, layout
skills and some C++ development experience. Previous experience with Qt
and Qt's Designer will be very helpful, but are not required. Javascript
knowledge is a plus, but it shouldn't be a problem if the person
complies with the previous requirements.</p>
</li>
-
+
<a id="metricsSearch"></a>
<li>
<b>Searchable Tor descriptor and Metrics data archive</b>
@@ -1239,13 +1239,13 @@
<br>
Likely Mentors: <i>Karsten</i>
<p>The <a href="https://metrics.torproject.org/data.html">Metrics data archive</a> of Tor relay descriptors and other Tor-related network data has grown to over 100G in size, bz2-compressed. We have developed two search interfaces: the <a href="https://metrics.torproject.org/relay-search.html">relay search</a> finds relays by nickname, fingerprint, or IP address in a given month; <a href="https://metrics.torproject.org/exonerator-beta.html">ExoneraTor</a> finds whether a given IP address was a relay on a given day.</p>
-
+
<p>We'd like to have a more general search application for Tor descriptors and metrics data. There are more <a href="https://metrics.torproject.org/formats.html">descriptor types</a> that we'd like to include in the search. The search application should handle most of them and understand some semantics like what's a timestamp, what's an IP address, and what's a link to another descriptor. Users should then be able to search for arbitrary strings or limit their search to given time periods or IP address ranges. Descriptors that reference other descriptors should contain links, and descriptors should be able to say from where they are linked. The goal is to make the archive easily browsable.</p>
-
+
<p>The search application shall be separate from the metrics website and shouldn't rely on the metrics website codebase. The search application will contain hourly updated descriptor data from the metrics website via rsync. Programming language and database system are not specified yet, though there's a slight preference for Python/Django and Postgres for maintenance reasons. If there are good reasons to pick something else, e.g, some NoSQL variant or some search application framework, that's fine, too. Further requirements are that lookups should be really fast and that changes to the search application can be implemented in reasonable time.</p>
-
+
<p>Applications for this project should come with a design of the proposed search application, ideally with a proof-of-concept based on a subset of the available data to show that it will be able to handle the 100G+ of data.</p>
-
+
<!--
<a id="unitTesting"></a>
<li>
@@ -1274,7 +1274,7 @@
changes in performance on machines in different roles automatically.</p>
</li>
-->
-
+
<!--
<a id="simulateSlowConnections"></a>
<li>
@@ -1294,7 +1294,7 @@
difficult to improve the situation without being able to repeat the
problems in the lab.
</p>
-
+
<p>
This project would be to build a simulation environment which
replicates the poor connectivity so that the effect on Tor performance
@@ -1302,7 +1302,7 @@
establish what are the properties of connections available, and to
measure the effect of performance-improving modifications to Tor.
</p>
-
+
<p>
The tools used would be up to the student, but dummynet (for FreeBSD)
and nistnet (for Linux) are two potential components on which this
@@ -1312,7 +1312,7 @@
</p>
</li>
-->
-
+
<a id="torbuttonForThunderbird"></a>
<li>
<b>Torbutton equivalent for Thunderbird</b>
@@ -1332,7 +1332,7 @@
push to build a Thunderbird extension similar to Torbutton.
</p>
</li>
-
+
<a id="usabilityTesting"></a>
<li>
<b>Usability testing of Tor</b>
@@ -1350,13 +1350,13 @@
fixes or new features. We get this informally at the moment, but a more
structured process would be better.
</p>
-
+
<p>
Please note that since this isn't a coding project, it isn't suitable for
Google Summer of Code.
</p>
</li>
-
+
<!--
<a id="torsocksForOSX"></a>
<li>
@@ -1389,7 +1389,7 @@
</p>
</li>
-->
-
+
<a id="vidaliaStatusEventInterface"></a>
<li>
<b>Tor Controller Status Event Interface for Vidalia</b>
@@ -1430,7 +1430,7 @@
be understandable by non-technical users. Bonus points for some graphic
design/Photoshop fu, since we might want/need some shiny new icons too.</p>
</li>
-
+
<!--
<a id="orbot-optimisation"></a>
<li>
@@ -1451,7 +1451,7 @@
available (such as wireless network status) that could be taken
advantage of.
</p>
-
+
<p>
It should be noted, that even without optimisation, Tor is handling the
mobile network environment very well, automatically detecting change in
@@ -1461,13 +1461,13 @@
experience, and not any detailed study of what exactly is happening, and
what threats might exist because of this constantly changing network state.
</p>
-
+
<p>
Finally, the build process needs to be moved to the Android NDK from the
custom GCC toolchain we are now using, and compatibility with Android
2.3 and 3.x Honeycomb OS need to be verified.
</p>
-
+
<p>
For more information see the <a
href="https://svn.torproject.org/svn/projects/android/trunk/Orbot/BUILD">Orbot
@@ -1475,7 +1475,7 @@
</p>
</li>
-->
-
+
<!--
<a id="orbot-orlibAndOutreach"></a>
<li>
@@ -1502,7 +1502,7 @@
</p>
</li>
-->
-
+
<!--
<a id="vidaliaNetworkMap"></a>
<li>
@@ -1528,7 +1528,7 @@
more Tor exit relays and say, "I want my connections to exit
from here."
</p>
-
+
<p>
This project will first involve getting familiar with Vidalia
and the Marble widget's API. One will then integrate the widget
@@ -1536,7 +1536,7 @@
such as making circuits clickable, storing cached map data in Vidalia's
own data directory, and customizing some of the widget's dialogs.
</p>
-
+
<p>
A person undertaking this project should have good C++ development
experience. Previous experience with Qt and CMake is helpful, but not
@@ -1544,7 +1544,7 @@
</p>
</li>
-->
-
+
<a id="obfsproxy-fuzzer"></a>
<li>
<b>Fuzzer for the Tor protocol</b>
@@ -1558,12 +1558,12 @@
Likely Mentors: <i>asn</i>
<p>Involves researching good and smart ways to fuzz stateful network
protocols, and also implementing the fuzzer.</p>
-
+
<p>We are mostly looking for a fuzzer that fuzzes the Tor protocol
itself, and not the Tor directory protocol.</p>
-
+
<p>Bonus points if it's extremely modular. Relevant research:</p>
-
+
<ul>
<li>PROTOS - Security Testing of Protocol Implementations</li>
<li>INTERSTATE: A Stateful Protocol Fuzzer for SIP</li>
@@ -1575,7 +1575,7 @@
"symbolic execution" to get inspired.</li>
</ul>
</li>
-
+
<!--
<a id="armGui"></a>
<li>
@@ -1597,7 +1597,7 @@
users. This project would be to build a GTK or Qt frontend for the
controller, providing similar features set but with a windowed interface.
</p>
-
+
<p>
The vast majority of arm's more interesting functionality lies in its
backend <a href="https://gitweb.torproject.org/arm.git/tree/HEAD:/src/util">utilities</a>, so
@@ -1608,7 +1608,7 @@
</p>
</li>
-->
-
+
<a id="APAF"></a>
<li>
<b>APAF: Anonymous Python Application Framework</b>
@@ -1621,24 +1621,25 @@
<br>
Likely Mentors: <i>Arturo (hellais)</i>
<p>
- The goal of APAF is to create a build framework for creating a binary package for multiple
- platforms (.app/dmg, .exe, .deb, etc.) that includes the python interpreter (cpython), the Tor
- binary and all the UI necessary to make users be able to easily run the bundled Tor Hidden
- Service.
+ The goal of APAF is to create a build framework for creating a binary
+ package for multiple platforms (.app/dmg, .exe, .deb, etc.) that includes
+ the python interpreter (cpython), the Tor binary and all the UI necessary
+ to make users be able to easily run the bundled Tor Hidden Service.
</p>
-
+
<p>
- For GSoC the student is expected to create the build system capable of building a simple
- web application that serves static files. It should also include a web UI for a wizard setup,
- checking the status of the HS and configuring it.
+ For GSoC the student is expected to create the build system capable of
+ building a simple web application that serves static files. It should also
+ include a web UI for a wizard setup, checking the status of the HS and
+ configuring it.
</p>
-
+
<p>
- For more details on this: check out <a href="https://pad.riseup.net/p/1zA8FI4nrYlq">https://pad.riseup.net/p/1zA8FI4nrYlq</a>
+ For more details on this: check out <a
+ href="https://pad.riseup.net/p/1zA8FI4nrYlq">https://pad.riseup.net/p/1zA8FI4nrYlq</a>
</p>
</li>
-
-
+
<li>
<b>Bring up new ideas!</b>
<br>
@@ -1649,9 +1650,9 @@
Some of the <a href="<spectree>proposals">current proposals</a>
might also be short on developers.
</li>
-
+
</ol>
-
+
<a id="OtherCoding"></a>
<h2><a class="anchor" href="#OtherCoding">Other Coding and Design related ideas</a></h2>
<ol>
@@ -1667,13 +1668,13 @@
the new libevent interface. Christian King made a
<a href="https://svn.torproject.org/svn/libevent-urz/trunk/">good
start</a> on this in the summer of 2007.</li>
-
+
<li>We need to actually start building our <a href="<page
docs/documentation>#DesignDoc">blocking-resistance design</a>. This involves
fleshing out the design, modifying many different pieces of Tor, adapting
<a href="<page projects/vidalia>">Vidalia</a> so it supports the
new features, and planning for deployment.</li>
-
+
<li>We need a flexible simulator framework for studying end-to-end
traffic confirmation attacks. Many researchers have whipped up ad hoc
simulators to support their intuition either that the attacks work
@@ -1683,18 +1684,18 @@
See the entry <a href="#Research">below</a> on confirmation attacks for
details on the research side of this task — who knows, when it's
done maybe you can help write a paper or three also.</li>
-
+
<li>Tor 0.1.1.x and later include support for hardware crypto
accelerators via OpenSSL. It has been lightly tested and is
possibly very buggy. We're looking for more rigorous testing,
performance analysis, and optimally, code fixes to OpenSSL and
Tor if needed.</li>
-
+
<li>Perform a security analysis of Tor with <a
href="https://secure.wikimedia.org/wikipedia/en/wiki/Fuzz_testing">"fuzz"</a>. Determine
if there are good fuzzing libraries out there for what we want. Win fame by
getting credit when we put out a new release because of you!</li>
-
+
<li>Tor uses TCP for transport and TLS for link
encryption. This is nice and simple, but it means all cells
on a link are delayed when a single packet gets dropped, and
@@ -1705,24 +1706,24 @@
href="<specblob>proposals/100-tor-spec-udp.txt">specification
for Tor and
UDP</a> — please let us know what's wrong with it.</li>
-
+
<li>We're not that far from having IPv6 support for destination addresses
(at exit nodes). If you care strongly about IPv6, that's probably the
first place to start.</li>
-
+
<li>We need a way to generate the website diagrams (for example, the "How
Tor Works" pictures on the <a href="<page about/overview>">overview page</a>
from source, so we can translate them as UTF-8 text rather than edit
them by hand with Gimp. We might want to
integrate this as an wml file so translations are easy and images are
generated in multiple languages whenever we build the website.</li>
-
+
<li>How can we make the various LiveCD/USB systems easier
to maintain, improve, and document? One example is <a
href="https://tails.boum.org/">The Amnesic Incognito Live
System</a>.
</li>
-
+
<li>
Another anti-censorship project is to try to make Tor
more scanning-resistant. Right now, an adversary can identify <a
@@ -1735,9 +1736,9 @@
To start, check out Shane Pope's <a
href="http://dl.dropbox.com/u/37735/index.html">thesis and prototype</a>.
</li>
-
+
</ol>
-
+
<a id="Research"></a>
<h2><a class="anchor" href="#Research">Research</a></h2>
<ol>
@@ -1861,7 +1862,7 @@
connected?
</li>
</ol>
-
+
<p>
<a href="<page about/contact>">Let us know</a> if you've made progress on any
of these!
@@ -1875,4 +1876,4 @@
<!-- END SIDECOL -->
</div>
<!-- END CONTENT -->
-#include <foot.wmi>
+#include <foot.wmi>
1
0
commit e94eac878b9c38462e48c454628bc939067084b8
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Mar 20 13:25:39 2012 +0100
Fix warnings found by Eclipse.
---
.../ernie/cron/BridgeStatsFileHandler.java | 3 ---
.../ernie/cron/ConsensusStatsFileHandler.java | 6 ------
.../ernie/cron/ExoneraTorDatabaseImporter.java | 2 +-
.../ernie/cron/RelayDescriptorParser.java | 11 +++--------
src/org/torproject/ernie/web/ConsensusServlet.java | 2 ++
src/org/torproject/ernie/web/CsvServlet.java | 2 ++
.../torproject/ernie/web/DescriptorServlet.java | 2 ++
.../ernie/web/ErnieGeneratedFileServlet.java | 2 ++
.../torproject/ernie/web/ExoneraTorServlet.java | 5 ++---
.../ernie/web/ExtraInfoDescriptorServlet.java | 2 ++
src/org/torproject/ernie/web/GraphDataServlet.java | 12 ++++--------
.../torproject/ernie/web/GraphImageServlet.java | 2 ++
src/org/torproject/ernie/web/GraphsServlet.java | 3 +++
.../ernie/web/GraphsSubpagesServlet.java | 2 ++
src/org/torproject/ernie/web/IndexServlet.java | 3 +++
.../torproject/ernie/web/NetworkStatusServlet.java | 2 ++
src/org/torproject/ernie/web/RObjectGenerator.java | 6 ------
.../torproject/ernie/web/RelaySearchServlet.java | 3 ++-
src/org/torproject/ernie/web/RelayServlet.java | 2 ++
.../torproject/ernie/web/ResearchDataServlet.java | 2 ++
.../ernie/web/ResearchFormatsServlet.java | 3 +++
.../ernie/web/ResearchPapersServlet.java | 3 +++
src/org/torproject/ernie/web/ResearchServlet.java | 3 +++
.../torproject/ernie/web/ResearchToolsServlet.java | 3 +++
.../torproject/ernie/web/RouterDetailServlet.java | 2 ++
.../ernie/web/ServerDescriptorServlet.java | 2 ++
src/org/torproject/ernie/web/StatusServlet.java | 3 +++
.../ernie/web/TableParameterChecker.java | 5 -----
src/org/torproject/ernie/web/VotesServlet.java | 2 ++
29 files changed, 59 insertions(+), 41 deletions(-)
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 2f6ac8d..26fd0e6 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -369,8 +369,6 @@ public class BridgeStatsFileHandler {
String longKey = e.getKey();
String[] parts = longKey.split(",");
String hashedBridgeIdentity = parts[0];
- String date = parts[1];
- String time = parts[2];
if (!this.hashedRelays.contains(hashedBridgeIdentity) &&
!this.zeroTwoTwoDescriptors.contains(longKey)) {
Map<String, String> obs = e.getValue();
@@ -400,7 +398,6 @@ public class BridgeStatsFileHandler {
String[] parts = longKey.split(",");
String hashedBridgeIdentity = parts[0];
String date = parts[1];
- String time = parts[2];
if (!this.hashedRelays.contains(hashedBridgeIdentity) &&
!this.zeroTwoTwoDescriptors.contains(longKey)) {
double[] users = bridgeUsersPerDay.get(date);
diff --git a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
index ebc882b..019478c 100644
--- a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
@@ -149,10 +149,6 @@ public class ConsensusStatsFileHandler {
*/
public void writeFiles() {
- /* Did we learn anything new about average relay or bridge numbers in
- * this run? */
- boolean writeConsensusStats = false;
-
/* Go through raw observations of numbers of running bridges in bridge
* statuses, calculate averages per day, and add these averages to
* final results. */
@@ -175,13 +171,11 @@ public class ConsensusStatsFileHandler {
this.logger.finer("Adding new average bridge numbers: "
+ tempDate + line);
this.bridgesPerDay.put(tempDate, line);
- writeConsensusStats = true;
} else if (!line.equals(this.bridgesPerDay.get(tempDate))) {
this.logger.finer("Replacing existing average bridge "
+ "numbers (" + this.bridgesPerDay.get(tempDate)
+ " with new numbers: " + line);
this.bridgesPerDay.put(tempDate, line);
- writeConsensusStats = true;
}
}
brunning = statuses = 0;
diff --git a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
index 8eb5688..72a0b44 100755
--- a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
@@ -461,7 +461,7 @@ public class ExoneraTorDatabaseImporter {
String exitAddress24 = Hex.encodeHexString(
exitAddress24Bytes);
String scannedTime = parts[2] + " " + parts[3];
- long scannedMillis = -1L, publishedMillis = -1L;
+ long scannedMillis = -1L;
try {
scannedMillis = parseFormat.parse(scannedTime).getTime();
} catch (ParseException e) {
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorParser.java b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
index 2125352..0a6213a 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorParser.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
@@ -136,7 +136,7 @@ public class RelayDescriptorParser {
String validAfterTime = null, nickname = null,
relayIdentity = null, serverDesc = null, version = null,
ports = null;
- String fingerprint = null, dirSource = null, address = null;
+ String dirSource = null, address = null;
long validAfter = -1L, published = -1L, bandwidth = -1L,
orPort = 0L, dirPort = 0L;
SortedSet<String> relayFlags = null;
@@ -150,8 +150,6 @@ public class RelayDescriptorParser {
validAfter = parseFormat.parse(validAfterTime).getTime();
} else if (line.startsWith("dir-source ")) {
dirSource = line.split(" ")[2];
- } else if (line.startsWith("fingerprint ")) {
- fingerprint = line.split(" ")[1];
} else if (line.startsWith("r ")) {
if (isConsensus && relayIdentity != null &&
this.rddi != null) {
@@ -172,7 +170,6 @@ public class RelayDescriptorParser {
+ line + "' in descriptor. Skipping.");
break;
}
- String publishedTime = parts[4] + " " + parts[5];
nickname = parts[1];
relayIdentity = Hex.encodeHexString(
Base64.decodeBase64(parts[2] + "=")).
@@ -234,9 +231,8 @@ public class RelayDescriptorParser {
}
}
} else if (line.startsWith("router ")) {
- String platformLine = null, publishedLine = null,
- bandwidthLine = null, extraInfoDigest = null,
- relayIdentifier = null;
+ String platformLine = null, bandwidthLine = null,
+ extraInfoDigest = null, relayIdentifier = null;
String[] parts = line.split(" ");
String nickname = parts[1];
String address = parts[2];
@@ -294,7 +290,6 @@ public class RelayDescriptorParser {
String statsEnd = null;
long seconds = -1L;
List<String> bandwidthHistory = new ArrayList<String>();
- boolean skip = false;
while ((line = br.readLine()) != null) {
if (line.startsWith("published ")) {
String publishedTime = line.substring("published ".length());
diff --git a/src/org/torproject/ernie/web/ConsensusServlet.java b/src/org/torproject/ernie/web/ConsensusServlet.java
index f5afc92..9ec3106 100644
--- a/src/org/torproject/ernie/web/ConsensusServlet.java
+++ b/src/org/torproject/ernie/web/ConsensusServlet.java
@@ -23,6 +23,8 @@ import javax.sql.DataSource;
public class ConsensusServlet extends HttpServlet {
+ private static final long serialVersionUID = 3147332016303032164L;
+
private DataSource ds;
private Logger logger;
diff --git a/src/org/torproject/ernie/web/CsvServlet.java b/src/org/torproject/ernie/web/CsvServlet.java
index d896247..912ce26 100644
--- a/src/org/torproject/ernie/web/CsvServlet.java
+++ b/src/org/torproject/ernie/web/CsvServlet.java
@@ -17,6 +17,8 @@ import javax.servlet.http.HttpServletResponse;
*/
public class CsvServlet extends HttpServlet {
+ private static final long serialVersionUID = 7501442926823719958L;
+
private RObjectGenerator rObjectGenerator;
/* Available CSV files. */
diff --git a/src/org/torproject/ernie/web/DescriptorServlet.java b/src/org/torproject/ernie/web/DescriptorServlet.java
index 56f8a1d..139a4fb 100644
--- a/src/org/torproject/ernie/web/DescriptorServlet.java
+++ b/src/org/torproject/ernie/web/DescriptorServlet.java
@@ -27,6 +27,8 @@ import org.apache.commons.lang.StringEscapeUtils;
public class DescriptorServlet extends HttpServlet {
+ private static final long serialVersionUID = 7933295702958621380L;
+
private DataSource ds;
private Logger logger;
diff --git a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
index 33fb22e..f625f36 100644
--- a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
+++ b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
@@ -13,6 +13,8 @@ import javax.servlet.http.HttpServletResponse;
public class ErnieGeneratedFileServlet extends HttpServlet {
+ private static final long serialVersionUID = -5230032733057814869L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
diff --git a/src/org/torproject/ernie/web/ExoneraTorServlet.java b/src/org/torproject/ernie/web/ExoneraTorServlet.java
index 3a71d10..41725a3 100644
--- a/src/org/torproject/ernie/web/ExoneraTorServlet.java
+++ b/src/org/torproject/ernie/web/ExoneraTorServlet.java
@@ -11,9 +11,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
@@ -39,6 +37,8 @@ import org.apache.commons.lang.StringEscapeUtils;
public class ExoneraTorServlet extends HttpServlet {
+ private static final long serialVersionUID = 1370088989739567509L;
+
private DataSource ds;
private Logger logger;
@@ -580,7 +580,6 @@ public class ExoneraTorServlet extends HttpServlet {
cs.setDate(2, new java.sql.Date(timestamp));
ResultSet rs = cs.executeQuery();
while (rs.next()) {
- Map<String, String> resultEntry = new HashMap<String, String>();
String address = rs.getString(1);
addressesInSameNetwork.add(address);
}
diff --git a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
index 7d48a12..bfb3432 100644
--- a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
@@ -22,6 +22,8 @@ import javax.sql.DataSource;
public class ExtraInfoDescriptorServlet extends HttpServlet {
+ private static final long serialVersionUID = -177072581949479416L;
+
private DataSource ds;
private Logger logger;
diff --git a/src/org/torproject/ernie/web/GraphDataServlet.java b/src/org/torproject/ernie/web/GraphDataServlet.java
index 590647b..52fab5b 100644
--- a/src/org/torproject/ernie/web/GraphDataServlet.java
+++ b/src/org/torproject/ernie/web/GraphDataServlet.java
@@ -25,6 +25,8 @@ import javax.servlet.http.HttpServletResponse;
*/
public class GraphDataServlet extends HttpServlet {
+ private static final long serialVersionUID = 1799558498301134024L;
+
private RObjectGenerator rObjectGenerator;
/* Available graph data files. */
@@ -197,7 +199,6 @@ public class GraphDataServlet extends HttpServlet {
}
String[] firstDateAndValue = datesAndValues.first().split("=");
String firstDate = firstDateAndValue[0];
- String firstValue = firstDateAndValue[1];
String lastDate = datesAndValues.last().split("=")[0];
sb.append(",\n\"" + graphName + "\":{"
+ "\"first\":\"" + firstDate + "\","
@@ -205,7 +206,8 @@ public class GraphDataServlet extends HttpServlet {
+ "\"values\":[");
int written = 0;
String previousDate = firstDate;
- long previousDateMillis = dateFormat.parse(firstDate).getTime();
+ long previousDateMillis = dateFormat.parse(previousDate).
+ getTime();
for (String dateAndValue : datesAndValues) {
String parts[] = dateAndValue.split("=");
String date = parts[0];
@@ -232,12 +234,6 @@ public class GraphDataServlet extends HttpServlet {
return;
}
- /* Make sure that we have a graph to return. */
- if (jsonString == null) {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
-
/* Write JSON file to response. */
response.setHeader("Access-Control-Allow-Origin", "*");
response.setContentType("application/json");
diff --git a/src/org/torproject/ernie/web/GraphImageServlet.java b/src/org/torproject/ernie/web/GraphImageServlet.java
index 7e8e29c..41bf652 100644
--- a/src/org/torproject/ernie/web/GraphImageServlet.java
+++ b/src/org/torproject/ernie/web/GraphImageServlet.java
@@ -16,6 +16,8 @@ import javax.servlet.http.HttpServletResponse;
*/
public class GraphImageServlet extends HttpServlet {
+ private static final long serialVersionUID = -7356818641689744288L;
+
private RObjectGenerator rObjectGenerator;
public void init() {
diff --git a/src/org/torproject/ernie/web/GraphsServlet.java b/src/org/torproject/ernie/web/GraphsServlet.java
index b4658d8..1d17887 100644
--- a/src/org/torproject/ernie/web/GraphsServlet.java
+++ b/src/org/torproject/ernie/web/GraphsServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GraphsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 7615715032362498151L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
index 4a1056d..80ccf6c 100644
--- a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
+++ b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
@@ -18,6 +18,8 @@ import javax.servlet.http.HttpServletResponse;
public class GraphsSubpagesServlet extends HttpServlet {
+ private static final long serialVersionUID = -5959829347747628403L;
+
/* Available graphs subpages with corresponding JSP to which requests
* are forwarded. */
private Map<String, String> availableGraphsSubpages;
diff --git a/src/org/torproject/ernie/web/IndexServlet.java b/src/org/torproject/ernie/web/IndexServlet.java
index fd0f55d..a7cbba4 100644
--- a/src/org/torproject/ernie/web/IndexServlet.java
+++ b/src/org/torproject/ernie/web/IndexServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IndexServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 7871368999788994664L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/NetworkStatusServlet.java b/src/org/torproject/ernie/web/NetworkStatusServlet.java
index 5c87b39..3e41620 100644
--- a/src/org/torproject/ernie/web/NetworkStatusServlet.java
+++ b/src/org/torproject/ernie/web/NetworkStatusServlet.java
@@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
public class NetworkStatusServlet extends HttpServlet {
+ private static final long serialVersionUID = 1762552983543719111L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index e251974..e66b4b7 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -12,7 +12,6 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
@@ -31,13 +30,8 @@ public class RObjectGenerator implements ServletContextListener {
private String cachedGraphsDirectory;
private long maxCacheAge;
- private Logger logger;
-
public void contextInitialized(ServletContextEvent event) {
- /* Initialize logger. */
- this.logger = Logger.getLogger(RObjectGenerator.class.toString());
-
/* Initialize using context parameters. */
ServletContext servletContext = event.getServletContext();
this.rserveHost = servletContext.getInitParameter("rserveHost");
diff --git a/src/org/torproject/ernie/web/RelaySearchServlet.java b/src/org/torproject/ernie/web/RelaySearchServlet.java
index 208a8d2..61d831e 100644
--- a/src/org/torproject/ernie/web/RelaySearchServlet.java
+++ b/src/org/torproject/ernie/web/RelaySearchServlet.java
@@ -56,6 +56,8 @@ import org.apache.commons.codec.binary.Base64;
*/
public class RelaySearchServlet extends HttpServlet {
+ private static final long serialVersionUID = -1772662230310611805L;
+
private Pattern alphaNumDotDashDollarSpacePattern =
Pattern.compile("[A-Za-z0-9\\.\\-$ ]+");
@@ -425,7 +427,6 @@ public class RelaySearchServlet extends HttpServlet {
String validAfter = rs.getTimestamp(1).toString().
substring(0, 19);
String fingerprint = rs.getString(2);
- String descriptor = rs.getString(3);
if (!foundDescriptors.containsKey(validAfter)) {
foundDescriptors.put(validAfter, new TreeSet<String>());
}
diff --git a/src/org/torproject/ernie/web/RelayServlet.java b/src/org/torproject/ernie/web/RelayServlet.java
index bfbd523..cec8566 100644
--- a/src/org/torproject/ernie/web/RelayServlet.java
+++ b/src/org/torproject/ernie/web/RelayServlet.java
@@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
public class RelayServlet extends HttpServlet {
+ private static final long serialVersionUID = 2375986581752040224L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ResearchDataServlet.java b/src/org/torproject/ernie/web/ResearchDataServlet.java
index deb6b06..1e81bc1 100644
--- a/src/org/torproject/ernie/web/ResearchDataServlet.java
+++ b/src/org/torproject/ernie/web/ResearchDataServlet.java
@@ -30,6 +30,8 @@ import javax.servlet.http.HttpServletResponse;
*/
public class ResearchDataServlet extends HttpServlet {
+ private static final long serialVersionUID = -5168280373350515577L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ResearchFormatsServlet.java b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
index 7ed228c..b7bf7af 100644
--- a/src/org/torproject/ernie/web/ResearchFormatsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResearchFormatsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 5666493868675314116L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ResearchPapersServlet.java b/src/org/torproject/ernie/web/ResearchPapersServlet.java
index 8d36225..e5ea176 100644
--- a/src/org/torproject/ernie/web/ResearchPapersServlet.java
+++ b/src/org/torproject/ernie/web/ResearchPapersServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResearchPapersServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -8135459207158536268L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ResearchServlet.java b/src/org/torproject/ernie/web/ResearchServlet.java
index 8c7c0e6..9c5766a 100644
--- a/src/org/torproject/ernie/web/ResearchServlet.java
+++ b/src/org/torproject/ernie/web/ResearchServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResearchServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -9151727188925700665L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ResearchToolsServlet.java b/src/org/torproject/ernie/web/ResearchToolsServlet.java
index e2f890e..c56aff1 100644
--- a/src/org/torproject/ernie/web/ResearchToolsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchToolsServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResearchToolsServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -3344204426180358872L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/RouterDetailServlet.java b/src/org/torproject/ernie/web/RouterDetailServlet.java
index 1012beb..89b200d 100644
--- a/src/org/torproject/ernie/web/RouterDetailServlet.java
+++ b/src/org/torproject/ernie/web/RouterDetailServlet.java
@@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
public class RouterDetailServlet extends HttpServlet {
+ private static final long serialVersionUID = -5740769933146059947L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/ServerDescriptorServlet.java b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
index 8f549f8..7723362 100644
--- a/src/org/torproject/ernie/web/ServerDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
@@ -27,6 +27,8 @@ import javax.sql.DataSource;
public class ServerDescriptorServlet extends HttpServlet {
+ private static final long serialVersionUID = -7935883442750583462L;
+
private DataSource ds;
private Logger logger;
diff --git a/src/org/torproject/ernie/web/StatusServlet.java b/src/org/torproject/ernie/web/StatusServlet.java
index 2418419..265edb5 100644
--- a/src/org/torproject/ernie/web/StatusServlet.java
+++ b/src/org/torproject/ernie/web/StatusServlet.java
@@ -8,6 +8,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StatusServlet extends HttpServlet {
+
+ private static final long serialVersionUID = -7249872082399236981L;
+
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
diff --git a/src/org/torproject/ernie/web/TableParameterChecker.java b/src/org/torproject/ernie/web/TableParameterChecker.java
index 338b3f0..ae93b41 100644
--- a/src/org/torproject/ernie/web/TableParameterChecker.java
+++ b/src/org/torproject/ernie/web/TableParameterChecker.java
@@ -33,9 +33,6 @@ public class TableParameterChecker {
/* Available tables with corresponding parameter lists. */
private Map<String, String> availableTables;
- /* Known parameters and parameter values. */
- private Map<String, String> knownParameterValues;
-
/**
* Initializes map with valid parameters for each of the graphs.
*/
@@ -46,8 +43,6 @@ public class TableParameterChecker {
this.availableTables = new HashMap<String, String>();
this.availableTables.put("direct-users", "start,end,filename");
this.availableTables.put("censorship-events", "start,end,filename");
-
- this.knownParameterValues = new HashMap<String, String>();
}
/**
diff --git a/src/org/torproject/ernie/web/VotesServlet.java b/src/org/torproject/ernie/web/VotesServlet.java
index 13fd455..d7b6ee8 100644
--- a/src/org/torproject/ernie/web/VotesServlet.java
+++ b/src/org/torproject/ernie/web/VotesServlet.java
@@ -25,6 +25,8 @@ import javax.sql.DataSource;
public class VotesServlet extends HttpServlet {
+ private static final long serialVersionUID = 246279501605993024L;
+
private DataSource ds;
private Logger logger;
1
0

20 Mar '12
commit 262df59ae8c77ec1570694e2596d81886cd6b3ef
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Mar 20 13:29:19 2012 +0100
Update copyright statements to 2012.
---
src/org/torproject/ernie/cron/ArchiveReader.java | 2 +-
.../ernie/cron/BridgeDescriptorParser.java | 2 +-
.../ernie/cron/BridgeStatsFileHandler.java | 2 +-
src/org/torproject/ernie/cron/Configuration.java | 2 +-
.../ernie/cron/ConsensusStatsFileHandler.java | 2 +-
.../ernie/cron/ExoneraTorDatabaseImporter.java | 2 +-
.../ernie/cron/GeoipDatabaseImporter.java | 2 +-
src/org/torproject/ernie/cron/GetTorProcessor.java | 2 +-
src/org/torproject/ernie/cron/LockFile.java | 2 +-
.../ernie/cron/LoggingConfiguration.java | 2 +-
src/org/torproject/ernie/cron/Main.java | 2 +-
.../cron/RelayDescriptorDatabaseImporter.java | 2 +-
.../ernie/cron/RelayDescriptorParser.java | 2 +-
.../ernie/cron/SanitizedBridgesReader.java | 2 +-
.../torproject/ernie/cron/TorperfProcessor.java | 2 +-
.../ernie/test/SanitizedBridgesReaderTest.java | 2 +-
src/org/torproject/ernie/web/ConsensusServlet.java | 2 ++
src/org/torproject/ernie/web/Countries.java | 2 ++
src/org/torproject/ernie/web/CsvServlet.java | 2 ++
.../torproject/ernie/web/DescriptorServlet.java | 2 ++
.../ernie/web/ErnieGeneratedFileServlet.java | 2 ++
.../torproject/ernie/web/ExoneraTorServlet.java | 2 ++
.../ernie/web/ExtraInfoDescriptorServlet.java | 2 ++
src/org/torproject/ernie/web/GraphDataServlet.java | 2 ++
.../torproject/ernie/web/GraphImageServlet.java | 2 ++
.../ernie/web/GraphParameterChecker.java | 2 ++
src/org/torproject/ernie/web/GraphsServlet.java | 2 ++
.../ernie/web/GraphsSubpagesServlet.java | 2 ++
src/org/torproject/ernie/web/IndexServlet.java | 2 ++
.../torproject/ernie/web/NetworkStatusServlet.java | 2 ++
src/org/torproject/ernie/web/RObjectGenerator.java | 2 ++
.../torproject/ernie/web/RelaySearchServlet.java | 2 ++
src/org/torproject/ernie/web/RelayServlet.java | 2 ++
.../torproject/ernie/web/ResearchDataServlet.java | 2 ++
.../ernie/web/ResearchFormatsServlet.java | 2 ++
.../ernie/web/ResearchPapersServlet.java | 2 ++
src/org/torproject/ernie/web/ResearchServlet.java | 2 ++
.../torproject/ernie/web/ResearchToolsServlet.java | 2 ++
.../torproject/ernie/web/RouterDetailServlet.java | 2 ++
.../ernie/web/ServerDescriptorServlet.java | 2 ++
src/org/torproject/ernie/web/StatusServlet.java | 2 ++
.../ernie/web/TableParameterChecker.java | 2 ++
src/org/torproject/ernie/web/VotesServlet.java | 2 ++
43 files changed, 70 insertions(+), 16 deletions(-)
diff --git a/src/org/torproject/ernie/cron/ArchiveReader.java b/src/org/torproject/ernie/cron/ArchiveReader.java
index 45449ab..20a0905 100644
--- a/src/org/torproject/ernie/cron/ArchiveReader.java
+++ b/src/org/torproject/ernie/cron/ArchiveReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/BridgeDescriptorParser.java b/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
index 601b238..221e896 100644
--- a/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
+++ b/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 26fd0e6..6e7f4eb 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/Configuration.java b/src/org/torproject/ernie/cron/Configuration.java
index 6effd78..0a493cb 100644
--- a/src/org/torproject/ernie/cron/Configuration.java
+++ b/src/org/torproject/ernie/cron/Configuration.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
index 019478c..6c83b05 100644
--- a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
index 72a0b44..62ad50a 100755
--- a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java b/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
index 2ad8bf4..cc9e140 100644
--- a/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/GetTorProcessor.java b/src/org/torproject/ernie/cron/GetTorProcessor.java
index 3e32819..0c5325d 100644
--- a/src/org/torproject/ernie/cron/GetTorProcessor.java
+++ b/src/org/torproject/ernie/cron/GetTorProcessor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/LockFile.java b/src/org/torproject/ernie/cron/LockFile.java
index 94afbab..4de8da0 100644
--- a/src/org/torproject/ernie/cron/LockFile.java
+++ b/src/org/torproject/ernie/cron/LockFile.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/LoggingConfiguration.java b/src/org/torproject/ernie/cron/LoggingConfiguration.java
index b7dd122..c261d95 100644
--- a/src/org/torproject/ernie/cron/LoggingConfiguration.java
+++ b/src/org/torproject/ernie/cron/LoggingConfiguration.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/Main.java b/src/org/torproject/ernie/cron/Main.java
index 7cb0091..57ad804 100644
--- a/src/org/torproject/ernie/cron/Main.java
+++ b/src/org/torproject/ernie/cron/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index dbbd168..35ba90e 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorParser.java b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
index 0a6213a..ed52d4c 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorParser.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java b/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
index f151152..09b4983 100644
--- a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
+++ b/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/cron/TorperfProcessor.java b/src/org/torproject/ernie/cron/TorperfProcessor.java
index b9086e0..0242b1b 100644
--- a/src/org/torproject/ernie/cron/TorperfProcessor.java
+++ b/src/org/torproject/ernie/cron/TorperfProcessor.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
diff --git a/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java b/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
index 8eaf346..748894e 100644
--- a/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
+++ b/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2011 The Tor Project
+/* Copyright 2011, 2012 The Tor Project
* See LICENSE for licensing information */
package org.torproject.ernie.test;
diff --git a/src/org/torproject/ernie/web/ConsensusServlet.java b/src/org/torproject/ernie/web/ConsensusServlet.java
index 9ec3106..20cff07 100644
--- a/src/org/torproject/ernie/web/ConsensusServlet.java
+++ b/src/org/torproject/ernie/web/ConsensusServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedOutputStream;
diff --git a/src/org/torproject/ernie/web/Countries.java b/src/org/torproject/ernie/web/Countries.java
index 51a5ec3..10406a5 100644
--- a/src/org/torproject/ernie/web/Countries.java
+++ b/src/org/torproject/ernie/web/Countries.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.util.ArrayList;
diff --git a/src/org/torproject/ernie/web/CsvServlet.java b/src/org/torproject/ernie/web/CsvServlet.java
index 912ce26..39efc14 100644
--- a/src/org/torproject/ernie/web/CsvServlet.java
+++ b/src/org/torproject/ernie/web/CsvServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/DescriptorServlet.java b/src/org/torproject/ernie/web/DescriptorServlet.java
index 139a4fb..7b3a1b7 100644
--- a/src/org/torproject/ernie/web/DescriptorServlet.java
+++ b/src/org/torproject/ernie/web/DescriptorServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedReader;
diff --git a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
index f625f36..a303225 100644
--- a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
+++ b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedInputStream;
diff --git a/src/org/torproject/ernie/web/ExoneraTorServlet.java b/src/org/torproject/ernie/web/ExoneraTorServlet.java
index 41725a3..4feaaba 100644
--- a/src/org/torproject/ernie/web/ExoneraTorServlet.java
+++ b/src/org/torproject/ernie/web/ExoneraTorServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedReader;
diff --git a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
index bfb3432..8b532ce 100644
--- a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedOutputStream;
diff --git a/src/org/torproject/ernie/web/GraphDataServlet.java b/src/org/torproject/ernie/web/GraphDataServlet.java
index 52fab5b..6bba9f0 100644
--- a/src/org/torproject/ernie/web/GraphDataServlet.java
+++ b/src/org/torproject/ernie/web/GraphDataServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedReader;
diff --git a/src/org/torproject/ernie/web/GraphImageServlet.java b/src/org/torproject/ernie/web/GraphImageServlet.java
index 41bf652..4ef53dd 100644
--- a/src/org/torproject/ernie/web/GraphImageServlet.java
+++ b/src/org/torproject/ernie/web/GraphImageServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedOutputStream;
diff --git a/src/org/torproject/ernie/web/GraphParameterChecker.java b/src/org/torproject/ernie/web/GraphParameterChecker.java
index 701fb23..96efed0 100644
--- a/src/org/torproject/ernie/web/GraphParameterChecker.java
+++ b/src/org/torproject/ernie/web/GraphParameterChecker.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.text.ParseException;
diff --git a/src/org/torproject/ernie/web/GraphsServlet.java b/src/org/torproject/ernie/web/GraphsServlet.java
index 1d17887..111aa0f 100644
--- a/src/org/torproject/ernie/web/GraphsServlet.java
+++ b/src/org/torproject/ernie/web/GraphsServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
index 80ccf6c..3e090eb 100644
--- a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
+++ b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/IndexServlet.java b/src/org/torproject/ernie/web/IndexServlet.java
index a7cbba4..11aff7c 100644
--- a/src/org/torproject/ernie/web/IndexServlet.java
+++ b/src/org/torproject/ernie/web/IndexServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/NetworkStatusServlet.java b/src/org/torproject/ernie/web/NetworkStatusServlet.java
index 3e41620..844fc4f 100644
--- a/src/org/torproject/ernie/web/NetworkStatusServlet.java
+++ b/src/org/torproject/ernie/web/NetworkStatusServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index e66b4b7..97635a2 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedInputStream;
diff --git a/src/org/torproject/ernie/web/RelaySearchServlet.java b/src/org/torproject/ernie/web/RelaySearchServlet.java
index 61d831e..01b6c6f 100644
--- a/src/org/torproject/ernie/web/RelaySearchServlet.java
+++ b/src/org/torproject/ernie/web/RelaySearchServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/RelayServlet.java b/src/org/torproject/ernie/web/RelayServlet.java
index cec8566..6f120e5 100644
--- a/src/org/torproject/ernie/web/RelayServlet.java
+++ b/src/org/torproject/ernie/web/RelayServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/ResearchDataServlet.java b/src/org/torproject/ernie/web/ResearchDataServlet.java
index 1e81bc1..1df5eee 100644
--- a/src/org/torproject/ernie/web/ResearchDataServlet.java
+++ b/src/org/torproject/ernie/web/ResearchDataServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedReader;
diff --git a/src/org/torproject/ernie/web/ResearchFormatsServlet.java b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
index b7bf7af..96bca4f 100644
--- a/src/org/torproject/ernie/web/ResearchFormatsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/ResearchPapersServlet.java b/src/org/torproject/ernie/web/ResearchPapersServlet.java
index e5ea176..ed3414c 100644
--- a/src/org/torproject/ernie/web/ResearchPapersServlet.java
+++ b/src/org/torproject/ernie/web/ResearchPapersServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/ResearchServlet.java b/src/org/torproject/ernie/web/ResearchServlet.java
index 9c5766a..c78be69 100644
--- a/src/org/torproject/ernie/web/ResearchServlet.java
+++ b/src/org/torproject/ernie/web/ResearchServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/ResearchToolsServlet.java b/src/org/torproject/ernie/web/ResearchToolsServlet.java
index c56aff1..2345df4 100644
--- a/src/org/torproject/ernie/web/ResearchToolsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchToolsServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/RouterDetailServlet.java b/src/org/torproject/ernie/web/RouterDetailServlet.java
index 89b200d..fcbbe74 100644
--- a/src/org/torproject/ernie/web/RouterDetailServlet.java
+++ b/src/org/torproject/ernie/web/RouterDetailServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/ServerDescriptorServlet.java b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
index 7723362..c8f3d9c 100644
--- a/src/org/torproject/ernie/web/ServerDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedOutputStream;
diff --git a/src/org/torproject/ernie/web/StatusServlet.java b/src/org/torproject/ernie/web/StatusServlet.java
index 265edb5..07790ec 100644
--- a/src/org/torproject/ernie/web/StatusServlet.java
+++ b/src/org/torproject/ernie/web/StatusServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.IOException;
diff --git a/src/org/torproject/ernie/web/TableParameterChecker.java b/src/org/torproject/ernie/web/TableParameterChecker.java
index ae93b41..3209bda 100644
--- a/src/org/torproject/ernie/web/TableParameterChecker.java
+++ b/src/org/torproject/ernie/web/TableParameterChecker.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.text.ParseException;
diff --git a/src/org/torproject/ernie/web/VotesServlet.java b/src/org/torproject/ernie/web/VotesServlet.java
index d7b6ee8..0821412 100644
--- a/src/org/torproject/ernie/web/VotesServlet.java
+++ b/src/org/torproject/ernie/web/VotesServlet.java
@@ -1,3 +1,5 @@
+/* Copyright 2011, 2012 The Tor Project
+ * See LICENSE for licensing information */
package org.torproject.ernie.web;
import java.io.BufferedOutputStream;
1
0
commit dcd46097fa9f1edc24fc58f10125003a288bd2da
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Mar 20 13:10:07 2012 +0100
Let Eclipse organize imports.
---
src/org/torproject/ernie/cron/ArchiveReader.java | 20 +++++++-
.../ernie/cron/BridgeDescriptorParser.java | 17 +++++--
.../ernie/cron/BridgeStatsFileHandler.java | 27 ++++++++--
src/org/torproject/ernie/cron/Configuration.java | 11 +++--
.../ernie/cron/ConsensusStatsFileHandler.java | 27 ++++++++--
.../ernie/cron/ExoneraTorDatabaseImporter.java | 35 +++++++++++--
.../ernie/cron/GeoipDatabaseImporter.java | 16 +++++--
src/org/torproject/ernie/cron/GetTorProcessor.java | 25 ++++++++--
src/org/torproject/ernie/cron/LockFile.java | 9 +++-
.../ernie/cron/LoggingConfiguration.java | 12 ++++-
src/org/torproject/ernie/cron/Main.java | 5 +-
.../cron/RelayDescriptorDatabaseImporter.java | 32 ++++++++++--
.../ernie/cron/RelayDescriptorParser.java | 24 +++++++--
.../ernie/cron/SanitizedBridgesReader.java | 19 ++++++-
.../torproject/ernie/cron/TorperfProcessor.java | 32 ++++++++++--
.../ernie/test/SanitizedBridgesReaderTest.java | 12 ++--
src/org/torproject/ernie/web/ConsensusServlet.java | 28 +++++++----
src/org/torproject/ernie/web/Countries.java | 3 +-
src/org/torproject/ernie/web/CsvServlet.java | 16 ++++---
.../torproject/ernie/web/DescriptorServlet.java | 41 +++++++++-------
.../ernie/web/ErnieGeneratedFileServlet.java | 13 ++++--
.../torproject/ernie/web/ExoneraTorServlet.java | 51 ++++++++++++++------
.../ernie/web/ExtraInfoDescriptorServlet.java | 28 +++++++----
src/org/torproject/ernie/web/GraphDataServlet.java | 24 +++++++---
.../torproject/ernie/web/GraphImageServlet.java | 13 +++--
.../ernie/web/GraphParameterChecker.java | 13 ++++-
src/org/torproject/ernie/web/GraphsServlet.java | 9 ++-
.../ernie/web/GraphsSubpagesServlet.java | 20 ++++++--
src/org/torproject/ernie/web/IndexServlet.java | 9 ++-
.../torproject/ernie/web/NetworkStatusServlet.java | 10 ++--
src/org/torproject/ernie/web/RObjectGenerator.java | 28 ++++++++---
.../torproject/ernie/web/RelaySearchServlet.java | 44 ++++++++++++-----
src/org/torproject/ernie/web/RelayServlet.java | 8 ++-
.../torproject/ernie/web/ResearchDataServlet.java | 24 +++++++--
.../ernie/web/ResearchFormatsServlet.java | 9 ++-
.../ernie/web/ResearchPapersServlet.java | 9 ++-
src/org/torproject/ernie/web/ResearchServlet.java | 9 ++-
.../torproject/ernie/web/ResearchToolsServlet.java | 9 ++-
.../torproject/ernie/web/RouterDetailServlet.java | 10 ++--
.../ernie/web/ServerDescriptorServlet.java | 35 +++++++++----
src/org/torproject/ernie/web/StatusServlet.java | 9 ++-
.../ernie/web/TableParameterChecker.java | 11 +++-
src/org/torproject/ernie/web/VotesServlet.java | 32 ++++++++----
43 files changed, 602 insertions(+), 236 deletions(-)
diff --git a/src/org/torproject/ernie/cron/ArchiveReader.java b/src/org/torproject/ernie/cron/ArchiveReader.java
index 4d4fe64..45449ab 100644
--- a/src/org/torproject/ernie/cron/ArchiveReader.java
+++ b/src/org/torproject/ernie/cron/ArchiveReader.java
@@ -2,9 +2,23 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.Stack;
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Read in all files in a given directory and pass buffered readers of
diff --git a/src/org/torproject/ernie/cron/BridgeDescriptorParser.java b/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
index 4777f58..601b238 100644
--- a/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
+++ b/src/org/torproject/ernie/cron/BridgeDescriptorParser.java
@@ -2,11 +2,18 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import org.apache.commons.codec.digest.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.codec.digest.DigestUtils;
public class BridgeDescriptorParser {
private ConsensusStatsFileHandler csfh;
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 58ee3a2..2f6ac8d 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -2,11 +2,28 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Determines estimates of bridge users per country and day from the
diff --git a/src/org/torproject/ernie/cron/Configuration.java b/src/org/torproject/ernie/cron/Configuration.java
index b8f251e..6effd78 100644
--- a/src/org/torproject/ernie/cron/Configuration.java
+++ b/src/org/torproject/ernie/cron/Configuration.java
@@ -2,10 +2,13 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Initialize configuration with hard-coded defaults, overwrite with
diff --git a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
index 4ad5300..ebc882b 100644
--- a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
@@ -2,11 +2,28 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Generates statistics on the average number of relays and bridges per
diff --git a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
index c89097a..8eb5688 100755
--- a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
@@ -2,12 +2,35 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import org.apache.commons.codec.binary.*;
-import org.apache.commons.codec.digest.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TimeZone;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
/* Import Tor descriptors into the ExoneraTor database. */
public class ExoneraTorDatabaseImporter {
diff --git a/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java b/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
index afe5245..2ad8bf4 100644
--- a/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/GeoipDatabaseImporter.java
@@ -2,10 +2,18 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.HashMap;
+import java.util.Map;
/**
* Import a Maxmind GeoLite City database to resolve resolve IP addresses
diff --git a/src/org/torproject/ernie/cron/GetTorProcessor.java b/src/org/torproject/ernie/cron/GetTorProcessor.java
index 65f2dd4..3e32819 100644
--- a/src/org/torproject/ernie/cron/GetTorProcessor.java
+++ b/src/org/torproject/ernie/cron/GetTorProcessor.java
@@ -2,11 +2,26 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class GetTorProcessor {
public GetTorProcessor(File getTorDirectory, String connectionURL) {
diff --git a/src/org/torproject/ernie/cron/LockFile.java b/src/org/torproject/ernie/cron/LockFile.java
index 7a097f0..94afbab 100644
--- a/src/org/torproject/ernie/cron/LockFile.java
+++ b/src/org/torproject/ernie/cron/LockFile.java
@@ -2,8 +2,13 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.logging.Logger;
public class LockFile {
diff --git a/src/org/torproject/ernie/cron/LoggingConfiguration.java b/src/org/torproject/ernie/cron/LoggingConfiguration.java
index f14fc54..b7dd122 100644
--- a/src/org/torproject/ernie/cron/LoggingConfiguration.java
+++ b/src/org/torproject/ernie/cron/LoggingConfiguration.java
@@ -2,11 +2,17 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.text.*;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
-import java.util.logging.*;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
/**
* Initialize logging configuration.
diff --git a/src/org/torproject/ernie/cron/Main.java b/src/org/torproject/ernie/cron/Main.java
index 4889fc2..7cb0091 100644
--- a/src/org/torproject/ernie/cron/Main.java
+++ b/src/org/torproject/ernie/cron/Main.java
@@ -2,9 +2,8 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.File;
+import java.util.logging.Logger;
/**
* Coordinate downloading and parsing of descriptors and extraction of
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index deefc10..dbbd168 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -2,12 +2,32 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import org.postgresql.util.*;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.postgresql.util.PGbytea;
/**
* Parse directory data.
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorParser.java b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
index 64b809e..2125352 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorParser.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorParser.java
@@ -2,12 +2,24 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import org.apache.commons.codec.digest.*;
-import org.apache.commons.codec.binary.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
/**
* Parses relay descriptors including network status consensuses and
diff --git a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java b/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
index b7f1d44..f151152 100644
--- a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
+++ b/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
@@ -2,9 +2,22 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.Stack;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class SanitizedBridgesReader {
public SanitizedBridgesReader(BridgeDescriptorParser bdp,
diff --git a/src/org/torproject/ernie/cron/TorperfProcessor.java b/src/org/torproject/ernie/cron/TorperfProcessor.java
index dcd0657..b9086e0 100644
--- a/src/org/torproject/ernie/cron/TorperfProcessor.java
+++ b/src/org/torproject/ernie/cron/TorperfProcessor.java
@@ -2,11 +2,33 @@
* See LICENSE for licensing information */
package org.torproject.ernie.cron;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.Stack;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class TorperfProcessor {
public TorperfProcessor(File torperfDirectory, File statsDirectory,
diff --git a/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java b/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
index 6dd9132..8eaf346 100644
--- a/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
+++ b/src/org/torproject/ernie/test/SanitizedBridgesReaderTest.java
@@ -2,13 +2,13 @@
* See LICENSE for licensing information */
package org.torproject.ernie.test;
-import org.torproject.ernie.cron.*;
+import java.io.File;
-import java.io.*;
-
-import org.junit.*;
-import org.junit.rules.*;
-import static org.junit.Assert.*;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.torproject.ernie.cron.SanitizedBridgesReader;
public class SanitizedBridgesReaderTest {
diff --git a/src/org/torproject/ernie/web/ConsensusServlet.java b/src/org/torproject/ernie/web/ConsensusServlet.java
index ad3f4a7..f5afc92 100644
--- a/src/org/torproject/ernie/web/ConsensusServlet.java
+++ b/src/org/torproject/ernie/web/ConsensusServlet.java
@@ -1,15 +1,25 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
public class ConsensusServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/Countries.java b/src/org/torproject/ernie/web/Countries.java
index 7b208c7..51a5ec3 100644
--- a/src/org/torproject/ernie/web/Countries.java
+++ b/src/org/torproject/ernie/web/Countries.java
@@ -1,6 +1,7 @@
package org.torproject.ernie.web;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
public class Countries {
diff --git a/src/org/torproject/ernie/web/CsvServlet.java b/src/org/torproject/ernie/web/CsvServlet.java
index 2e752aa..d896247 100644
--- a/src/org/torproject/ernie/web/CsvServlet.java
+++ b/src/org/torproject/ernie/web/CsvServlet.java
@@ -1,12 +1,14 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
+import java.io.IOException;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Servlet that reads an HTTP request for a comma-separated value file,
diff --git a/src/org/torproject/ernie/web/DescriptorServlet.java b/src/org/torproject/ernie/web/DescriptorServlet.java
index 7ee454b..56f8a1d 100644
--- a/src/org/torproject/ernie/web/DescriptorServlet.java
+++ b/src/org/torproject/ernie/web/DescriptorServlet.java
@@ -1,22 +1,29 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.math.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import java.util.regex.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
-import org.apache.commons.codec.*;
-import org.apache.commons.codec.binary.*;
-
-import org.apache.commons.lang.*;
+import org.apache.commons.lang.StringEscapeUtils;
public class DescriptorServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
index f4bd066..33fb22e 100644
--- a/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
+++ b/src/org/torproject/ernie/web/ErnieGeneratedFileServlet.java
@@ -1,10 +1,15 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
-import java.io.*;
-import java.util.*;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class ErnieGeneratedFileServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/ExoneraTorServlet.java b/src/org/torproject/ernie/web/ExoneraTorServlet.java
index d2d33f4..3a71d10 100644
--- a/src/org/torproject/ernie/web/ExoneraTorServlet.java
+++ b/src/org/torproject/ernie/web/ExoneraTorServlet.java
@@ -1,20 +1,41 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.math.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import java.util.regex.*;
-
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
-
-import org.apache.commons.codec.binary.*;
-import org.apache.commons.lang.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang.StringEscapeUtils;
public class ExoneraTorServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
index 0a06865..7d48a12 100644
--- a/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ExtraInfoDescriptorServlet.java
@@ -1,14 +1,24 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.sql.*;
-import java.util.logging.*;
-import java.util.regex.*;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
public class ExtraInfoDescriptorServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/GraphDataServlet.java b/src/org/torproject/ernie/web/GraphDataServlet.java
index ec3c93b..590647b 100644
--- a/src/org/torproject/ernie/web/GraphDataServlet.java
+++ b/src/org/torproject/ernie/web/GraphDataServlet.java
@@ -1,12 +1,22 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Servlet that reads an HTTP request for a JSON-formatted graph data
diff --git a/src/org/torproject/ernie/web/GraphImageServlet.java b/src/org/torproject/ernie/web/GraphImageServlet.java
index 2eb2efd..7e8e29c 100644
--- a/src/org/torproject/ernie/web/GraphImageServlet.java
+++ b/src/org/torproject/ernie/web/GraphImageServlet.java
@@ -1,10 +1,13 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.text.*;
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Servlet that reads an HTTP request for a graph image, asks the
diff --git a/src/org/torproject/ernie/web/GraphParameterChecker.java b/src/org/torproject/ernie/web/GraphParameterChecker.java
index 09a4f34..701fb23 100644
--- a/src/org/torproject/ernie/web/GraphParameterChecker.java
+++ b/src/org/torproject/ernie/web/GraphParameterChecker.java
@@ -1,8 +1,15 @@
package org.torproject.ernie.web;
-import java.text.*;
-import java.util.*;
-import java.util.regex.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.regex.Pattern;
/**
* Checks request parameters passed to graph-generating servlets.
diff --git a/src/org/torproject/ernie/web/GraphsServlet.java b/src/org/torproject/ernie/web/GraphsServlet.java
index 121881f..b4658d8 100644
--- a/src/org/torproject/ernie/web/GraphsServlet.java
+++ b/src/org/torproject/ernie/web/GraphsServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class GraphsServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
index c7f3056..4a1056d 100644
--- a/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
+++ b/src/org/torproject/ernie/web/GraphsSubpagesServlet.java
@@ -1,10 +1,20 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import java.text.*;
-import java.util.*;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class GraphsSubpagesServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/IndexServlet.java b/src/org/torproject/ernie/web/IndexServlet.java
index cbf1e10..fd0f55d 100644
--- a/src/org/torproject/ernie/web/IndexServlet.java
+++ b/src/org/torproject/ernie/web/IndexServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class IndexServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/NetworkStatusServlet.java b/src/org/torproject/ernie/web/NetworkStatusServlet.java
index 63d7895..5c87b39 100644
--- a/src/org/torproject/ernie/web/NetworkStatusServlet.java
+++ b/src/org/torproject/ernie/web/NetworkStatusServlet.java
@@ -1,11 +1,11 @@
package org.torproject.ernie.web;
-import java.io.*;
+import java.io.IOException;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.apache.commons.lang.time.*;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class NetworkStatusServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index 814d79b..e251974 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -1,13 +1,25 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.util.*;
-import java.util.logging.*;
-
-import javax.servlet.*;
-
-import org.rosuda.REngine.Rserve.*;
-import org.rosuda.REngine.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.rosuda.REngine.Rserve.RConnection;
+import org.rosuda.REngine.Rserve.RserveException;
public class RObjectGenerator implements ServletContextListener {
diff --git a/src/org/torproject/ernie/web/RelaySearchServlet.java b/src/org/torproject/ernie/web/RelaySearchServlet.java
index f93dc14..208a8d2 100644
--- a/src/org/torproject/ernie/web/RelaySearchServlet.java
+++ b/src/org/torproject/ernie/web/RelaySearchServlet.java
@@ -1,19 +1,39 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.math.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import java.util.regex.*;
-
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
-
-import org.apache.commons.codec.binary.*;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.apache.commons.codec.binary.Base64;
/**
* Web page that allows users to search for relays in the descriptor
diff --git a/src/org/torproject/ernie/web/RelayServlet.java b/src/org/torproject/ernie/web/RelayServlet.java
index 79afac3..bfbd523 100644
--- a/src/org/torproject/ernie/web/RelayServlet.java
+++ b/src/org/torproject/ernie/web/RelayServlet.java
@@ -1,9 +1,11 @@
package org.torproject.ernie.web;
-import java.io.*;
+import java.io.IOException;
-import javax.servlet.*;
-import javax.servlet.http.*;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class RelayServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/ResearchDataServlet.java b/src/org/torproject/ernie/web/ResearchDataServlet.java
index 0cf1564..deb6b06 100644
--- a/src/org/torproject/ernie/web/ResearchDataServlet.java
+++ b/src/org/torproject/ernie/web/ResearchDataServlet.java
@@ -1,10 +1,24 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
-import java.text.*;
-import java.util.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Controller servlet for the Data page. Prepares the various lists of
diff --git a/src/org/torproject/ernie/web/ResearchFormatsServlet.java b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
index f61b7e5..7ed228c 100644
--- a/src/org/torproject/ernie/web/ResearchFormatsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchFormatsServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class ResearchFormatsServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/ResearchPapersServlet.java b/src/org/torproject/ernie/web/ResearchPapersServlet.java
index c3e8484..8d36225 100644
--- a/src/org/torproject/ernie/web/ResearchPapersServlet.java
+++ b/src/org/torproject/ernie/web/ResearchPapersServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class ResearchPapersServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/ResearchServlet.java b/src/org/torproject/ernie/web/ResearchServlet.java
index 823e78c..8c7c0e6 100644
--- a/src/org/torproject/ernie/web/ResearchServlet.java
+++ b/src/org/torproject/ernie/web/ResearchServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class ResearchServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/ResearchToolsServlet.java b/src/org/torproject/ernie/web/ResearchToolsServlet.java
index ab9d7df..e2f890e 100644
--- a/src/org/torproject/ernie/web/ResearchToolsServlet.java
+++ b/src/org/torproject/ernie/web/ResearchToolsServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class ResearchToolsServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/RouterDetailServlet.java b/src/org/torproject/ernie/web/RouterDetailServlet.java
index 5d71a5a..1012beb 100644
--- a/src/org/torproject/ernie/web/RouterDetailServlet.java
+++ b/src/org/torproject/ernie/web/RouterDetailServlet.java
@@ -1,11 +1,11 @@
package org.torproject.ernie.web;
-import java.io.*;
+import java.io.IOException;
-import javax.servlet.*;
-import javax.servlet.http.*;
-
-import org.apache.commons.lang.time.*;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class RouterDetailServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/ServerDescriptorServlet.java b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
index a970971..8f549f8 100644
--- a/src/org/torproject/ernie/web/ServerDescriptorServlet.java
+++ b/src/org/torproject/ernie/web/ServerDescriptorServlet.java
@@ -1,16 +1,29 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import java.util.regex.*;
-
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
public class ServerDescriptorServlet extends HttpServlet {
diff --git a/src/org/torproject/ernie/web/StatusServlet.java b/src/org/torproject/ernie/web/StatusServlet.java
index f75ccba..2418419 100644
--- a/src/org/torproject/ernie/web/StatusServlet.java
+++ b/src/org/torproject/ernie/web/StatusServlet.java
@@ -1,8 +1,11 @@
package org.torproject.ernie.web;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.io.*;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class StatusServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
diff --git a/src/org/torproject/ernie/web/TableParameterChecker.java b/src/org/torproject/ernie/web/TableParameterChecker.java
index 5b6f627..338b3f0 100644
--- a/src/org/torproject/ernie/web/TableParameterChecker.java
+++ b/src/org/torproject/ernie/web/TableParameterChecker.java
@@ -1,8 +1,13 @@
package org.torproject.ernie.web;
-import java.text.*;
-import java.util.*;
-import java.util.regex.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
/**
* Checks request parameters passed to generate tables.
diff --git a/src/org/torproject/ernie/web/VotesServlet.java b/src/org/torproject/ernie/web/VotesServlet.java
index 2f07e5d..13fd455 100644
--- a/src/org/torproject/ernie/web/VotesServlet.java
+++ b/src/org/torproject/ernie/web/VotesServlet.java
@@ -1,15 +1,27 @@
package org.torproject.ernie.web;
-import java.io.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
-import javax.naming.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.sql.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
public class VotesServlet extends HttpServlet {
1
0

20 Mar '12
commit 77384cf27925203b92573320d12811126cffef7e
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Mar 20 12:15:35 2012 +0100
Cache .csv files and graph data, too.
So far we were only caching graph images and table data, but there's no
reason why we shouldn't cache .csv files and graph data, too. Speeds up
subsequent requests for the same .csv file or graph data by a lot.
---
src/org/torproject/ernie/web/RObjectGenerator.java | 37 ++++++++++++--------
1 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index 10aa3b8..814d79b 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -99,24 +99,31 @@ public class RObjectGenerator implements ServletContextListener {
* has a placeholder for the absolute path to the file to be created. */
public String generateCsv(String rQuery, String csvFilename) {
- /* Update the R query to contain the absolute path to the file to be
- * generated, create a connection to Rserve, run the R query, and
- * close the connection. The generated csv file will be on disk in the
- * same directory as the generated graphs. */
+ /* See if we need to generate this .csv file. */
File csvFile = new File(this.cachedGraphsDirectory + "/"
+ csvFilename);
- rQuery = String.format(rQuery, csvFile.getAbsolutePath());
- try {
- RConnection rc = new RConnection(rserveHost, rservePort);
- rc.eval(rQuery);
- rc.close();
- } catch (RserveException e) {
- return null;
- }
+ long now = System.currentTimeMillis();
+ if (!csvFile.exists() || csvFile.lastModified() < now
+ - this.maxCacheAge * 1000L) {
- /* Check that we really just generated the file */
- if (!csvFile.exists()) {
- return null;
+ /* We do. Update the R query to contain the absolute path to the
+ * file to be generated, create a connection to Rserve, run the R
+ * query, and close the connection. The generated csv file will be
+ * on disk in the same directory as the generated graphs. */
+ rQuery = String.format(rQuery, csvFile.getAbsolutePath());
+ try {
+ RConnection rc = new RConnection(rserveHost, rservePort);
+ rc.eval(rQuery);
+ rc.close();
+ } catch (RserveException e) {
+ return null;
+ }
+
+ /* Check that we really just generated the file */
+ if (!csvFile.exists() || csvFile.lastModified() < now
+ - this.maxCacheAge * 1000L) {
+ return null;
+ }
}
/* Read the text file from disk and write it to a string. */
1
0

[metrics-tasks/master] Add parsing and graphing code for #3260.
by karsten@torproject.org 20 Mar '12
by karsten@torproject.org 20 Mar '12
20 Mar '12
commit e435e803f808994aa42de70e4b8af048c0005509
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Mar 20 09:15:23 2012 +0100
Add parsing and graphing code for #3260.
---
task-3260/.gitignore | 8 ++
task-3260/ExtractClientSpeedTrends.java | 150 +++++++++++++++++++++++++++++++
task-3260/README | 24 +++++
task-3260/client-speed-trends.R | 30 ++++++
task-3260/run.sh | 3 +
5 files changed, 215 insertions(+), 0 deletions(-)
diff --git a/task-3260/.gitignore b/task-3260/.gitignore
new file mode 100644
index 0000000..8231133
--- /dev/null
+++ b/task-3260/.gitignore
@@ -0,0 +1,8 @@
+in/
+status/
+out/
+*.pdf
+*.jar
+*.class
+*.png
+
diff --git a/task-3260/ExtractClientSpeedTrends.java b/task-3260/ExtractClientSpeedTrends.java
new file mode 100644
index 0000000..5a2e36e
--- /dev/null
+++ b/task-3260/ExtractClientSpeedTrends.java
@@ -0,0 +1,150 @@
+import java.io.*;
+import java.text.*;
+import java.util.*;
+import org.torproject.descriptor.*;
+
+/* Extract client speed trends from download times of network status
+ * consensuses. Directory mirrors report mininum, maximum, median,
+ * quartiles, and deciles of measured client bandwidths in their
+ * extra-info descriptors. Combine statistics from the top 50 percent of
+ * directory mirrors by finished downloads, under the assumption that
+ * these directory mirrors had enough available bandwidth to serve even
+ * fast clients. Calculate statistics on a given day by reconstructing
+ * original client bandwidths from reported percentiles by assuming a
+ * linear increase between two reported percentiles and calculating
+ * percentiles of all client bandwidth values on that day. */
+public class ExtractClientSpeedTrends {
+ public static void main(String[] args) throws Exception {
+
+ System.out.println(new Date() + " Starting.");
+
+ /* Read dirreq-v3-tunneled-dl lines from in/extra-infos/ and append
+ * them to files status/YYYY-MM-DD, prefixing lines with the relay
+ * fingerprint to detect duplicates. */
+ System.out.println(new Date() + " Reading in/extra-infos/* ...");
+ SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
+ dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ SimpleDateFormat dateTimeFormatter = new SimpleDateFormat(
+ "yyyy-MM-dd hh:mm:ss");
+ dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ dateTimeFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ DescriptorReader extraInfoReader = DescriptorSourceFactory
+ .createDescriptorReader();
+ extraInfoReader.addDirectory(new File("in/extra-infos"));
+ extraInfoReader.setExcludeFiles(new File(
+ "status/extra-info-history"));
+ Iterator<DescriptorFile> extraInfoFiles =
+ extraInfoReader.readDescriptors();
+ List<String> columns = Arrays.asList(
+ "complete,min,d1,d2,q1,d3,d4,md,d6,d7,q3,d8,d9,max".split(","));
+ while (extraInfoFiles.hasNext()) {
+ DescriptorFile extraInfoFile = extraInfoFiles.next();
+ if (extraInfoFile.getDescriptors() == null) {
+ continue;
+ }
+ for (Descriptor descriptor : extraInfoFile.getDescriptors()) {
+ ExtraInfoDescriptor extraInfoDescriptor =
+ (ExtraInfoDescriptor) descriptor;
+ SortedMap<String, Integer> dirreqV3TunneledDl =
+ extraInfoDescriptor.getDirreqV3TunneledDl();
+ if (dirreqV3TunneledDl == null ||
+ !dirreqV3TunneledDl.keySet().containsAll(columns)) {
+ continue;
+ }
+ long dirreqStatsEndMillis = extraInfoDescriptor.
+ getDirreqStatsEndMillis();
+ String dirreqStatsEndDate = dateFormatter.format(
+ dirreqStatsEndMillis);
+ String dirreqStatsEndDateTime = dateTimeFormatter.format(
+ dirreqStatsEndMillis);
+ String fingerprint = extraInfoDescriptor.getFingerprint();
+ File statusFile = new File("status/" + dirreqStatsEndDate);
+ statusFile.getParentFile().mkdirs();
+ BufferedWriter bw = new BufferedWriter(new FileWriter(statusFile,
+ true));
+ bw.write(fingerprint + "," + dirreqStatsEndDateTime);
+ for (String column : columns) {
+ bw.write("," + String.valueOf(dirreqV3TunneledDl.get(column)));
+ }
+ bw.write("\n");
+ bw.close();
+ }
+ }
+
+ /* Iterate over files status/YYYY-MM-DD, aggregate client speed
+ * statistics, and write them to out/client-speed-trends.csv. */
+ System.out.println(new Date() + " Writing "
+ + "out/client-speed-trends.csv ...");
+ File clientSpeedTrendsFile = new File("out/client-speed-trends.csv");
+ if (!clientSpeedTrendsFile.exists()) {
+ clientSpeedTrendsFile.getParentFile().mkdirs();
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ clientSpeedTrendsFile));
+ bw.write("date,lines,complete,p0,p10,p20,p25,p30,p40,p50,p60,p70,"
+ + "p75,p80,p90,p100\n");
+ for (File statusFile : new File("status").listFiles()) {
+ if (!statusFile.getName().startsWith("20")) {
+ continue;
+ }
+ BufferedReader br = new BufferedReader(new FileReader(
+ statusFile));
+ String line;
+ Set<String> statsLines = new HashSet<String>();
+ List<Integer> completes = new ArrayList<Integer>();
+ while ((line = br.readLine()) != null) {
+ int complete = Integer.parseInt(line.split(",")[2]);
+ completes.add(complete);
+ statsLines.add(line);
+ }
+ br.close();
+ Collections.sort(completes);
+ int completeP50 = completes.get((completes.size() - 1) / 2);
+ List<Integer> downloadTimes = new ArrayList<Integer>();
+ List<Integer> percentiles = Arrays.asList(new Integer[] { 0, 10,
+ 20, 25, 30, 40, 50, 60, 70, 75, 80, 90, 100 });
+ int containedStatsLines = 0;
+ for (String statsLine : statsLines) {
+ String[] parts = statsLine.split(",");
+ int complete = Integer.parseInt(parts[2]);
+ if (complete < completeP50) {
+ continue;
+ }
+ containedStatsLines++;
+ int previousDownloadTime = Integer.parseInt(parts[3]);
+ downloadTimes.add(previousDownloadTime);
+ int previousPercentile = 0;
+ for (int i = 4; i < parts.length; i++) {
+ int currentDownloadTime = Integer.parseInt(parts[i]);
+ int currentPercentile = percentiles.get(i - 3);
+ int values = complete * (currentPercentile
+ - previousPercentile) / 100;
+ if (values > 0) {
+ int increment = (currentDownloadTime - previousDownloadTime)
+ / values;
+ int downloadTime = previousDownloadTime;
+ for (int j = 0; j < values; j++) {
+ downloadTime += increment;
+ downloadTimes.add(downloadTime);
+ }
+ }
+ previousDownloadTime = currentDownloadTime;
+ previousPercentile = currentPercentile;
+ }
+ }
+ bw.write(statusFile.getName() + "," + containedStatsLines + ","
+ + downloadTimes.size());
+ Collections.sort(downloadTimes);
+ for (int percentile : percentiles) {
+ int downloadTime = downloadTimes.get(((percentile
+ * (downloadTimes.size() - 1)) / 100));
+ bw.write("," + downloadTime);
+ }
+ bw.write("\n");
+ }
+ bw.close();
+ }
+
+ System.out.println(new Date() + " Terminating.");
+ }
+}
+
diff --git a/task-3260/README b/task-3260/README
new file mode 100644
index 0000000..0843c71
--- /dev/null
+++ b/task-3260/README
@@ -0,0 +1,24 @@
+Extract client speed trends from download times of network status
+consensuses.
+==========================================================================
+
+Clone the metrics-lib repository, create the descriptor.jar file, and put
+it in this directory.
+
+Obtain the Apache Commons Codec 1.4 .jar file commons-codec-1.4.jar and
+put it in this directory.
+
+Download metrics tarballs containing extra-info descriptors. Extract the
+tarballs and put them in in/extra-infos/ in this directory.
+
+Compile and run the Java class:
+
+ $ ./run.sh
+
+In order to re-run parts of the analysis, delete files in status/ or the
+results file in out/.
+
+Draw graphs using R and ggplot2:
+
+ $ R --slave -f client-speed-trends.R
+
diff --git a/task-3260/client-speed-trends.R b/task-3260/client-speed-trends.R
new file mode 100644
index 0000000..8f389e0
--- /dev/null
+++ b/task-3260/client-speed-trends.R
@@ -0,0 +1,30 @@
+library(ggplot2)
+c <- read.csv("out/client-speed-trends.csv", stringsAsFactors = FALSE)
+c <- c[as.Date(c$date) < max(as.Date(c$date)) - 1, ]
+
+ggplot(c, aes(x = as.Date(date), y = lines * 2)) +
+geom_line() +
+scale_y_continuous(name = "Directory mirrors reporting statistics\n",
+ limits = c(0, max(c$lines) * 2))
+
+ggplot(c, aes(x = as.Date(date), y = complete)) +
+geom_line()
+
+d <- c
+d[d$lines < 5, c("lines", "p10", "p20", "p30", "p40", "p50")] <- NA
+d <- d[, c("date", "lines", "p10", "p20", "p30", "p40", "p50")]
+d <- melt(d, id.vars = c("date", "lines"))
+ggplot(d, aes(x = as.Date(date), y = value / 1024, colour = variable,
+ alpha = log(lines))) +
+geom_line() +
+scale_x_date(name = "", limits = as.Date(c(min(d[!is.na(d$value), "date"]),
+ max(d[!is.na(d$value), "date"]))), format = "%Y") +
+scale_y_continuous(name = "", limits = c(0, 200)) +
+ #limits = c(0, max(d$value, na.rm = TRUE) / 1024)) +
+scale_colour_hue(name = "Percentile",
+ breaks = c("p50", "p40", "p30", "p20", "p10"),
+ labels = seq(50, 10, -10), h.start = 60) +
+scale_alpha(legend = FALSE) +
+opts(title = "Estimated client bandwidth in KiB/s\n")
+ggsave("client-speed-trends.png", width = 8, height = 5, dpi = 72)
+
diff --git a/task-3260/run.sh b/task-3260/run.sh
new file mode 100755
index 0000000..63a2c98
--- /dev/null
+++ b/task-3260/run.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+javac -cp descriptor.jar:commons-codec-1.4.jar ExtractClientSpeedTrends.java && java -Xmx4000m -cp descriptor.jar:commons-codec-1.4.jar:. ExtractClientSpeedTrends
+
1
0