commit 70680a3325b820abf41bffc0eea1c7a7523ffaad Merge: 5193835 d569712 Author: Tomas Touceda chiiph@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
tor-commits@lists.torproject.org