[tor-commits] [vidalia/alpha] Allow picking entry nodes

chiiph at torproject.org chiiph at torproject.org
Tue Jun 12 23:29:43 UTC 2012


commit b73d1cb047a4d478550fe946d2be1360da1e7367
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Tue Jun 12 20:19:46 2012 -0300

    Allow picking entry nodes
---
 changes/pickExitNodes                    |    6 ++--
 src/vidalia/config/AdvancedPage.cpp      |    2 +
 src/vidalia/config/TorSettings.cpp       |   27 +++++++++++++++++++
 src/vidalia/config/TorSettings.h         |    5 +++
 src/vidalia/config/VidaliaSettings.cpp   |   12 ++++++++
 src/vidalia/config/VidaliaSettings.h     |    8 ++++++
 src/vidalia/network/RouterListItem.cpp   |   31 ++++++++++++++++++++++
 src/vidalia/network/RouterListItem.h     |    7 +++++
 src/vidalia/network/RouterListWidget.cpp |   41 +++++++++++++++++++++++++++++-
 src/vidalia/network/RouterListWidget.h   |    2 +
 10 files changed, 137 insertions(+), 4 deletions(-)

diff --git a/changes/pickExitNodes b/changes/pickExitNodes
index 32ebd1a..8751db8 100644
--- a/changes/pickExitNodes
+++ b/changes/pickExitNodes
@@ -1,9 +1,9 @@
   New features:
-  o Provide a way of hand picking exit nodes from the router list in
-  the Network Map.
+  o Provide a way of hand picking entry and exit nodes from the
+    router list in the Network Map.
 
   Internal cleanups and improvements:
   o Fix return value from VMessageBox::question.
   o Make TorControl::getRouterDescriptorText() default to regular
     descriptors in case the microdescriptor is not available.
-  o Improve handling of ControlPort and SocksPort settings.
\ No newline at end of file
+  o Improve handling of ControlPort and SocksPort settings.
diff --git a/src/vidalia/config/AdvancedPage.cpp b/src/vidalia/config/AdvancedPage.cpp
index 51214a4..a97c079 100644
--- a/src/vidalia/config/AdvancedPage.cpp
+++ b/src/vidalia/config/AdvancedPage.cpp
@@ -272,6 +272,8 @@ AdvancedPage::load()
 
   /** We need to keep the ExitNodes settings, even if we don't use it here */
   _settings->setExitNodes(_settings->exitNodes());
+  /** ... and the same for entry nodes */
+  _settings->setEntryNodes(_settings->entryNodes());
 }
 
 /** Called when the user selects a different authentication method from the
diff --git a/src/vidalia/config/TorSettings.cpp b/src/vidalia/config/TorSettings.cpp
index df56b12..c1dcb1a 100644
--- a/src/vidalia/config/TorSettings.cpp
+++ b/src/vidalia/config/TorSettings.cpp
@@ -49,6 +49,7 @@
 #define SETTING_AUTOCONTROL          "AutoControl"
 #define SETTING_DISABLE_NETWORK      "DisableNetwork"
 #define SETTING_EXITNODES            "ExitNodes"
+#define SETTING_ENTRYNODES           "EntryNodes"
 
 /** Default to using hashed password authentication */
 #define DEFAULT_AUTH_METHOD     PasswordAuth
@@ -176,6 +177,14 @@ TorSettings::apply(QString *errmsg)
     torrc->setValue(SETTING_EXITNODES, exitNodes);
   }
 
+  QString entryNodes = volatileValue(SETTING_ENTRYNODES).toString();
+
+  if (entryNodes.isEmpty()) {
+    torrc->clear(QStringList() << SETTING_ENTRYNODES);
+  } else {
+    torrc->setValue(SETTING_ENTRYNODES, entryNodes);
+  }
+
   return torrc->apply(Vidalia::torControl(), errmsg);
 }
 
@@ -606,3 +615,21 @@ TorSettings::setExitNodes(const QStringList &exitNodes)
 {
   setVolatileValue(SETTING_EXITNODES, exitNodes.join(","));
 }
