[tor-commits] [vidalia/alpha] Implement wizard for first run

chiiph at torproject.org chiiph at torproject.org
Fri Mar 30 19:55:52 UTC 2012


commit baa7e2d3a6b66e8e766c1099ccea29ee0ab877c9
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Thu Mar 29 17:57:04 2012 -0300

    Implement wizard for first run
---
 changes/bug2905                          |    6 +++++
 src/vidalia/CMakeLists.txt               |    2 +
 src/vidalia/MainWindow.cpp               |   33 ++++++++++++++++++++++++-----
 src/vidalia/MainWindow.h                 |    7 ++++++
 src/vidalia/config/AdvancedPage.cpp      |   20 ++++++++++++++++++
 src/vidalia/config/AdvancedPage.h        |   10 +++++++++
 src/vidalia/config/AdvancedPage.ui       |    2 +-
 src/vidalia/config/NetworkSettings.cpp   |    4 +++
 src/vidalia/config/TorSettings.cpp       |   25 ++++++++++++++++++++++
 src/vidalia/config/TorSettings.h         |    6 +++++
 src/vidalia/config/torrc/TorrcParser.cpp |    1 +
 11 files changed, 109 insertions(+), 7 deletions(-)

diff --git a/changes/bug2905 b/changes/bug2905
new file mode 100644
index 0000000..3eae285
--- /dev/null
+++ b/changes/bug2905
@@ -0,0 +1,6 @@
+  New Features:
+  o Add a wizard for the special cases where the user starts Vidalia
+    while tor has DisableNetwork=1 or the Panic feature enabled. This
+    wizard is meant to warn the user about either the Panic feature or
+    that she might need to configure a proxy or a bridge before tor
+    connects to the outside world. Fixes ticket 2905.
\ No newline at end of file
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 86f755a..30e2a9f 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -182,6 +182,7 @@ set(vidalia_SRCS ${vidalia_SRCS}
   VidaliaTab.cpp
   StatusTab.cpp
   HelperProcess.cpp
+  FirstRunWizard.cpp
 )
 qt4_wrap_cpp(vidalia_SRCS
   Vidalia.h
@@ -194,6 +195,7 @@ qt4_wrap_cpp(vidalia_SRCS
   VidaliaTab.h
   StatusTab.h
   HelperProcess.h
+  FirstRunWizard.h
 )
 
 if (USE_MINIUPNPC)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index b203b84..741f55e 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -23,6 +23,7 @@
 #include "VMessageBox.h"
 #include "TorSettings.h"
 #include "ServerSettings.h"
+#include "NetworkSettings.h"
 #include "AboutDialog.h"
 #include "HelpBrowser.h"
 #include "VAttachButton.h"
@@ -41,6 +42,8 @@
 #include "PluginWrapper.h"
 #include "DebugDialog.h"
 
+#include "FirstRunWizard.h"
+
 #include <QtGui>
 
 #ifdef Q_WS_MAC
@@ -138,13 +141,17 @@ MainWindow::MainWindow()
   VidaliaWindow::setVisible(settings.showMainWindowAtStart());
 #endif
 
+  TorSettings tor_settings(_torControl);
+
   if(settings.firstRun()) {
-    if(settings.allowPanic())
-      VMessageBox::warning(this, tr("Panic is enabled"),
-                           tr("<b>WARNING:</b> The Panic button is enabled. Use "
-                              "it carefully because it will remove Tor completely."),
-                           VMessageBox::Ok|VMessageBox::Default);
-    settings.setFirstRun(false);
+    if(tor_settings.getDisableNetwork() or settings.allowPanic()) {
+      _wizard = new FirstRunWizard(this, settings.allowPanic(), tor_settings.getDisableNetwork());
+      _wizard->show();
+      connect(_wizard, SIGNAL(accepted()),
+              this, SLOT(enableNetwork()));
+
+      settings.setFirstRun(false);
+    }
   }
 }
 
@@ -154,6 +161,20 @@ MainWindow::~MainWindow()
   delete _engine;
 }
 
