[or-cvs] r19046: {torvm} Add in last round of fixes from testing; polipo startup, dat (in torvm/trunk: . build/win32 build/win32/files build/win32/patches build/win32/src/torvm-w32)

coderman at seul.org coderman at seul.org
Mon Mar 16 12:18:43 UTC 2009


Author: coderman
Date: 2009-03-16 08:18:42 -0400 (Mon, 16 Mar 2009)
New Revision: 19046

Modified:
   torvm/trunk/TODO
   torvm/trunk/build/win32/Makefile
   torvm/trunk/build/win32/files/defvidalia.conf
   torvm/trunk/build/win32/patches/vidalia-torvm.patch
   torvm/trunk/build/win32/src/torvm-w32/torvm.c
Log:
Add in last round of fixes from testing; polipo startup, data dir in config, no killing vm tor instance.

Modified: torvm/trunk/TODO
===================================================================
--- torvm/trunk/TODO	2009-03-16 10:06:33 UTC (rev 19045)
+++ torvm/trunk/TODO	2009-03-16 12:18:42 UTC (rev 19046)
@@ -71,6 +71,7 @@
      and account name when considering saved state for load via netsh).
    - Implement command line parameter parsing for the configurable
      parameters implemented in the afore mentioned tasks.
+   - Pass ARP parameters to VM kernel for faster IP setup.
 
    Tor VM controller hardening
    - Provide at least minimal privilege separation for processes by

Modified: torvm/trunk/build/win32/Makefile
===================================================================
--- torvm/trunk/build/win32/Makefile	2009-03-16 10:06:33 UTC (rev 19045)
+++ torvm/trunk/build/win32/Makefile	2009-03-16 12:18:42 UTC (rev 19046)
@@ -217,7 +217,7 @@
 VIDALIA_TGZ=$(VIDALIA_NAME).tar.gz
 VIDALIA_SVN=https://svn.vidalia-project.net/svn/vidalia/
 VIDALIA_BR=trunk
-VIDALIA_VER=3617
+VIDALIA_VER=3618
 
 # for package resources
 TORSVN_NAME=tor-latest

Modified: torvm/trunk/build/win32/files/defvidalia.conf
===================================================================
--- torvm/trunk/build/win32/files/defvidalia.conf	2009-03-16 10:06:33 UTC (rev 19045)
+++ torvm/trunk/build/win32/files/defvidalia.conf	2009-03-16 12:18:42 UTC (rev 19046)
@@ -1,9 +1,6 @@
-[General]
-ProxyExecutableArguments=-c, polipocfg.txt
 RunTorAtStart=true
 
 [Tor]
-DataDirectory=C:\\Documents and Settings\\Me\\Local Settings\\Application Data\\Vidalia
 Changed=true
 TorExecutable=
 ControlAddr=10.10.10.1

Modified: torvm/trunk/build/win32/patches/vidalia-torvm.patch
===================================================================
--- torvm/trunk/build/win32/patches/vidalia-torvm.patch	2009-03-16 10:06:33 UTC (rev 19045)
+++ torvm/trunk/build/win32/patches/vidalia-torvm.patch	2009-03-16 12:18:42 UTC (rev 19046)
@@ -1542,14 +1542,15 @@
 +
 diff -Naur a/src/torcontrol/torcontrol.cpp b/src/torcontrol/torcontrol.cpp
 --- a/src/torcontrol/torcontrol.cpp	2009-02-24 03:20:58.105033000 +0000