+
+/** Returns the selected entry nodes */
+QStringList
+TorSettings::entryNodes() const
+{
+  QStringList entryNodes;
+  with_torrc_value(SETTING_ENTRYNODES) {
+    entryNodes = ret.at(0).split(",");
+  }
+  return entryNodes;
+}
+
+/** Sets the entry nodes to the specified list */
+void
+TorSettings::setEntryNodes(const QStringList &entryNodes)
+{
+  setVolatileValue(SETTING_ENTRYNODES, entryNodes.join(","));
+}
diff --git a/src/vidalia/config/TorSettings.h b/src/vidalia/config/TorSettings.h
index a8c6e06..e995ba7 100644
--- a/src/vidalia/config/TorSettings.h
+++ b/src/vidalia/config/TorSettings.h
@@ -154,6 +154,11 @@ public:
   /** Sets the exit nodes to the specified list */
   void setExitNodes(const QStringList &exitNodes);
 
+  /** Returns the selected entry nodes */
+  QStringList entryNodes() const;
+  /** Sets the entry nodes to the specified list */
+  void setEntryNodes(const QStringList &entryNodes);
+
 private:
   /** Returns the AuthenticationMethod enum value for the string
    * description of the authentication method given in <b>authMethod</b>. */
diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp
index 8386d64..03dde13 100644
--- a/src/vidalia/config/VidaliaSettings.cpp
+++ b/src/vidalia/config/VidaliaSettings.cpp
@@ -393,3 +393,15 @@ VidaliaSettings::setDontWarnExitNodes(bool val)
 {
   setValue(SETTING_REMEMBER_DONTWARNEXIT, val);
 }
+
+bool
+VidaliaSettings::dontWarnEntryNodes() const
+{
+  return value(SETTING_REMEMBER_DONTWARNENTRY).toBool();
+}
+
+void
+VidaliaSettings::setDontWarnEntryNodes(bool val)
+{
+  setValue(SETTING_REMEMBER_DONTWARNENTRY, val);
+}
diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h
index 68cbd3b..43a9600 100644
--- a/src/vidalia/config/VidaliaSettings.h
+++ b/src/vidalia/config/VidaliaSettings.h
@@ -23,6 +23,7 @@
 /** Public setting keys */
 #define SETTING_REMEMBER_SHUTDOWN      "RememberShutdown"
 #define SETTING_REMEMBER_DONTWARNEXIT  "DontWarnExitNodes"
+#define SETTING_REMEMBER_DONTWARNENTRY "DontWarnEntryNodes"
 
 /** Handles saving and restoring Vidalia's settings, such as the
  * location of Tor, the control port, etc.
@@ -159,6 +160,13 @@ public:
   /** Sets wether Vidalia should warn the user when setting Exit nodes
    *  by hand */
   void setDontWarnExitNodes(bool val);
+
+  /** Returns true if Vidalia should warn the user when setting Entry
+   *  nodes by hand */
+  bool dontWarnEntryNodes() const;
+  /** Sets wether Vidalia should warn the user when setting Entry nodes
+   *  by hand */
+  void setDontWarnEntryNodes(bool val);
 };
 
 #endif
diff --git a/src/vidalia/network/RouterListItem.cpp b/src/vidalia/network/RouterListItem.cpp
index 3a961b4..480d5a8 100644
--- a/src/vidalia/network/RouterListItem.cpp
+++ b/src/vidalia/network/RouterListItem.cpp
@@ -28,6 +28,7 @@
 #define NONEXIT_COLOR   (Qt::white)
 #define EXIT_COLOR      (QColor::fromRgb(169, 207, 84))
 #define CANBEEXIT_COLOR (QColor::fromRgb(172, 209, 233))
+#define ENTRY_COLOR     (QColor::fromRgb(255, 144, 0))
 
 #define IMG_NODE_OFFLINE    ":/images/icons/node-unresponsive.png"
 #define IMG_NODE_SLEEPING   ":/images/icons/node-hibernating.png"
@@ -208,3 +209,33 @@ RouterListItem::showAsExit(bool exit)
     setBackground(NONEXIT_COLOR);
   }
 }
+
+/** Sets this item's background to selected entry color if entry is true */
+void
+RouterListItem::showAsSelectedEntry(bool entry)
+{
+  _selectedEntry = entry;
+  TorSettings settings;
+  QStringList entryNodes = settings.entryNodes();
+  bool changed = false;
+
+  if (entry) {
+    setBackground(ENTRY_COLOR);
+
+    if (entryNodes.indexOf(id()) == -1) {
+      entryNodes << id();
+      settings.setEntryNodes(entryNodes);
+      changed = true;
+    }
+  } else {
+    setBackground(NONEXIT_COLOR);
+    entryNodes.removeAll(id());
+    settings.setEntryNodes(entryNodes);
+    changed = true;
+  }
+
+  QString errmsg;
+  if (changed && !settings.apply(&errmsg)) {
+    vWarn(errmsg);
+  }
+}
diff --git a/src/vidalia/network/RouterListItem.h b/src/vidalia/network/RouterListItem.h
index 65904dd..db98364 100644
--- a/src/vidalia/network/RouterListItem.h
+++ b/src/vidalia/network/RouterListItem.h
@@ -61,6 +61,12 @@ public:
   /** Returns true if this item has been selected as exit */
   bool selectedExit() const { return _selectedExit; }
 
