commit cbfe5e908026729818d91d2fbb17a92469574abd Author: Tomas Touceda chiiph@gentoo.org Date: Fri Apr 15 12:34:01 2011 -0300
Port BridgeDownloader from QHttp to QtNetwork
QHttp is deprecated in the latest versions. Also, added a check for the certificate sha1 digest. --- src/vidalia/config/BridgeDownloader.cpp | 71 +++++++++----------- src/vidalia/config/BridgeDownloader.h | 17 ++--- .../config/BridgeDownloaderProgressDialog.cpp | 2 +- .../config/BridgeDownloaderProgressDialog.h | 2 +- src/vidalia/config/NetworkPage.cpp | 4 +- 5 files changed, 44 insertions(+), 52 deletions(-)
diff --git a/src/vidalia/config/BridgeDownloader.cpp b/src/vidalia/config/BridgeDownloader.cpp index d70034d..15d73cb 100644 --- a/src/vidalia/config/BridgeDownloader.cpp +++ b/src/vidalia/config/BridgeDownloader.cpp @@ -16,34 +16,26 @@ #include "BridgeDownloader.h" #include "Vidalia.h"
-#include <QSslSocket> - #define BRIDGEDB_HOST "bridges.torproject.org" #define BRIDGEDB_PORT 443 - +#define BRIDGEDB_SHA1 "a7e70f8a648fe04a9677f13eedf6f91b5f7f2e25"
BridgeDownloader::BridgeDownloader(QObject *parent) - : QObject(parent), - _requestId(0) + : QObject(parent) { - _https = new QHttp(BRIDGEDB_HOST, QHttp::ConnectionModeHttps, - BRIDGEDB_PORT, this); - - connect(_https, SIGNAL(stateChanged(int)), - this, SLOT(httpsStateChanged(int))); - connect(_https, SIGNAL(requestFinished(int, bool)), - this, SLOT(httpsRequestFinished(int, bool))); - connect(_https, SIGNAL(dataReadProgress(int, int)), - this, SIGNAL(downloadProgress(int, int))); - connect(_https, SIGNAL(sslErrors(QList<QSslError>)), - this, SLOT(sslErrors(QList<QSslError>))); + _https = new QNetworkAccessManager(); + + connect(_https, SIGNAL(finished(QNetworkReply *)), + this, SLOT(httpsRequestFinished(QNetworkReply *))); + connect(_https, SIGNAL(sslErrors(QNetworkReply *, QList<QSslError>)), + this, SLOT(sslErrors(QNetworkReply *, QList<QSslError>))); }
void BridgeDownloader::setProxy(const QString &host, int port, const QString &username, const QString &password) { - _https->setProxy(host, port, username, password); + _https->setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, host, port, username, password)); }
bool @@ -82,16 +74,18 @@ BridgeDownloader::startHttpsDownload() emit statusChanged(tr("Starting HTTPS bridge request...")); emit downloadProgress(0, 0);
- _requestId = _https->get("/?format=plain"); - vInfo("Sending an HTTPS bridge request to %1:%2 (id %3).").arg(BRIDGEDB_HOST) - .arg(BRIDGEDB_PORT) - .arg(_requestId); + _reply = _https->get(QNetworkRequest(QUrl("https://bridges.torproject.org/?format=plain"))); + connect(_reply, SIGNAL(downloadProgress(qint64, qint64)), + this, SIGNAL(downloadProgress(qint64, qint64))); + vInfo("Sending an HTTPS bridge request to %1:%2.").arg(BRIDGEDB_HOST) + .arg(BRIDGEDB_PORT); }
void BridgeDownloader::cancelBridgeRequest() { - _https->abort(); + _reply->close(); + disconnect(_reply, 0, 0, 0); }
void @@ -117,20 +111,16 @@ BridgeDownloader::httpsStateChanged(int state) }
void -BridgeDownloader::httpsRequestFinished(int id, bool error) +BridgeDownloader::httpsRequestFinished(QNetworkReply *reply) { - if (id != _requestId) - return; - - if (error) { - QString errorString = _https->errorString(); - vWarn("Bridge request failed (id %1): %2").arg(id).arg(errorString); + if (reply->error() != QNetworkReply::NoError) { + QString errorString = reply->errorString(); + vWarn("Bridge request failed: %2").arg(errorString);
emit bridgeRequestFailed(errorString); } else { - QByteArray response = _https->readAll(); - vInfo("Bridge request complete (id %1): received %2 bytes.").arg(id) - .arg(response.size()); + QByteArray response = reply->readAll(); + vInfo("Bridge request complete: received %2 bytes.").arg(response.size());
QStringList bridges, lines = QString(response).split("\n"); foreach (QString line, lines) { @@ -140,22 +130,27 @@ BridgeDownloader::httpsRequestFinished(int id, bool error) } emit bridgeRequestFinished(bridges); } - _https->close(); + _reply->close(); + disconnect(_reply,0,0,0); }
void -BridgeDownloader::sslErrors(const QList<QSslError> &sslErrors) +BridgeDownloader::sslErrors(QNetworkReply *reply, const QList<QSslError> &sslErrors) { QString errorString; QStringList errorStrings;
- vWarn("%1 SSL error(s) when requesting bridge information (id %2):") - .arg(sslErrors.size()) - .arg(_requestId); + vWarn("%1 SSL error(s) when requesting bridge information:") + .arg(sslErrors.size()); foreach (QSslError sslError, sslErrors) { errorString = sslError.errorString(); errorStrings << errorString; vWarn(" SSL Error: %1").arg(errorString); } -}
+ // Check if the certificate is the one we expect + if(_reply->sslConfiguration().peerCertificate().digest(QCryptographicHash::Sha1)==QByteArray::fromHex(BRIDGEDB_SHA1)) { + _reply->ignoreSslErrors(); + } else + vWarn("There's been a problem with the certificate."); +} diff --git a/src/vidalia/config/BridgeDownloader.h b/src/vidalia/config/BridgeDownloader.h index 0cb87f4..cf30979 100644 --- a/src/vidalia/config/BridgeDownloader.h +++ b/src/vidalia/config/BridgeDownloader.h @@ -16,10 +16,7 @@ #ifndef _BRIDGEDOWNLOADER_H #define _BRIDGEDOWNLOADER_H
-#include <QHttp> -#include <QSslError> -#include <QStringList> - +#include <QtNetwork>
class BridgeDownloader : public QObject { @@ -65,7 +62,7 @@ signals: * have been read so far. Note that <b>total</b> may be 0 if the expected * total size of the response is not known. */ - void downloadProgress(int done, int total); + void downloadProgress(qint64 done, qint64 total);
/** Emitted when the status of the bridge request changes. <b>status</b> * describes the new current state of the request. @@ -98,14 +95,14 @@ private slots: * signal is ignored since it is the result of a close() or abort() * request. */ - void httpsRequestFinished(int id, bool error); + void httpsRequestFinished(QNetworkReply *reply);
/** Called when the HTTPS connection encounters one or more * <b>sslErrors</b>. Currently the errors are just logged and * bridgeRequestFailed() is <i>not</i> emitted, since QHttp will also * emit */ - void sslErrors(const QList<QSslError> &sslErrors); + void sslErrors(QNetworkReply *, const QList<QSslError> &sslErrors);
private: /** Initiates an HTTPS connection to bridges.torproject.org to start @@ -115,10 +112,10 @@ private:
/** Used to connect to the bridge database, send an HTTPS request for * new bridge addresses and then read the response. */ - QHttp* _https; + QNetworkAccessManager* _https;
- /** Unique numeric identifier of the current bridge request. */ - int _requestId; + /** Identifier of the current bridge request */ + QNetworkReply *_reply; };
#endif diff --git a/src/vidalia/config/BridgeDownloaderProgressDialog.cpp b/src/vidalia/config/BridgeDownloaderProgressDialog.cpp index b4d8e28..f16daa8 100644 --- a/src/vidalia/config/BridgeDownloaderProgressDialog.cpp +++ b/src/vidalia/config/BridgeDownloaderProgressDialog.cpp @@ -46,7 +46,7 @@ BridgeDownloaderProgressDialog::setStatus(const QString &status) }
void -BridgeDownloaderProgressDialog::setDownloadProgress(int done, int total) +BridgeDownloaderProgressDialog::setDownloadProgress(qint64 done, qint64 total) { ui.progressBar->setRange(0, total); ui.progressBar->setValue(done); diff --git a/src/vidalia/config/BridgeDownloaderProgressDialog.h b/src/vidalia/config/BridgeDownloaderProgressDialog.h index 86fb0d3..d9d505f 100644 --- a/src/vidalia/config/BridgeDownloaderProgressDialog.h +++ b/src/vidalia/config/BridgeDownloaderProgressDialog.h @@ -39,7 +39,7 @@ public slots: * <b>maximum</b> steps. If <b>value</b> and <b>maximum</b> are both 0, * then a "busy" progress bar is displayed. */ - void setDownloadProgress(int value, int maximum); + void setDownloadProgress(qint64 value, qint64 maximum);
/** Called when the bridge download completes successfully and discards * the progress dialog with an Accept result code. <b>bridges</b> diff --git a/src/vidalia/config/NetworkPage.cpp b/src/vidalia/config/NetworkPage.cpp index f5bbc72..7154334 100644 --- a/src/vidalia/config/NetworkPage.cpp +++ b/src/vidalia/config/NetworkPage.cpp @@ -389,8 +389,8 @@ NetworkPage::findBridges()
connect(_bridgeDownloader, SIGNAL(statusChanged(QString)), dlg, SLOT(setStatus(QString))); - connect(_bridgeDownloader, SIGNAL(downloadProgress(int, int)), - dlg, SLOT(setDownloadProgress(int, int))); + connect(_bridgeDownloader, SIGNAL(downloadProgress(qint64, qint64)), + dlg, SLOT(setDownloadProgress(qint64, qint64))); connect(_bridgeDownloader, SIGNAL(bridgeRequestFailed(QString)), dlg, SLOT(bridgeRequestFailed(QString))); connect(_bridgeDownloader, SIGNAL(bridgeRequestFinished(QStringList)),