+/** Called when the user has finished the first run wizard */
+void
+MainWindow::enableNetwork()
+{
+  TorSettings tor_settings(_torControl);
+  tor_settings.setDisableNetwork(false);
+  QString errmsg;
+  if(not tor_settings.apply(&errmsg))
+    VMessageBox::warning(this, tr("Error finishing apply of first run settings"),
+                         tr("Error: %1").arg(errmsg),
+                         VMessageBox::Ok|VMessageBox::Default);
+}
+
+
 /** Calls the different methods that will handle the GUI "creation".
  * It's called once at the MainWindow creation. */
 void
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 5acd2ee..4a34ee3 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -42,6 +42,8 @@
 #include <QTimer>
 #include <QSystemTrayIcon>
 
+class FirstRunWizard;
+
 class MainWindow : public VidaliaWindow
 {
   Q_OBJECT
@@ -198,6 +200,9 @@ private slots:
   void upnpError(UPNPControl::UPNPError error);
 #endif
 
+  /** Called when the user has finished the first run wizard */
+  void enableNetwork();
+
 private:
   enum TorStatus {
     Unset,      /**< Tor's status has not yet been set. */
@@ -319,6 +324,8 @@ private:
   QString _previousSocksPort; /**< Holds the previous socksport used */
 
   bool _pressedStop; /**< True if the user has pressed the Stop Tor button */
+
+  FirstRunWizard *_wizard; /**< Wizard displayed when running Vidalia for the first time */
 };
 
 #endif
diff --git a/src/vidalia/config/AdvancedPage.cpp b/src/vidalia/config/AdvancedPage.cpp
index 084d17c..8e617fd 100644
--- a/src/vidalia/config/AdvancedPage.cpp
+++ b/src/vidalia/config/AdvancedPage.cpp
@@ -478,3 +478,23 @@ AdvancedPage::browsePanicPath()
   if (!panicPath.isEmpty())
     ui.linePanicPath->setText(panicPath);
 }
+
+/** Hides the specified group */
+void
+AdvancedPage::hideGroup(ConfigGroup group)
+{
+  switch(group) {
+  case Control:
+    ui.grpControlPort->hide();
+    break;
+  case ConfigurationFile:
+    ui.grpTorConfigFile->hide();
+    break;
+  case DataDirectory:
+    ui.grpTorDataDirectory->hide();
+    break;
+  case Panic:
+    ui.grpPanic->hide();
+    break;
+  }
+}
diff --git a/src/vidalia/config/AdvancedPage.h b/src/vidalia/config/AdvancedPage.h
index ab91d0e..11cd6b6 100644
--- a/src/vidalia/config/AdvancedPage.h
+++ b/src/vidalia/config/AdvancedPage.h
@@ -28,6 +28,13 @@ class AdvancedPage : public ConfigPage
   Q_OBJECT
 
 public:
+  enum ConfigGroup {
+    Control,
+    ConfigurationFile,
+    DataDirectory,
+    Panic
+  };
+
   /** Default Constructor */
   AdvancedPage(QWidget *parent = 0);
   /** Default Destructor */
@@ -50,6 +57,9 @@ public:
   /** Called when the user changes the UI translation. */
   virtual void retranslateUi();
 
+  /** Hides the specified group */
+  void hideGroup(ConfigGroup group);
+
 signals:
   /** Emitted when the user changes torrc file to restart Tor */
   void restartTor();
diff --git a/src/vidalia/config/AdvancedPage.ui b/src/vidalia/config/AdvancedPage.ui
index a9c97fa..58631cd 100644
--- a/src/vidalia/config/AdvancedPage.ui
+++ b/src/vidalia/config/AdvancedPage.ui
@@ -415,7 +415,7 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox">
+    <widget class="QGroupBox" name="grpPanic">
      <property name="title">
       <string>Panic</string>
      </property>