+  /** Sets this item's background to selected entry color if exit is true */
+  void showAsSelectedEntry(bool entry);
+
+  /** Returns true if this item has been selected as entry */
+  bool selectedEntry() const { return _selectedEntry; }
+
 private:
   RouterDescriptor* _rd;   /**< Descriptor for this router item. */
   RouterListWidget* _list; /**< The list for this list item. */
@@ -69,6 +75,7 @@ private:
   QString _countryCode;
 
   bool _selectedExit;      /**< True if this router has been selected for exit */
+  bool _selectedEntry;     /**< True if this router has been selected for exit */
 
   /** Sets the whole line to the given brush */
   void setBackground(const QBrush &brush);
diff --git a/src/vidalia/network/RouterListWidget.cpp b/src/vidalia/network/RouterListWidget.cpp
index 837c025..faa9a3e 100644
--- a/src/vidalia/network/RouterListWidget.cpp
+++ b/src/vidalia/network/RouterListWidget.cpp
@@ -59,7 +59,7 @@ RouterListWidget::retranslateUi()
 void
 RouterListWidget::contextMenuEvent(QContextMenuEvent *event)
 {
-  QAction *action, *routerInfoAction, *useAsExit;
+  QAction *action, *routerInfoAction, *useAsExit, *useAsEntry;
   QMenu *menu, *copyMenu;
   QList<QTreeWidgetItem *> selected;
 
@@ -100,6 +100,18 @@ RouterListWidget::contextMenuEvent(QContextMenuEvent *event)
     connect(useAsExit, SIGNAL(triggered()), this, SLOT(useAsExit()));
   }
 
+  useAsEntry = menu->addAction(QIcon(IMG_PLUS), tr("Use as Entry node"));
+  if (selected.size() > 1) {
+    useAsEntry->setEnabled(false);
+  } else {
+    if (item->selectedEntry()) {
+      useAsEntry->setText(tr("Do not use as Entry node"));
+      useAsEntry->setIcon(QIcon(IMG_MINUS));
+    }
+
+    connect(useAsEntry, SIGNAL(triggered()), this, SLOT(useAsEntry()));
+  }
+
   menu->exec(event->globalPos());
   delete menu;
 }
@@ -344,3 +356,30 @@ RouterListWidget::useAsExit()
     }
   }
 }
+
+/** Called when the Use as Entry node menu action is selected */
+void
+RouterListWidget::useAsEntry()
+{
+  foreach (QTreeWidgetItem *item, selectedItems()) {
+    RouterListItem *relay = dynamic_cast<RouterListItem *>(item);
+    VidaliaSettings settings;
+    if (!settings.dontWarnEntryNodes()) {
+      int res = VMessageBox::question(this, tr("You are about to set a fixed Entry node"),
+                                        tr("You need to understand that by doing this you might be "
+                                            "putting your anonymity at risk and/or limiting the "
+                                            "services you have available through Tor.\n\n"
+                                            "Do you still want to set this node as Entry?"),
+                                        VMessageBox::Yes,
+                                        VMessageBox::No|VMessageBox::Default,
+                                        VMessageBox::Cancel|VMessageBox::Escape,
+                                        "I know what I'm doing, do not remind me", &settings,
+                                        SETTING_REMEMBER_DONTWARNENTRY);
+
+        if (res == VMessageBox::Yes)
+          relay->showAsSelectedEntry(!relay->selectedEntry());
+      } else {
+        relay->showAsSelectedEntry(!relay->selectedEntry());
+      }
+  }
+}
diff --git a/src/vidalia/network/RouterListWidget.h b/src/vidalia/network/RouterListWidget.h
index 5b5be3c..fddfaa9 100644
--- a/src/vidalia/network/RouterListWidget.h
+++ b/src/vidalia/network/RouterListWidget.h
@@ -91,6 +91,8 @@ private slots:
   void displayRouterInfo();
   /** Called when the Use as Exit node menu action is selected */
   void useAsExit();
+  /** Called when the Use as Entry node menu action is selected */
+  void useAsEntry();
 
 protected:
   /** Called when the user presses a key while the list has focus. */





More information about the tor-commits mailing list