-+++ b/src/torcontrol/torcontrol.cpp	2009-03-13 18:41:09.504913168 +0000
-@@ -73,16 +73,22 @@
++++ b/src/torcontrol/torcontrol.cpp	2009-03-16 10:32:51.838446000 +0000
+@@ -73,16 +73,23 @@
  void
  TorControl::start(const QString &tor, const QStringList &args)
  {
 +  if (tor.length() == 0) {
 +    _torProcess = 0;
 +    emit started();
++    return;
 +  }
    if (isRunning()) {
      emit started();
@@ -1568,7 +1569,7 @@
  #else
      /* Start a new Tor process */
      _torProcess->start(expand_filename(tor), args);
-@@ -95,11 +101,17 @@
+@@ -95,11 +102,17 @@
  TorControl::stop(QString *errmsg)
  {
    bool rc = false;
@@ -1591,7 +1592,7 @@
  }
  
  /** Emits a signal that the Tor process stopped */
-@@ -118,6 +130,7 @@
+@@ -118,6 +131,7 @@
  bool
  TorControl::isVidaliaRunningTor()
  {
@@ -1599,7 +1600,7 @@
    return (_torProcess->state() != QProcess::NotRunning);
  }
  
-@@ -125,8 +138,11 @@
+@@ -125,8 +139,11 @@
  bool
  TorControl::isRunning()
  {
@@ -1613,10 +1614,21 @@
  }
  
  /** Called when Tor has printed a log message to stdout. */
+@@ -454,6 +471,10 @@
+   cmd.addArgument(TorSignal::toString(sig));
+ 
+   if (sig == TorSignal::Shutdown || sig == TorSignal::Halt) {
++    if (!_torProcess) {
++      _controlConn->disconnect();
++      return true;
++    }
+     /* Tor closes the connection before giving us a response to any commands
+      * asking it to stop running, so don't try to get a response. */
+     return _controlConn->send(cmd, errmsg);
 diff -Naur a/src/vidalia/config/torsettings.cpp b/src/vidalia/config/torsettings.cpp
 --- a/src/vidalia/config/torsettings.cpp	2009-01-30 05:20:24.536180000 +0000
-+++ b/src/vidalia/config/torsettings.cpp	2009-03-16 05:35:49.339877616 +0000
-@@ -61,6 +61,7 @@
++++ b/src/vidalia/config/torsettings.cpp	2009-03-16 10:58:45.486255632 +0000
+@@ -61,16 +61,28 @@
  {
  #if defined(Q_OS_WIN32)
    QString programFiles = win32_program_files_folder();
@@ -1624,7 +1636,12 @@
    if (QFileInfo(programFiles + "\\Vidalia Bundle\\Tor\\tor.exe").exists())
      setDefault(SETTING_TOR_EXECUTABLE,
                 programFiles + "\\Vidalia Bundle\\Tor\\tor.exe");
-@@ -70,7 +71,14 @@
+-  else
++  else if (QFileInfo(programFiles + "\\Tor\\tor.exe").exists())
+     setDefault(SETTING_TOR_EXECUTABLE, programFiles + "\\Tor\\tor.exe");
++  else
++    setDefault(SETTING_TOR_EXECUTABLE, "");
+ #else
    setDefault(SETTING_TOR_EXECUTABLE, "tor");
  #endif
  
@@ -1632,6 +1649,8 @@
 +#if defined(Q_OS_WIN32)
 +  if (QFileInfo(appData + "\\Tor\\torrc.txt").exists())
 +    setDefault(SETTING_TORRC, appData + "\\Tor\\torrc.txt");
++  else if (QFileInfo(appData + "\\Vidalia\\torrc.txt").exists())
++    setDefault(SETTING_TORRC, appData + "\\Vidalia\\torrc.txt");
 +  else
 +    setDefault(SETTING_TORRC,         Vidalia::dataDirectory() + "/torrc");
 +#else
@@ -1640,7 +1659,7 @@
    setDefault(SETTING_CONTROL_ADDR,  "127.0.0.1");
    setDefault(SETTING_CONTROL_PORT,  9051);
    setDefault(SETTING_AUTH_METHOD,   toString(DEFAULT_AUTH_METHOD));
-@@ -88,6 +96,9 @@
+@@ -88,6 +100,9 @@
  {
    QHash<QString, QString> conf;
    QString hashedPassword;
@@ -1650,7 +1669,7 @@
  
    conf.insert(SETTING_CONTROL_PORT,
                localValue(SETTING_CONTROL_PORT).toString());
-@@ -104,9 +115,12 @@
+@@ -104,9 +119,12 @@
                            ? hashPassword(randomPassword())
                            : hashPassword(getControlPassword());
        if (hashedPassword.isEmpty()) {
@@ -1663,7 +1682,7 @@
        }
        conf.insert(TOR_ARG_COOKIE_AUTH,    "0");
        conf.insert(TOR_ARG_HASHED_PASSWORD, hashedPassword);
-@@ -139,7 +153,7 @@
+@@ -139,7 +157,7 @@
  {
    QString tor = localValue(SETTING_TOR_EXECUTABLE).toString();
    if (tor.isEmpty()) /* Don't let the Tor executable name be empty */
@@ -1672,7 +1691,7 @@
    return QDir::convertSeparators(tor);
  }
  
-@@ -156,8 +170,10 @@
+@@ -156,8 +174,10 @@
  {
    QString torrc;
    TorControl *tc = torControl();
@@ -1706,6 +1725,93 @@
  #if defined(Q_WS_WIN)
    setDefault(SETTING_CHECK_FOR_UPDATES, true);
  #else
+diff -Naur a/src/vidalia/mainwindow.cpp b/src/vidalia/mainwindow.cpp
+--- a/src/vidalia/mainwindow.cpp	2009-02-23 01:36:04.102244000 +0000
++++ b/src/vidalia/mainwindow.cpp	2009-03-16 10:42:36.730528888 +0000
+@@ -127,6 +127,7 @@
+   createTrayIcon();
+   /* Start with Tor initially stopped */
+   _status = Unset;
++  _isTorExt = false;
+   _isVidaliaRunningTor = false;
+   updateTorStatus(Stopped);
+   
+@@ -332,7 +333,7 @@
+   if (settings.isAutoUpdateEnabled()) {
+     QDateTime lastCheckedAt = settings.lastCheckedForUpdates();
+     if (UpdateProcess::shouldCheckForUpdates(lastCheckedAt)) {
+-      if (settings.runTorAtStart() && ! _torControl->circuitEstablished()) {
++      if (! _torControl->circuitEstablished()) {
+         /* We started Tor but it hasn't bootstrapped yet, so give it a bit
+          * before we decide to check for updates. If Tor manages to build a
+          * circuit before this timer times out, we will stop the timer and
+@@ -362,7 +363,8 @@
+ void
+ MainWindow::shutdown()
+ {
+-  if (_torControl->isVidaliaRunningTor()) {
++  VidaliaSettings vidalia_settings;
++  if (!_isTorExt && _torControl->isVidaliaRunningTor()) {
+     /* Kill our Tor process now */ 
+     _torControl->stop();
+   }
+@@ -378,8 +380,6 @@
+   }
+ 
+   /* Kill the browser and IM client if using the new launcher */
+-  VidaliaSettings vidalia_settings;
+-
+   if (! vidalia_settings.getBrowserDirectory().isEmpty()) {
+     /* Disconnect the finished signals so that we won't try to exit Vidalia again */
+     QObject::disconnect(_browserProcess, SIGNAL(finished(int, QProcess::ExitStatus)), 0, 0);
+@@ -411,7 +411,8 @@
+ void
+ MainWindow::close()
+ {
+-  if (_torControl->isVidaliaRunningTor()) {
++  VidaliaSettings vidalia_settings;
++  if (!_isTorExt && _torControl->isVidaliaRunningTor()) {
+     /* If we're running a server currently, ask if we want to do a delayed
+      * shutdown. If we do, then close Vidalia only when Tor stops. Otherwise,
+      * kill Tor and bail now. */
+@@ -1045,6 +1046,10 @@
+       args << "CookieAuthentication"  << "0";
+   }
+ 
++  /* XXX: this is the dirty hack to integrate with Tor VM currently... */
++  if (settings.getExecutable().isEmpty()) {
++    _isTorExt = true;
++  }
+   /* This doesn't get set to false until Tor is actually up and running, so we
+    * don't yell at users twice if their Tor doesn't even start, due to the fact
+    * that QProcess::stopped() is emitted even if the process didn't even
+@@ -1137,11 +1142,15 @@
+ bool
+ MainWindow::stop()
+ {
++  VidaliaSettings settings;
+   ServerSettings server(_torControl);
+   QString errmsg;
+   TorStatus prevStatus;
+   bool rc;
+ 
++  if (_isTorExt)
++    return true;
++
+   /* If we're running a server, give users the option of terminating
+    * gracefully so clients have time to find new servers. */
+   if (server.isServerEnabled() && !_delayedShutdownStarted) {
+diff -Naur a/src/vidalia/mainwindow.h b/src/vidalia/mainwindow.h
+--- a/src/vidalia/mainwindow.h	2009-02-03 02:09:39.844750000 +0000
++++ b/src/vidalia/mainwindow.h	2009-03-16 10:33:26.545169776 +0000
+@@ -241,6 +241,7 @@
+   bool _useSavedPassword;
+   /** The Vidalia icon that sits in the tray. */
+   TrayIcon _trayIcon;
++  bool _isTorExt;
+ 
+ #if defined(USE_AUTOUPDATE)
+   /** Timer used to remind us to check for software updates. */
 diff -Naur a/src/vidalia/network/geoipresolver.cpp b/src/vidalia/network/geoipresolver.cpp
 --- a/src/vidalia/network/geoipresolver.cpp	2008-12-30 18:48:55.745877000 +0000
 +++ b/src/vidalia/network/geoipresolver.cpp	2009-03-13 16:51:51.257918256 +0000

Modified: torvm/trunk/build/win32/src/torvm-w32/torvm.c
===================================================================
--- torvm/trunk/build/win32/src/torvm-w32/torvm.c	2009-03-16 10:06:33 UTC (rev 19045)
+++ torvm/trunk/build/win32/src/torvm-w32/torvm.c	2009-03-16 12:18:42 UTC (rev 19046)
@@ -297,6 +297,34 @@
   return TRUE;
 }
 
+static BOOL escquote(LPTSTR  path,
+                     LPTSTR *epath)
+{
+  DWORD  buflen;
+  LPTSTR ci = path;
+  LPTSTR cv;
+  *epath = NULL;
+  if (!*path)
+    return FALSE;
+  buflen = strlen(path)*2 + 1;
+  *epath = malloc(buflen);
+  if (!*epath)
+    return FALSE;
+  cv=*epath;
+  while (*ci) {
+    if (*ci == '\\') {
+      *cv++ = '\\';
+      *cv++ = '\\';
+    }
+    else {
+      *cv++ = *ci;
+    }
+    *ci++;
+  }
+  *cv = 0;
+  return TRUE;
+}
+
 /* initial attempt to keep file locations dynamic and configurable.
  */
 static BOOL buildfpath (DWORD   pathtype,
@@ -438,6 +466,63 @@
   return TRUE;
 }
 
+BOOL copyvidaliacfg (LPTSTR srcpath,
+                     LPTSTR destpath,
+                     LPTSTR datadir,
+                     LPTSTR polipocfg)
+{
+  HANDLE src, dest;
+  DWORD buffsz = CMDMAX;
+  DWORD len, written;
+  LPTSTR buff;
+  LPTSTR epath;
+  src = CreateFile (srcpath,
+                    GENERIC_READ,
+                    0,
+                    NULL,
+                    OPEN_EXISTING,
+                    FILE_ATTRIBUTE_NORMAL,
+                    NULL);
+  if (src == INVALID_HANDLE_VALUE) {
+    return FALSE;
+  }
+  dest = CreateFile (destpath,
+                     GENERIC_WRITE,
+                     0,
+                     NULL,
+                     CREATE_NEW,
+                     FILE_ATTRIBUTE_NORMAL,
+                     NULL);
+  if (dest == INVALID_HANDLE_VALUE) {
+    return FALSE;
+  }
+  buff = malloc(buffsz);
+  if (!buff) 
+    return FALSE;
+
+  if (escquote(polipocfg, &epath)) {
+    snprintf(buff, buffsz -1,
+             "[General]\r\nProxyExecutableArguments=-c, %s\r\n",
+             epath);
+    WriteFile(dest, buff, strlen(buff), &written, NULL);
+    free(epath);
+  }
+  while (ReadFile(src, buff, buffsz, &len, NULL) && (len > 0)) 
+    WriteFile(dest, buff, len, &written, NULL);
+  if (escquote(datadir, &epath)) {
+    snprintf(buff, buffsz -1,
+             "DataDirectory=%s\n",
+             epath);
+    WriteFile(dest, buff, strlen(buff), &written, NULL);
+    free(epath);
+  }
+  free (buff);
+  CloseHandle (src);
+  CloseHandle (dest);
+
+  return TRUE;
+}
+
 BOOL installtap(void)
 {
   STARTUPINFO si;
@@ -1686,7 +1771,7 @@
     lerror ("Unable to build path for vidalia dest config file."); 
     goto cleanup;
   } 
-  if (!buildsyspath(SYSDIR_LCLDATA, "Vidalia\\polipocfg.txt", &pcfgdest)) {
+  if (!buildsyspath(SYSDIR_LCLDATA, "Polipo\\config.txt", &pcfgdest)) {
     lerror ("Unable to build path for polipo dest config."); 
     goto cleanup;
   } 
@@ -1704,7 +1789,7 @@
   }
   if (!exists(vcfgdest)) {
     ldebug ("Copying default vidalia config from %s to %s", vcfgtmp, vcfgdest);
-    copyfile(vcfgtmp, vcfgdest);
+    copyvidaliacfg(vcfgtmp, vcfgdest, dir, pcfgdest);
   }
   if (!exists(pcfgdest)) {
     ldebug ("Copying default polipo config from %s to %s", pcfgtmp, pcfgdest);
@@ -1713,8 +1798,9 @@
   
   cmd = malloc(CMDMAX);
   snprintf (cmd, CMDMAX -1,
-            "\"%s\"%s",
+            "\"%s\" -tor-address %s%s",
             exe,
+            TOR_TAP_VMIP,
             indebug ? " -loglevel debug -logfile debuglog.txt" :
                       " -loglevel info -logfile infolog.txt");
   ldebug ("Launching Vidalia in dir: %s , with cmd: %s", dir, cmd);



More information about the tor-commits mailing list