diff --git a/src/vidalia/config/NetworkSettings.cpp b/src/vidalia/config/NetworkSettings.cpp
index bb4e7ba..21c41c7 100644
--- a/src/vidalia/config/NetworkSettings.cpp
+++ b/src/vidalia/config/NetworkSettings.cpp
@@ -65,6 +65,10 @@ bool
 NetworkSettings::apply(QString *errmsg)
 {
   quint32 torVersion = torControl()->getTorVersion();
+  // If there is no tor version, asume the greatest
+  if(not torVersion)
+    torVersion = 0xffffff;
+
   Torrc *torrc = Vidalia::torrc();
   QStringList clearKeys;
 
diff --git a/src/vidalia/config/TorSettings.cpp b/src/vidalia/config/TorSettings.cpp
index fe7e4c1..b7da39a 100644
--- a/src/vidalia/config/TorSettings.cpp
+++ b/src/vidalia/config/TorSettings.cpp
@@ -47,6 +47,7 @@
 #define SETTING_BOOTSTRAP            "Bootstrap"
 #define SETTING_BOOTSTRAP_FROM       "BootstrapFrom"
 #define SETTING_AUTOCONTROL          "AutoControl"
+#define SETTING_DISABLE_NETWORK      "DisableNetwork"
 
 /** Default to using hashed password authentication */
 #define DEFAULT_AUTH_METHOD     PasswordAuth
@@ -97,6 +98,7 @@ TorSettings::TorSettings(TorControl *torControl)
   setDefault(SETTING_BOOTSTRAP, false);
   setDefault(SETTING_BOOTSTRAP_FROM, "");
   setDefault(SETTING_AUTOCONTROL, false);
+  setDefault(SETTING_DISABLE_NETWORK, false);
 }
 
 /** Applies any changes to Tor's control port or authentication settings. */
@@ -156,6 +158,9 @@ TorSettings::apply(QString *errmsg)
       torrc->setValue(TOR_ARG_HASHED_PASSWORD, "");
   }
 
+  torrc->setValue(SETTING_DISABLE_NETWORK,
+                  volatileValue(SETTING_DISABLE_NETWORK).toBool() ? "1" : "0");
+
   return torrc->apply(Vidalia::torControl(), errmsg);
 }
 
@@ -446,6 +451,26 @@ TorSettings::setRejectPlaintextPorts(const QList<quint16> &ports)
   setValue(SETTING_REJECT_PLAINTEXT_PORTS, rejectList.join(","));
 }
 
+/** Returns the value for the DisableNetwork option */
+bool
+TorSettings::getDisableNetwork() const
+{
+  bool val = false;
+  with_torrc_value(SETTING_DISABLE_NETWORK) {
+    val = (bool)ret.at(0).toUInt();
+  }
+
+  return val;
+}
+
+/** Sets the DisableNetwork property for tor. When enabled, tor
+ * won't try to reach any node. */
+void
+TorSettings::setDisableNetwork(bool val)
+{
+  setVolatileValue(SETTING_DISABLE_NETWORK, val);
+}
+
 /** Returns the string description of the authentication method specified by
  * <b>method</b>. The authentication method string is stored in Vidalia's
  * configuration file. */
diff --git a/src/vidalia/config/TorSettings.h b/src/vidalia/config/TorSettings.h
index 1352518..6feabe7 100644
--- a/src/vidalia/config/TorSettings.h
+++ b/src/vidalia/config/TorSettings.h
@@ -127,6 +127,12 @@ public:
    * when the user tries to connect to one of them. */
   void setRejectPlaintextPorts(const QList<quint16> &ports);
 
+  /** Returns the value for the DisableNetwork option */
+  bool getDisableNetwork() const;
+  /** Sets the DisableNetwork property for tor. When enabled, tor
+   * won't try to reach any node. */
+  void setDisableNetwork(bool val);
+
   /** Generates a random control password consisting of PASSWORD_LEN
    * characters. */
   static QString randomPassword();
diff --git a/src/vidalia/config/torrc/TorrcParser.cpp b/src/vidalia/config/torrc/TorrcParser.cpp
index 2c5c679..bdcd618 100644
--- a/src/vidalia/config/torrc/TorrcParser.cpp
+++ b/src/vidalia/config/torrc/TorrcParser.cpp
@@ -87,6 +87,7 @@ TorrcParser::TorrcParser()
   _torOpts << TorOpt("DirServer", TorOpt::LineList, "");
   _torOpts << TorOpt("DisableAllSwap", TorOpt::Boolean, "0");
   _torOpts << TorOpt("DisableIOCP", TorOpt::Boolean, "1");
+  _torOpts << TorOpt("DisableNetwork", TorOpt::Boolean, "0");
   _torOpts << TorOpt("DNSPort", TorOpt::LineList, "");
   _torOpts << TorOpt("DNSListenAddress", TorOpt::LineList, "");
   _torOpts << TorOpt("DownloadExtraInfo", TorOpt::Boolean, "0");





More information about the tor-commits mailing list