[tor-commits] [vidalia/alpha] Merge branch 'master' into alpha

chiiph at torproject.org chiiph at torproject.org
Thu May 5 20:14:15 UTC 2011


commit 70680a3325b820abf41bffc0eea1c7a7523ffaad
Merge: 5193835 d569712
Author: Tomas Touceda <chiiph at gentoo.org>
Date:   Thu May 5 17:09:54 2011 -0300

    Merge branch 'master' into alpha
    
    Conflicts:
    	src/vidalia/MainWindow.cpp
    	src/vidalia/help/content/po/templates/links.pot

 src/vidalia/MainWindow.cpp                      |    8 ++--
 src/vidalia/help/content/po/templates/links.pot |   46 +++++++++-------------
 2 files changed, 23 insertions(+), 31 deletions(-)

diff --cc src/vidalia/MainWindow.cpp
index d1fd2a4,860eae4..c373d01
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@@ -1038,116 -858,435 +1038,116 @@@ MainWindow::bootstrapStatusChanged(cons
    setStartupProgress(percentComplete, description);
  }
  
 -/** Updates the UI to reflect Tor's current <b>status</b>. Returns the
 - * previously set TorStatus value.*/
 -MainWindow::TorStatus
 -MainWindow::updateTorStatus(TorStatus status)
 -{
 -  QString statusText, actionText;
 -  QString trayIconFile, statusIconFile;
 -  TorStatus prevStatus = _status;
 - 
 -  vNotice("Tor status changed from '%1' to '%2'.")
 -    .arg(toString(prevStatus)).arg(toString(status));
 -  _status = status;
 -
 -  if (status == Stopped) {
 -      statusText = tr("Tor is not running");
 -      actionText = tr("Start Tor");
 -      trayIconFile = IMG_TOR_STOPPED;
 -      statusIconFile = IMG_TOR_STOPPED_48;
 -      _actionStartStopTor->setEnabled(true);
 -      _actionStartStopTor->setText(actionText);
 -      _actionStartStopTor->setIcon(QIcon(IMG_START_TOR_16));
 -      ui.lblStartStopTor->setEnabled(true);
 -      ui.lblStartStopTor->setText(actionText);
 -      ui.lblStartStopTor->setPixmap(QPixmap(IMG_START_TOR_48));
 -      ui.lblStartStopTor->setStatusTip(actionText);
 -
 -      /* XXX: This might need to be smarter if we ever start connecting other
 -       * slots to these triggered() and clicked() signals. */
 -      QObject::disconnect(_actionStartStopTor, SIGNAL(triggered()), this, 0);
 -      QObject::disconnect(ui.lblStartStopTor, SIGNAL(clicked()), this, 0);
 -      connect(_actionStartStopTor, SIGNAL(triggered()), this, SLOT(start()));
 -      connect(ui.lblStartStopTor, SIGNAL(clicked()), this, SLOT(start()));
 -      setStartupProgressVisible(false);
 -  } else if (status == Stopping) {
 -      if (_delayedShutdownStarted) {
 -        statusText = tr("Your relay is shutting down.\n" 
 -                        "Click 'Stop' again to stop your relay now.");
 -      } else {
 -        statusText = tr("Tor is shutting down");
 -      }
 -      trayIconFile = IMG_TOR_STOPPING;
 -      statusIconFile = IMG_TOR_STOPPING_48;
 -      
 -      ui.lblStartStopTor->setStatusTip(tr("Stop Tor Now"));
 -  } else if (status == Started) {
 -      actionText = tr("Stop Tor");
 -      _actionStartStopTor->setEnabled(true);
 -      _actionStartStopTor->setText(actionText);
 -      _actionStartStopTor->setIcon(QIcon(IMG_STOP_TOR_16));
 -      ui.lblStartStopTor->setEnabled(true);
 -      ui.lblStartStopTor->setText(actionText);
 -      ui.lblStartStopTor->setPixmap(QPixmap(IMG_STOP_TOR_48));
 -      ui.lblStartStopTor->setStatusTip(actionText);
 -            
 -      /* XXX: This might need to be smarter if we ever start connecting other
 -       * slots to these triggered() and clicked() signals. */
 -      QObject::disconnect(_actionStartStopTor, SIGNAL(triggered()), this, 0);
 -      QObject::disconnect(ui.lblStartStopTor, SIGNAL(clicked()), this, 0);
 -      connect(_actionStartStopTor, SIGNAL(triggered()), this, SLOT(stop()));
 -      connect(ui.lblStartStopTor, SIGNAL(clicked()), this, SLOT(stop()));
 -  } else if (status == Starting)  {
 -      statusText = tr("Starting the Tor software");
 -      trayIconFile = IMG_TOR_STARTING;
 -      statusIconFile = IMG_TOR_STARTING_48;
 -      _actionStartStopTor->setEnabled(false);
 -      ui.lblStartStopTor->setText(tr("Starting Tor"));
 -      ui.lblStartStopTor->setEnabled(false);
 -      ui.lblStartStopTor->setStatusTip(statusText);
 -      setStartupProgressVisible(true);
 -      setStartupProgress(STARTUP_PROGRESS_STARTING, statusText);
 -  } else if (status == CircuitEstablished) {
 -      statusText = tr("Connected to the Tor network!");
 -      trayIconFile = IMG_TOR_RUNNING;
 -      statusIconFile = IMG_TOR_RUNNING_48;
 -      setStartupProgressVisible(false);
 -  }
 -
 -  /* Update the tray icon */
 -  if (!trayIconFile.isEmpty()) {
 -    setTrayIcon(trayIconFile);
 -  }
 -  /* Update the status banner on the control panel */
 -  if (!statusIconFile.isEmpty())
 -    ui.lblTorStatusImg->setPixmap(QPixmap(statusIconFile));
 -  if (!statusText.isEmpty()) {
 -    _trayIcon.setToolTip(statusText);
 -    ui.lblTorStatus->setText(statusText);
 -  }
 -  return prevStatus;
 -}
 -
 -/** Called when the "show on startup" checkbox is toggled. */
 +/** Called when Tor has successfully established a circuit. */
  void
 -MainWindow::toggleShowOnStartup(bool checked)
 +MainWindow::circuitEstablished()
  {
 -  VidaliaSettings settings;
 -  settings.setShowMainWindowAtStart(checked);
 -}
 +  updateTorStatus(CircuitEstablished);
 +  // TODO: fix hardcoded total length
 +  setStartupProgress(130,
 +                     tr("Connected to the Tor network!"));
 +  startSubprocesses();
  
 -/** Sets the visibility of the startup status description and progress bar to
 - * <b>visible</b>. */
 -void
 -MainWindow::setStartupProgressVisible(bool visible)
 -{
 -  /* XXX: We force a repaint() to make sure the progress bar and onion status
 -   * icon don't overlap briefly. This is pretty hacktastic. */
 -  if (visible) {
 -    ui.lblTorStatus->setVisible(false);
 -    ui.lblTorStatusImg->setVisible(false);
 -    repaint(ui.grpStatus->rect());
 -    ui.lblStartupProgress->setVisible(true);
 -    ui.progressBar->setVisible(true);
 -  } else {
 -    ui.lblStartupProgress->setVisible(false);
 -    ui.progressBar->setVisible(false);
 -    repaint(ui.grpStatus->rect());
 -    ui.lblTorStatus->setVisible(true);
 -    ui.lblTorStatusImg->setVisible(true);
 +#if defined(USE_AUTOUPDATE)
 +  VidaliaSettings settings;
 +  if (settings.isAutoUpdateEnabled()) {
 +    QDateTime lastCheckedAt = settings.lastCheckedForUpdates();
 +    if (UpdateProcess::shouldCheckForUpdates(lastCheckedAt)) {
 +      /* Initiate a background check for updates now */
 +      _updateTimer.stop();
 +      checkForUpdates();
 +    }
    }
 +#endif
  }
  
 -/** Sets the progress bar completion value to <b>progressValue</b> and sets
 - * the status text to <b>description</b>. */
 +/** Called when Tor thinks the user has tried to connect to a port that
 + * typically is used for unencrypted applications. Warns the user and allows
 + * them to ignore future warnings on <b>port</b>. It is possible that Tor
 + * will produce multiple asynchronous status events warning of dangerous ports
 + * while the message box is displayed (for example, while the user is away
 + * from the keyboard), so subsequent messages will be discarded until the
 + * first message box is dismissed. */
  void
 -MainWindow::setStartupProgress(int progressValue,
 -                               const QString &description)
 -{
 -  ui.progressBar->setValue(progressValue);
 -  ui.lblStartupProgress->setText(description);
 -  _trayIcon.setToolTip(description);
 -}
 -
 -/** Attempts to start Tor. If Tor fails to start, then startFailed() will be
 - * called with an error message containing the reason. */
 -void 
 -MainWindow::start()
 +MainWindow::warnDangerousPort(quint16 port, bool rejected)
  {
 -  TorSettings settings;
 -  QStringList args;
 -
 -  updateTorStatus(Starting);
 -
 -  /* Check if Tor is already running separately */
 -  if(settings.getControlMethod() == ControlMethod::Port) {
 -    if (net_test_connect(settings.getControlAddress(),
 -                        settings.getControlPort())) {
 -      started();
 -      return;
 -    }
 -  } else {
 -    if (socket_test_connect(settings.getSocketPath())) {
 -      started();
 -      return;
 -    }
 -  }
 -
 -  QString torrc = settings.getTorrc();
 +  static QMessageBox *dlg = 0;
  
 -  if(settings.bootstrap()) {
 -    QString boottorrc = settings.bootstrapFrom();
 -    vNotice(tr("Bootstrapping torrc from %1 to %2")
 -        .arg(boottorrc).arg(torrc));
 -    if(QFileInfo(boottorrc).exists()) {
 -      if(QFile::copy(boottorrc, torrc)) {
 -        settings.setBootstrap(false);
 -      }
 -    }
 -  }
 +  /* Don't display another message box until the first one is dismissed */
 +  if (dlg)
 +    return;
  
 -  /* Make sure the torrc we want to use really exists. */
 -  if (!torrc.isEmpty()) {
 -    if (!QFileInfo(torrc).exists())
 -      touch_file(torrc, true);
 -    args << "-f" << torrc;
 -  }
 +  QString application;
 +  switch (port) {
 +    case  23:
-      application = tr(", probably Telnet, ");
++     application = tr("(probably Telnet)");
 +     break;
  
 -  /* Specify Tor's data directory, if different from the default */
 -  QString dataDirectory = settings.getDataDirectory();
 -  if (!dataDirectory.isEmpty())
 -    args << "DataDirectory" << expand_filename(dataDirectory);
 -  
 -  if(settings.getControlMethod() == ControlMethod::Port) {
 -    /* Add the intended control port value */
 -    quint16 controlPort = settings.getControlPort();
 -    if (controlPort)
 -      args << "ControlPort" << QString::number(controlPort);
 -  } else {
 -    QString path = settings.getSocketPath();
 -    args << "ControlSocket" << path;
 -  }
 -  
 -  /* Add the control port authentication arguments */
 -  switch (settings.getAuthenticationMethod()) {
 -    case TorSettings::PasswordAuth:
 -      if (! vApp->readPasswordFromStdin()) {
 -        if (settings.useRandomPassword()) {
 -          _controlPassword = TorSettings::randomPassword();
 -          _useSavedPassword = false;
 -        } else {
 -          _controlPassword = settings.getControlPassword();
 -          _useSavedPassword = true;
 -        }
 -      }
 -      args << "HashedControlPassword"
 -           << TorSettings::hashPassword(_controlPassword);
 -      break;
 -    case TorSettings::CookieAuth:
 -      args << "CookieAuthentication"  << "1";
 +    case 109:
 +    case 110:
 +    case 143:
-       application = tr(", probably an email client, "); 
++      application = tr("(probably an email client)"); 
        break;
 -    default:
 -      args << "CookieAuthentication"  << "0";
 -  }
 -
 -  /* 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
 -   * start. */
 -  _isIntentionalExit = true;
 -  /* Kick off the Tor process */
 -  _torControl->start(settings.getExecutable(), args);
 -}
  
 -/** Called when the user changes a setting that needs Tor restarting */
 -void
 -MainWindow::restart()
 -{
 -  if(_torControl->stop()) {
 -    start();
 +    default:
-       application = " ";
++      application = "";
    }
 -}
  
-   QString text = tr("One of your applications%1appears to be making a "
 -/** Called when the Tor process fails to start, for example, because the path
 - * specified to the Tor executable didn't lead to an executable. */
 -void
 -MainWindow::startFailed(QString errmsg)
 -{
 -  /* We don't display the error message for now, because the error message
 -   * that Qt gives us in this instance is almost always "Unknown Error". That
 -   * will make users sad. */
 -  Q_UNUSED(errmsg);
 - 
 -  updateTorStatus(Stopped);
 -
 -  /* Display an error message and see if the user wants some help */
 -  int response = VMessageBox::warning(this, tr("Error Starting Tor"),
 -                   tr("Vidalia was unable to start Tor. Check your settings "
 -                        "to ensure the correct name and location of your Tor "
 -                        "executable is specified."),
 -                   VMessageBox::ShowSettings|VMessageBox::Default,
 -                   VMessageBox::Cancel|VMessageBox::Escape,
 -                   VMessageBox::Help);
++  QString text = tr("One of your applications %1 appears to be making a "
 +                    "potentially unencrypted and unsafe connection to port %2.")
 +                    .arg(application).arg(port);
  
 -  if (response == VMessageBox::ShowSettings) {
 -    /* Show the settings dialog so the user can make sure they're pointing to
 -     * the correct Tor. */
 -     showConfigDialog();
 -  } else if (response == VMessageBox::Help) {
 -    /* Show troubleshooting information about starting Tor */
 -    showHelpDialog("troubleshooting.start");
 +  QString extraText = p(tr("Anything sent over this connection could be "
 +                           "monitored. Please check your application's "
 +                           "configuration and use only encrypted protocols, "
 +                           "such as SSL, if possible."));
 +  if (rejected) {
 +    extraText.append(p(tr("Tor has automatically closed your connection in "
 +                          "order to protect your anonymity.")));
    }
 -}
 -
 -/** Slot: Called when the Tor process is started. It will connect the control
 - * socket and set the icons and tooltips accordingly. */
 -void 
 -MainWindow::started()
 -{
 -  TorSettings settings;
 -
 -  updateTorStatus(Started);
 -
 -  /* Now that Tor is running, we want to know if it dies when we didn't want
 -   * it to. */
 -  _isIntentionalExit = false;
 -  /* We haven't started a delayed shutdown yet. */
 -  _delayedShutdownStarted = false;
 -  /* Remember whether we started Tor or not */
 -  _isVidaliaRunningTor = _torControl->isVidaliaRunningTor();
 -  /* Try to connect to Tor's control port */
 -  if(settings.getControlMethod() == ControlMethod::Port)
 -    _torControl->connect(settings.getControlAddress(),
 -                        settings.getControlPort());
 -  else
 -    _torControl->connect(settings.getSocketPath());
 -  setStartupProgress(STARTUP_PROGRESS_CONNECTING, tr("Connecting to Tor"));
 -}
 -
 -/** Called when the connection to the control socket fails. The reason will be
 - * given in the errmsg parameter. */
 -void
 -MainWindow::connectFailed(QString errmsg)
 -{
 -  /* Ok, ok. It really isn't going to connect. I give up. */
 -  int response = VMessageBox::warning(this, 
 -                   tr("Connection Error"), p(errmsg),
 -                   VMessageBox::Ok|VMessageBox::Default|VMessageBox::Escape, 
 -                   VMessageBox::Retry, VMessageBox::Help);
  
 +  dlg = new QMessageBox(QMessageBox::Warning,
 +                        tr("Potentially Unsafe Connection"), text,
 +                        QMessageBox::Ok | QMessageBox::Ignore);
 +  dlg->setInformativeText(extraText);
 +  dlg->setDefaultButton(QMessageBox::Ok);
 +  dlg->setEscapeButton(QMessageBox::Ok);
  
 -  if (response == VMessageBox::Retry) {
 -    /* Let's give it another try. */
 +  int ret = dlg->exec();
 +  if (ret == QMessageBox::Ignore) {
 +    TorControl *tc = Vidalia::torControl();
      TorSettings settings;
 -    _torControl->connect(settings.getControlAddress(),
 -                         settings.getControlPort());
 -  } else {
 -    /* Show the help browser (if requested) */
 -    if (response == VMessageBox::Help)
 -      showHelpDialog("troubleshooting.connect");
 -    /* Since Vidalia can't connect, we can't really do much, so stop Tor. */
 -    _torControl->stop();
 -  }
 -}
 -
 -/** Disconnects the control socket and stops the Tor process. */
 -bool
 -MainWindow::stop()
 -{
 -  ServerSettings server(_torControl);
 -  QString errmsg;
 -  TorStatus prevStatus;
 -  bool rc;
 -
 -  /* 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) {
 -    /* Ask the user if they want to shutdown nicely. */
 -    int response = VMessageBox::question(this, tr("Relaying is Enabled"),
 -                     tr("You are currently running a relay. "
 -                        "Terminating your relay will interrupt any "
 -                        "open connections from clients.\n\n"
 -                        "Would you like to shutdown gracefully and "
 -                        "give clients time to find a new relay?"),
 -                        VMessageBox::Yes|VMessageBox::Default, 
 -                        VMessageBox::No, 
 -                        VMessageBox::Cancel|VMessageBox::Escape);
 -    if (response == VMessageBox::Yes)
 -      _delayedShutdownStarted = true;
 -    else if (response == VMessageBox::Cancel)
 -      return false;
 -  }
 -  
 -  prevStatus = updateTorStatus(Stopping);  
 -  if (_delayedShutdownStarted) {
 -    /* Start a delayed shutdown */
 -    rc = _torControl->signal(TorSignal::Shutdown, &errmsg);
 -  } else {
 -    /* We want Tor to stop now, regardless of whether we're a server. */
 -    _isIntentionalExit = true;
 -    rc = _torControl->stop(&errmsg);
 -  }
 -  
 -  if (!rc) {
 -    /* We couldn't tell Tor to stop, for some reason. */
 -    int response = VMessageBox::warning(this, tr("Error Shutting Down"),
 -                     p(tr("Vidalia was unable to stop the Tor software.")) 
 -                       + p(errmsg),
 -                     VMessageBox::Ok|VMessageBox::Default|VMessageBox::Escape, 
 -                     VMessageBox::Help);
 -      
 -    if (response == VMessageBox::Help) {
 -      /* Show some troubleshooting help */
 -      showHelpDialog("troubleshooting.stop");
 -    }
 -    /* Tor is still running since stopping failed */
 -    _isIntentionalExit = false;
 -    _delayedShutdownStarted = false;
 -    updateTorStatus(prevStatus);
 -  }
 -  return rc;
 -}
 +    QStringList portList;
 +    QList<quint16> ports;
 +    int idx;
  
 -/** Slot: Called when the Tor process has exited. It will adjust the tray
 - * icons and tooltips accordingly. */
 -void 
 -MainWindow::stopped(int exitCode, QProcess::ExitStatus exitStatus)
 -{
 -  updateTorStatus(Stopped);
 +    ports = settings.getWarnPlaintextPorts();
 +    idx   = ports.indexOf(port);
 +    if (idx >= 0) {
 +      ports.removeAt(idx);
 +      settings.setWarnPlaintextPorts(ports);
  
 -  /* If we didn't intentionally close Tor, then check to see if it crashed or
 -   * if it closed itself and returned an error code. */
 -  if (!_isIntentionalExit) {
 -    /* A quick overview of Tor's code tells me that if it catches a SIGTERM or
 -     * SIGINT, Tor will exit(0). We might need to change this warning message
 -     * if this turns out to not be the case. */
 -    if (exitStatus == QProcess::CrashExit || exitCode != 0) {
 -      int ret = VMessageBox::warning(this, tr("Unexpected Error"),
 -                  tr("Vidalia detected that the Tor software exited "
 -                     "unexpectedly.\n\n"
 -                     "Please check the message log for recent "
 -                     "warning or error messages."),
 -                  VMessageBox::Ok|VMessageBox::Escape, 
 -                  VMessageBox::ShowLog|VMessageBox::Default,
 -                  VMessageBox::Help);
 -      if (ret == VMessageBox::ShowLog)
 -        _messageLog->showWindow();  
 -      else if (ret == VMessageBox::Help)
 -        showHelpDialog("troubleshooting.torexited");
 +      foreach (quint16 port, ports) {
 +        portList << QString::number(port);
 +      }
 +      tc->setConf("WarnPlaintextPorts", portList.join(","));
 +      portList.clear();
      }
 -  }
 -}
 -
 -/** Called when the control socket has successfully connected to Tor. */
 -void
 -MainWindow::connected()
 -{
 -  authenticate();
 -}
  
 -/** Called when Vidalia wants to disconnect from a Tor it did not start. */
 -void
 -MainWindow::disconnect()
 -{
 -  _torControl->disconnect();
 -}
 +    ports = settings.getRejectPlaintextPorts();
 +    idx   = ports.indexOf(port);
 +    if (idx >= 0) {
 +      ports.removeAt(idx);
 +      settings.setRejectPlaintextPorts(ports);
  
 -/** Called when the control socket has been disconnected. */
 -void
 -MainWindow::disconnected()
 -{
 -  if (!_isVidaliaRunningTor) {
 -    /* If we didn't start our own Tor process, interpret losing the control
 -     * connection as "Tor is stopped". */
 -    updateTorStatus(Stopped);
 +      foreach (quint16 port, ports) {
 +        portList << QString::number(port);
 +      }
 +      tc->setConf("RejectPlaintextPorts", portList.join(","));
 +    }
    }
 -  
 -  /*XXX We should warn here if we get disconnected when we didn't intend to */
 -  _actionNewIdentity->setEnabled(false);
 -  ui.lblNewIdentity->setEnabled(false);
 -  _isVidaliaRunningTor = false;
 +  delete dlg;
 +  dlg = 0;
  }
  
  /** Attempts to authenticate to Tor's control port, depending on the



More information about the tor-commits mailing list