[tor-commits] [vidalia/alpha] Check that Vidalia has authenticated before allowing sending any other ControlCommand

chiiph at torproject.org chiiph at torproject.org
Wed May 30 02:01:55 UTC 2012


commit 5a954b7a4cc2511ff9aa4a3153d5448f9037ce27
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Fri May 25 19:02:23 2012 -0300

    Check that Vidalia has authenticated before allowing sending any other ControlCommand
---
 changes/authenticated         |    2 ++
 src/torcontrol/TorControl.cpp |   21 ++++++++++++++++++++-
 src/torcontrol/TorControl.h   |    5 +++++
 3 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/changes/authenticated b/changes/authenticated
new file mode 100644
index 0000000..905b6c7
--- /dev/null
+++ b/changes/authenticated
@@ -0,0 +1,2 @@
+  Internal cleanups and improvements:
+  o Do not send ControlCommands if Vidalia haven't authenticated yet.
\ No newline at end of file
diff --git a/src/torcontrol/TorControl.cpp b/src/torcontrol/TorControl.cpp
index fbf602d..84de11f 100644
--- a/src/torcontrol/TorControl.cpp
+++ b/src/torcontrol/TorControl.cpp
@@ -26,7 +26,7 @@
 
 /** Default constructor */
 TorControl::TorControl(ControlMethod::Method method)
-  : QObject(), _shouldContinue(true), _reason("") {
+  : QObject(), _shouldContinue(true), _reason(""), _authenticated(false) {
 #define RELAY_SIGNAL(src, sig) \
   QObject::connect((src), (sig), this, (sig))
 
@@ -266,6 +266,7 @@ TorControl::disconnect()
 {
   if (isConnected())
     _controlConn->disconnect();
+  _authenticated = false;
 }
 
 /** Emits the proper bootstrapStatusChanged */
@@ -330,6 +331,15 @@ TorControl::isConnected()
 bool
 TorControl::send(ControlCommand cmd, ControlReply &reply, QString *errmsg)
 {
+  if (!_authenticated and (cmd.keyword() != "AUTHENTICATE") and
+      (cmd.keyword() != "PROTOCOLINFO") and
+      (cmd.keyword() != "QUIT")) {
+    if (errmsg)
+      *errmsg = "TorControl not authenticated";
+
+    return false;
+  }
+
   if (_controlConn->send(cmd, reply, errmsg)) {
     if (reply.getStatus() == "250") {
       return true;
@@ -397,6 +407,8 @@ TorControl::authenticate(const QString &password, QString *errmsg)
 void
 TorControl::onAuthenticated()
 {
+  _authenticated = true;
+
   /* The version of Tor isn't going to change while we're connected to it, so
    * save it for later. */
   getInfo("version", _torVersion);
@@ -410,6 +422,13 @@ TorControl::onAuthenticated()
   emit authenticated();
 }
 
+/** Returns true if the process has passed through auth successfully */
+bool
+TorControl::isAuthenticated()
+{
+  return _authenticated;
+}
+
 /** Sends a PROTOCOLINFO command to Tor and parses the response. */
 ProtocolInfo
 TorControl::protocolInfo(QString *errmsg)
diff --git a/src/torcontrol/TorControl.h b/src/torcontrol/TorControl.h
index 3c5f6d7..ec91679 100644
--- a/src/torcontrol/TorControl.h
+++ b/src/torcontrol/TorControl.h
@@ -81,6 +81,8 @@ public:
   bool authenticate(const QByteArray cookie, QString *errmsg = 0);
   /** Sends an authentication password to Tor. */
   bool authenticate(const QString &password = QString(), QString *errmsg = 0);
+  /** Returns true if the process has passed through auth successfully */
+  bool isAuthenticated();
 
   /** Sends a PROTOCOLINFO command to Tor and parses the response. */
   ProtocolInfo protocolInfo(QString *errmsg = 0);
@@ -413,6 +415,9 @@ private:
   bool _shouldContinue;
   QString _reason;
 
+  /** True when the process has passed through the auth successfully */
+  bool _authenticated;
+
   /** Send a message to Tor and read the response */
   bool send(ControlCommand cmd, ControlReply &reply, QString *errmsg = 0);
   /** Send a message to Tor and discard the response */





More information about the tor-commits mailing list