cloud storage is being used from mobile and desktop, but we are using different functions to deal with that. this is the first step to deal with that.
From 6a7ce9ded54a79c669030df3c73ce8cc4303b81f Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Tue, 26 Jan 2016 13:02:42 -0200 Subject: [PATCH 4/4] Correct usage of QString on qmlmanager
Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-mobile/qmlmanager.cpp | 48 ++++++++++++++++++++++++------------------------ qt-mobile/qmlmanager.h | 19 +++++++++++-------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/qt-mobile/qmlmanager.cpp b/qt-mobile/qmlmanager.cpp index 3602e15..18492cd 100644 --- a/qt-mobile/qmlmanager.cpp +++ b/qt-mobile/qmlmanager.cpp @@ -46,9 +46,9 @@ QMLManager::QMLManager() : m_locationServiceEnabled(false), { m_instance = this; appendTextToLog(getUserAgent()); - appendTextToLog(QString("build with Qt Version %1, runtime from Qt Version %2").arg(QT_VERSION_STR).arg(qVersion())); + appendTextToLog(QStringLiteral("build with Qt Version %1, runtime from Qt Version %2").arg(QT_VERSION_STR).arg(qVersion())); qDebug() << "Starting" << getUserAgent(); - qDebug() << QString("build with Qt Version %1, runtime from Qt Version %2").arg(QT_VERSION_STR).arg(qVersion()); + qDebug() << QStringLiteral("build with Qt Version %1, runtime from Qt Version %2").arg(QT_VERSION_STR).arg(qVersion()); m_startPageText = tr("Searching for dive data"); // create location manager service locationProvider = new GpsLocation(&appendTextToLogStandalone, this); @@ -75,7 +75,7 @@ void QMLManager::finishSetup() int error = parse_file(fileNamePrt.data()); prefs.git_local_only = false; if (error) { - appendTextToLog(QString("loading dives from cache failed %1").arg(error)); + appendTextToLog(QStringLiteral("loading dives from cache failed %1").arg(error)); } else { prefs.unit_system = informational_prefs.unit_system; if (informational_prefs.unit_system == IMPERIAL) @@ -88,12 +88,12 @@ void QMLManager::finishSetup() for_each_dive (i, d) { DiveListModel::instance()->addDive(d); } - appendTextToLog(QString("%1 dives loaded from cache").arg(i)); + appendTextToLog(QStringLiteral("%1 dives loaded from cache").arg(i)); } - appendTextToLog("have cloud credentials, trying to connect"); + appendTextToLog(QStringLiteral("have cloud credentials, trying to connect")); tryRetrieveDataFromBackend(); } else { - appendTextToLog("no cloud credentials, tell user no dives found"); + appendTextToLog(QStringLiteral("no cloud credentials, tell user no dives found")); setStartPageText(tr("No recorded dives found. You can download your dives to this device from the Subsurface cloud storage service, from your dive computer, or add them manually.")); } setDistanceThreshold(prefs.distance_threshold); @@ -225,7 +225,7 @@ void QMLManager::handleError(QNetworkReply::NetworkError nError) void QMLManager::retrieveUserid() { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 302) { - appendTextToLog(QString("Cloud storage connection not working correctly: ") + reply->readAll()); + appendTextToLog(QStringLiteral("Cloud storage connection not working correctly: ") + reply->readAll()); return; } QString userid(prefs.userid); @@ -234,7 +234,7 @@ void QMLManager::retrieveUserid() appendTextToLog("cloud user name or password are empty, can't retrieve web user id"); return; } - appendTextToLog(QString("calling getUserid with user %1").arg(prefs.cloud_storage_email)); + appendTextToLog(QStringLiteral("calling getUserid with user %1").arg(prefs.cloud_storage_email)); userid = locationProvider->getUserid(prefs.cloud_storage_email, prefs.cloud_storage_password); } if (!userid.isEmpty()) { @@ -262,7 +262,7 @@ void QMLManager::loadDiveProgress(int percent) void QMLManager::loadDivesWithValidCredentials() { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 302) { - appendTextToLog(QString("Cloud storage connection not working correctly: ") + reply->readAll()); + appendTextToLog(QStringLiteral("Cloud storage connection not working correctly: ") + reply->readAll()); setStartPageText(tr("Cannot connect to cloud storage")); return; } @@ -310,7 +310,7 @@ void QMLManager::loadDivesWithValidCredentials() for_each_dive (i, d) { DiveListModel::instance()->addDive(d); } - appendTextToLog(QString("%1 dives loaded").arg(i)); + appendTextToLog(QStringLiteral("%1 dives loaded").arg(i)); if (dive_table.nr == 0) setStartPageText(tr("Cloud storage open successfully. No dives in dive list.")); setLoadFromCloud(true); @@ -349,9 +349,9 @@ QString QMLManager::commitChanges(QString diveId, QString date, QString location // what a pain - Qt will not parse dates if the day of the week is incorrect // so if the user changed the date but didn't update the day of the week (most likely behavior, actually), // we need to make sure we don't try to parse that - QString format(QString(prefs.date_format) + " " + prefs.time_format); - if (format.contains("ddd") || format.contains("dddd")) { - QString dateFormatToDrop = format.contains("ddd") ? "ddd" : "dddd"; + QString format(QString(prefs.date_format) + QChar(' ') + prefs.time_format); + if (format.contains(QLatin1String("ddd")) || format.contains(QLatin1String("dddd"))) { + QString dateFormatToDrop = format.contains(QLatin1String("ddd")) ? QStringLiteral("ddd") : QStringLiteral("dddd"); QDateTime ts; QLocale loc = getLocale(); ts.setMSecsSinceEpoch(d->when * 1000L); @@ -397,11 +397,11 @@ QString QMLManager::commitChanges(QString diveId, QString date, QString location if (get_dive_duration_string(d->duration.seconds, tr("h:"), tr("min")) != duration) { diveChanged = true; int h = 0, m = 0, s = 0; - QRegExp r1(QString("(\\d*)%1[\\s,:]*(\\d*)%2[\\s,:]*(\\d*)%3").arg(tr("h")).arg(tr("min")).arg(tr("sec")), Qt::CaseInsensitive); - QRegExp r2(QString("(\\d*)%1[\\s,:]*(\\d*)%2").arg(tr("h")).arg(tr("min")), Qt::CaseInsensitive); - QRegExp r3(QString("(\\d*)%1").arg(tr("min")), Qt::CaseInsensitive); - QRegExp r4(QString("(\\d*):(\\d*):(\\d*)")); - QRegExp r5(QString("(\\d*):(\\d*)")); + QRegExp r1(QStringLiteral("(\\d*)%1[\\s,:]*(\\d*)%2[\\s,:]*(\\d*)%3").arg(tr("h")).arg(tr("min")).arg(tr("sec")), Qt::CaseInsensitive); + QRegExp r2(QStringLiteral("(\\d*)%1[\\s,:]*(\\d*)%2").arg(tr("h")).arg(tr("min")), Qt::CaseInsensitive); + QRegExp r3(QStringLiteral("(\\d*)%1").arg(tr("min")), Qt::CaseInsensitive); + QRegExp r4(QStringLiteral("(\\d*):(\\d*):(\\d*)")); + QRegExp r5(QStringLiteral("(\\d*):(\\d*)")); if (r1.indexIn(duration) >= 0) { h = r1.cap(1).toInt(); m = r1.cap(2).toInt(); @@ -671,13 +671,13 @@ QString QMLManager::startPageText() const return m_startPageText; } -void QMLManager::setStartPageText(QString text) +void QMLManager::setStartPageText(const QString& text) { m_startPageText = text; emit startPageTextChanged(); } -void QMLManager::showMap(QString location) +void QMLManager::showMap(const QString& location) { if (!location.isEmpty()) { QString link = QString("https://www.google.com/maps/place/%1/@%2,5000m/data=!3m1!1e3!4m2!3m1!1s0x0:0x0") @@ -687,7 +687,7 @@ void QMLManager::showMap(QString location) } } -QString QMLManager::getNumber(QString diveId) +QString QMLManager::getNumber(const QString& diveId) { int dive_id = diveId.toInt(); struct dive *d = get_dive_by_uniq_id(dive_id); @@ -697,7 +697,7 @@ QString QMLManager::getNumber(QString diveId) return number; } -QString QMLManager::getDate(QString diveId) +QString QMLManager::getDate(const QString& diveId) { int dive_id = diveId.toInt(); struct dive *d = get_dive_by_uniq_id(dive_id); @@ -707,7 +707,7 @@ QString QMLManager::getDate(QString diveId) return datestring; } -QString QMLManager::getCylinder(QString diveId) +QString QMLManager::getCylinder(const QString& diveId) { int dive_id = diveId.toInt(); struct dive *d = get_dive_by_uniq_id(dive_id); @@ -717,7 +717,7 @@ QString QMLManager::getCylinder(QString diveId) return cylinder; } -QString QMLManager::getWeights(QString diveId) +QString QMLManager::getWeights(const QString& diveId) { int dive_id = diveId.toInt(); struct dive *d = get_dive_by_uniq_id(dive_id); diff --git a/qt-mobile/qmlmanager.h b/qt-mobile/qmlmanager.h index f06ff08..b53af4d 100644 --- a/qt-mobile/qmlmanager.h +++ b/qt-mobile/qmlmanager.h @@ -50,7 +50,7 @@ public: void setLoadFromCloud(bool done); QString startPageText() const; - void setStartPageText(QString text); + void setStartPageText(const QString& text); QString logText() const; void setLogText(const QString &logText); @@ -70,8 +70,11 @@ public slots: void loadDivesWithValidCredentials(); void loadDiveProgress(int percent); void provideAuth(QNetworkReply *reply, QAuthenticator *auth); - QString commitChanges(QString diveId, QString date, QString location, QString gps, QString duration, QString depth, - QString airtemp, QString watertemp, QString suit, QString buddy, QString diveMaster, QString notes); + QString commitChanges(QString diveId,QString date, QString location, + QString gps, QString duration, QString depth, + QString airtemp, QString watertemp, QString suit, + QString buddy, QString diveMaster, QString notes); + void saveChanges(); QString addDive(); void applyGpsData(); @@ -80,12 +83,12 @@ public slots: void populateGpsData(); void clearGpsData(); void finishSetup(); - void showMap(QString location); - QString getNumber(QString diveId); - QString getDate(QString diveId); + void showMap(const QString& location); + QString getNumber(const QString& diveId); + QString getDate(const QString& diveId); QString getCurrentPosition(); - QString getCylinder(QString diveId); - QString getWeights(QString diveId); + QString getCylinder(const QString& diveId); + QString getWeights(const QString& diveId); void deleteGpsFix(quint64 when); void refreshDiveList(); -- 2.7.0
From 41b1abbce3a2845c926c966b15c56832fa351fc6 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Tue, 26 Jan 2016 12:45:03 -0200 Subject: [PATCH 3/4] We already have a QNetworkAcessManager global, use it. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-mobile/qmlmanager.cpp | 24 +++++++++++------------- qt-mobile/qmlmanager.h | 1 - 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/qt-mobile/qmlmanager.cpp b/qt-mobile/qmlmanager.cpp index a4cfd5f..3602e15 100644 --- a/qt-mobile/qmlmanager.cpp +++ b/qt-mobile/qmlmanager.cpp @@ -14,14 +14,15 @@ #include "qthelper.h" #include "qt-gui.h" #include "git-access.h" +#include "subsurface-core/cloudstorage.h" QMLManager *QMLManager::m_instance = NULL; static void appendTextToLogStandalone(const char *text) { - QMLManager *mgr = QMLManager::instance(); - if (mgr) - mgr->appendTextToLog(QString(text)); + QMLManager *self = QMLManager::instance(); + if (self) + self->appendTextToLog(QString(text)); } extern "C" int gitProgressCB(int percent) @@ -30,9 +31,9 @@ extern "C" int gitProgressCB(int percent) if (percent - lastPercent >= 10) { lastPercent += 10; - QMLManager *mgr = QMLManager::instance(); - if (mgr) - mgr->loadDiveProgress(percent); + QMLManager *self = QMLManager::instance(); + if (self) + self->loadDiveProgress(percent); } // return 0 so that we don't end the download return 0; @@ -41,8 +42,7 @@ extern "C" int gitProgressCB(int percent) QMLManager::QMLManager() : m_locationServiceEnabled(false), m_verboseEnabled(false), m_loadFromCloud(false), - reply(0), - mgr(0) + reply(0) { m_instance = this; appendTextToLog(getUserAgent()); @@ -165,15 +165,13 @@ void QMLManager::checkCredentialsAndExecute(execute_function_type execute) !same_string(prefs.cloud_storage_password, "")) { setStartPageText(tr("Testing cloud credentials")); appendTextToLog("Have credentials, let's see if they are valid"); - if (!mgr) - mgr = new QNetworkAccessManager(this); - connect(mgr, &QNetworkAccessManager::authenticationRequired, this, &QMLManager::provideAuth, Qt::UniqueConnection); - connect(mgr, &QNetworkAccessManager::finished, this, execute, Qt::UniqueConnection); + connect(manager(), &QNetworkAccessManager::authenticationRequired, this, &QMLManager::provideAuth, Qt::UniqueConnection); + connect(manager(), &QNetworkAccessManager::finished, this, execute, Qt::UniqueConnection); QUrl url(CLOUDREDIRECTURL); request = QNetworkRequest(url); request.setRawHeader("User-Agent", getUserAgent().toUtf8()); request.setRawHeader("Accept", "text/html"); - reply = mgr->get(request); + reply = manager()->get(request); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::sslErrors, this, &QMLManager::handleSslErrors); } diff --git a/qt-mobile/qmlmanager.h b/qt-mobile/qmlmanager.h index bcaf9c7..f06ff08 100644 --- a/qt-mobile/qmlmanager.h +++ b/qt-mobile/qmlmanager.h @@ -105,7 +105,6 @@ private: static QMLManager *m_instance; QNetworkReply *reply; QNetworkRequest request; - QNetworkAccessManager *mgr; signals: void cloudUserNameChanged(); -- 2.7.0
From d4068df92735a1fd23883c79c63ed92ca70257f7 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Tue, 26 Jan 2016 12:28:38 -0200 Subject: [PATCH 2/4] Fix usage of QString 1 - Pass QStrings by const-ref 2 - Don't initialize empty strings with "", they are empty by default 3 - Don't compare empty strings with "", use .isEmpty() 4 - don't append or prepend " ", use QChar(' ') 5 - don't compare QStrings with "constant string", use QLatin1String(" constant string" ) Signed-off-by: Tomaz Canabrava <[email protected]> --- subsurface-core/cloudstorage.cpp | 18 +++++++++--------- subsurface-core/cloudstorage.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/subsurface-core/cloudstorage.cpp b/subsurface-core/cloudstorage.cpp index 25a2f56..4f58d01 100644 --- a/subsurface-core/cloudstorage.cpp +++ b/subsurface-core/cloudstorage.cpp @@ -17,18 +17,18 @@ CloudStorageAuthenticate::CloudStorageAuthenticate(QObject *parent) : #define CLOUDBACKENDVERIFY CLOUDURL + "/verify" #define CLOUDBACKENDUPDATE CLOUDURL + "/update" -QNetworkReply* CloudStorageAuthenticate::backend(QString email, QString password, QString pin, QString newpasswd) +QNetworkReply* CloudStorageAuthenticate::backend(const QString& email,const QString& password,const QString& pin,const QString& newpasswd) { - QString payload(email + " " + password); + QString payload(email + QChar(' ') + password); QUrl requestUrl; - if (pin == "" && newpasswd == "") { + if (pin.isEmpty() && newpasswd.isEmpty()) { requestUrl = QUrl(CLOUDBACKENDSTORAGE); - } else if (newpasswd != "") { + } else if (!newpasswd.isEmpty()) { requestUrl = QUrl(CLOUDBACKENDUPDATE); - payload += " " + newpasswd; + payload += QChar(' ') + newpasswd; } else { requestUrl = QUrl(CLOUDBACKENDVERIFY); - payload += " " + pin; + payload += QChar(' ') + pin; } QNetworkRequest *request = new QNetworkRequest(requestUrl); request->setRawHeader("Accept", "text/xml, text/plain"); @@ -48,7 +48,7 @@ void CloudStorageAuthenticate::uploadFinished() QString cloudAuthReply(reply->readAll()); qDebug() << "Completed connection with cloud storage backend, response" << cloudAuthReply; - if (cloudAuthReply == "[VERIFIED]" || cloudAuthReply == "[OK]") { + if (cloudAuthReply == QLatin1String("[VERIFIED]") || cloudAuthReply == QLatin1String("[OK]")) { prefs.cloud_verification_status = CS_VERIFIED; /* TODO: Move this to a correct place NotificationWidget *nw = MainWindow::instance()->getNotificationWidget(); @@ -56,9 +56,9 @@ void CloudStorageAuthenticate::uploadFinished() nw->hideNotification(); */ myLastError.clear(); - } else if (cloudAuthReply == "[VERIFY]") { + } else if (cloudAuthReply == QLatin1String("[VERIFY]")) { prefs.cloud_verification_status = CS_NEED_TO_VERIFY; - } else if (cloudAuthReply == "[PASSWDCHANGED]") { + } else if (cloudAuthReply == QLatin1String("[PASSWDCHANGED]")) { free(prefs.cloud_storage_password); prefs.cloud_storage_password = prefs.cloud_storage_newpassword; prefs.cloud_storage_newpassword = NULL; diff --git a/subsurface-core/cloudstorage.h b/subsurface-core/cloudstorage.h index b4b21dd..6addb73 100644 --- a/subsurface-core/cloudstorage.h +++ b/subsurface-core/cloudstorage.h @@ -7,7 +7,7 @@ class CloudStorageAuthenticate : public QObject { Q_OBJECT public: - QNetworkReply* backend(QString email, QString password, QString pin = "", QString newpasswd = ""); + QNetworkReply* backend(const QString& email,const QString& password,const QString& pin = QString(),const QString& newpasswd = QString()); explicit CloudStorageAuthenticate(QObject *parent); signals: void finishedAuthenticate(); -- 2.7.0
From 5e942f92126394ae115b551b42f969deca4b2385 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Tue, 26 Jan 2016 12:24:27 -0200 Subject: [PATCH 1/4] Move CloudStorage out of the widgets Cloud Storage is a non-gui based class, we currently use two different approaches for cloud storage, one on the Desktop target and other on the Mobile target, we should use only one. Signed-off-by: Tomaz Canabrava <[email protected]> --- desktop-widgets/subsurfacewebservices.cpp | 102 +--------------------------- desktop-widgets/subsurfacewebservices.h | 19 ------ subsurface-core/CMakeLists.txt | 3 +- subsurface-core/cloudstorage.cpp | 109 ++++++++++++++++++++++++++++++ subsurface-core/cloudstorage.h | 27 ++++++++ 5 files changed, 140 insertions(+), 120 deletions(-) create mode 100644 subsurface-core/cloudstorage.cpp create mode 100644 subsurface-core/cloudstorage.h diff --git a/desktop-widgets/subsurfacewebservices.cpp b/desktop-widgets/subsurfacewebservices.cpp index a119491..4d17e76 100644 --- a/desktop-widgets/subsurfacewebservices.cpp +++ b/desktop-widgets/subsurfacewebservices.cpp @@ -9,6 +9,7 @@ #include "display.h" #include "membuffer.h" #include <errno.h> +#include "subsurface-core/cloudstorage.h" #include <QDir> #include <QHttpMultiPart> @@ -312,12 +313,6 @@ void WebServices::hideDownload() ui.upload->show(); } -QNetworkAccessManager *WebServices::manager() -{ - static QNetworkAccessManager *manager = new QNetworkAccessManager(qApp); - return manager; -} - void WebServices::downloadTimedOut() { if (!reply) @@ -1033,97 +1028,4 @@ QNetworkReply* UserSurveyServices::sendSurvey(QString values) request.setRawHeader("User-Agent", userAgent.toUtf8()); reply = manager()->get(request); return reply; -} - -CloudStorageAuthenticate::CloudStorageAuthenticate(QObject *parent) : - QObject(parent), - reply(NULL) -{ - userAgent = getUserAgent(); -} - -#define CLOUDURL QString(prefs.cloud_base_url) -#define CLOUDBACKENDSTORAGE CLOUDURL + "/storage" -#define CLOUDBACKENDVERIFY CLOUDURL + "/verify" -#define CLOUDBACKENDUPDATE CLOUDURL + "/update" - -QNetworkReply* CloudStorageAuthenticate::backend(QString email, QString password, QString pin, QString newpasswd) -{ - QString payload(email + " " + password); - QUrl requestUrl; - if (pin == "" && newpasswd == "") { - requestUrl = QUrl(CLOUDBACKENDSTORAGE); - } else if (newpasswd != "") { - requestUrl = QUrl(CLOUDBACKENDUPDATE); - payload += " " + newpasswd; - } else { - requestUrl = QUrl(CLOUDBACKENDVERIFY); - payload += " " + pin; - } - QNetworkRequest *request = new QNetworkRequest(requestUrl); - request->setRawHeader("Accept", "text/xml, text/plain"); - request->setRawHeader("User-Agent", userAgent.toUtf8()); - request->setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); - reply = WebServices::manager()->post(*request, qPrintable(payload)); - connect(reply, SIGNAL(finished()), this, SLOT(uploadFinished())); - connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>))); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, - SLOT(uploadError(QNetworkReply::NetworkError))); - return reply; -} - -void CloudStorageAuthenticate::uploadFinished() -{ - static QString myLastError; - - QString cloudAuthReply(reply->readAll()); - qDebug() << "Completed connection with cloud storage backend, response" << cloudAuthReply; - if (cloudAuthReply == "[VERIFIED]" || cloudAuthReply == "[OK]") { - prefs.cloud_verification_status = CS_VERIFIED; - NotificationWidget *nw = MainWindow::instance()->getNotificationWidget(); - if (nw->getNotificationText() == myLastError) - nw->hideNotification(); - myLastError.clear(); - } else if (cloudAuthReply == "[VERIFY]") { - prefs.cloud_verification_status = CS_NEED_TO_VERIFY; - } else if (cloudAuthReply == "[PASSWDCHANGED]") { - free(prefs.cloud_storage_password); - prefs.cloud_storage_password = prefs.cloud_storage_newpassword; - prefs.cloud_storage_newpassword = NULL; - emit passwordChangeSuccessful(); - return; - } else { - prefs.cloud_verification_status = CS_INCORRECT_USER_PASSWD; - myLastError = cloudAuthReply; - report_error("%s", qPrintable(cloudAuthReply)); - MainWindow::instance()->getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); - } - emit finishedAuthenticate(); -} - -void CloudStorageAuthenticate::uploadError(QNetworkReply::NetworkError error) -{ - qDebug() << "Received error response from cloud storage backend:" << reply->errorString(); -} - -void CloudStorageAuthenticate::sslErrors(QList<QSslError> errorList) -{ - if (verbose) { - qDebug() << "Received error response trying to set up https connection with cloud storage backend:"; - Q_FOREACH (QSslError err, errorList) { - qDebug() << err.errorString(); - } - } - QSslConfiguration conf = reply->sslConfiguration(); - QSslCertificate cert = conf.peerCertificate(); - QByteArray hexDigest = cert.digest().toHex(); - if (reply->url().toString().contains(prefs.cloud_base_url) && - hexDigest == "13ff44c62996cfa5cd69d6810675490e") { - if (verbose) - qDebug() << "Overriding SSL check as I recognize the certificate digest" << hexDigest; - reply->ignoreSslErrors(); - } else { - if (verbose) - qDebug() << "got invalid SSL certificate with hex digest" << hexDigest; - } -} +} \ No newline at end of file diff --git a/desktop-widgets/subsurfacewebservices.h b/desktop-widgets/subsurfacewebservices.h index 2b454eb..7b629db 100644 --- a/desktop-widgets/subsurfacewebservices.h +++ b/desktop-widgets/subsurfacewebservices.h @@ -111,25 +111,6 @@ slots: virtual void buttonClicked(QAbstractButton *button) { } }; -class CloudStorageAuthenticate : public QObject { - Q_OBJECT -public: - QNetworkReply* backend(QString email, QString password, QString pin = "", QString newpasswd = ""); - explicit CloudStorageAuthenticate(QObject *parent); -signals: - void finishedAuthenticate(); - void passwordChangeSuccessful(); -private -slots: - void uploadError(QNetworkReply::NetworkError error); - void sslErrors(QList<QSslError> errorList); - void uploadFinished(); -private: - QNetworkReply *reply; - QString userAgent; - -}; - #ifdef __cplusplus extern "C" { #endif diff --git a/subsurface-core/CMakeLists.txt b/subsurface-core/CMakeLists.txt index b172bc6..81f000c 100644 --- a/subsurface-core/CMakeLists.txt +++ b/subsurface-core/CMakeLists.txt @@ -81,7 +81,8 @@ set(SUBSURFACE_CORE_LIB_SRCS imagedownloader.cpp isocialnetworkintegration.cpp gpslocation.cpp - + cloudstorage.cpp + #Subsurface Qt have the Subsurface structs QObjectified for easy access via QML. subsurface-qt/DiveObjectHelper.cpp subsurface-qt/SettingsObjectWrapper.cpp diff --git a/subsurface-core/cloudstorage.cpp b/subsurface-core/cloudstorage.cpp new file mode 100644 index 0000000..25a2f56 --- /dev/null +++ b/subsurface-core/cloudstorage.cpp @@ -0,0 +1,109 @@ +#include "cloudstorage.h" +#include "pref.h" +#include "dive.h" +#include "helpers.h" + +#include <QApplication> + +CloudStorageAuthenticate::CloudStorageAuthenticate(QObject *parent) : + QObject(parent), + reply(NULL) +{ + userAgent = getUserAgent(); +} + +#define CLOUDURL QString(prefs.cloud_base_url) +#define CLOUDBACKENDSTORAGE CLOUDURL + "/storage" +#define CLOUDBACKENDVERIFY CLOUDURL + "/verify" +#define CLOUDBACKENDUPDATE CLOUDURL + "/update" + +QNetworkReply* CloudStorageAuthenticate::backend(QString email, QString password, QString pin, QString newpasswd) +{ + QString payload(email + " " + password); + QUrl requestUrl; + if (pin == "" && newpasswd == "") { + requestUrl = QUrl(CLOUDBACKENDSTORAGE); + } else if (newpasswd != "") { + requestUrl = QUrl(CLOUDBACKENDUPDATE); + payload += " " + newpasswd; + } else { + requestUrl = QUrl(CLOUDBACKENDVERIFY); + payload += " " + pin; + } + QNetworkRequest *request = new QNetworkRequest(requestUrl); + request->setRawHeader("Accept", "text/xml, text/plain"); + request->setRawHeader("User-Agent", userAgent.toUtf8()); + request->setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + reply = manager()->post(*request, qPrintable(payload)); + connect(reply, SIGNAL(finished()), this, SLOT(uploadFinished())); + connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>))); + connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, + SLOT(uploadError(QNetworkReply::NetworkError))); + return reply; +} + +void CloudStorageAuthenticate::uploadFinished() +{ + static QString myLastError; + + QString cloudAuthReply(reply->readAll()); + qDebug() << "Completed connection with cloud storage backend, response" << cloudAuthReply; + if (cloudAuthReply == "[VERIFIED]" || cloudAuthReply == "[OK]") { + prefs.cloud_verification_status = CS_VERIFIED; + /* TODO: Move this to a correct place + NotificationWidget *nw = MainWindow::instance()->getNotificationWidget(); + if (nw->getNotificationText() == myLastError) + nw->hideNotification(); + */ + myLastError.clear(); + } else if (cloudAuthReply == "[VERIFY]") { + prefs.cloud_verification_status = CS_NEED_TO_VERIFY; + } else if (cloudAuthReply == "[PASSWDCHANGED]") { + free(prefs.cloud_storage_password); + prefs.cloud_storage_password = prefs.cloud_storage_newpassword; + prefs.cloud_storage_newpassword = NULL; + emit passwordChangeSuccessful(); + return; + } else { + prefs.cloud_verification_status = CS_INCORRECT_USER_PASSWD; + myLastError = cloudAuthReply; + report_error("%s", qPrintable(cloudAuthReply)); + /* TODO: Emit a signal with the error + MainWindow::instance()->getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); + */ + } + emit finishedAuthenticate(); +} + +void CloudStorageAuthenticate::uploadError(QNetworkReply::NetworkError error) +{ + qDebug() << "Received error response from cloud storage backend:" << reply->errorString(); +} + +void CloudStorageAuthenticate::sslErrors(QList<QSslError> errorList) +{ + if (verbose) { + qDebug() << "Received error response trying to set up https connection with cloud storage backend:"; + Q_FOREACH (QSslError err, errorList) { + qDebug() << err.errorString(); + } + } + QSslConfiguration conf = reply->sslConfiguration(); + QSslCertificate cert = conf.peerCertificate(); + QByteArray hexDigest = cert.digest().toHex(); + if (reply->url().toString().contains(prefs.cloud_base_url) && + hexDigest == "13ff44c62996cfa5cd69d6810675490e") { + if (verbose) + qDebug() << "Overriding SSL check as I recognize the certificate digest" << hexDigest; + reply->ignoreSslErrors(); + } else { + if (verbose) + qDebug() << "got invalid SSL certificate with hex digest" << hexDigest; + } +} + +QNetworkAccessManager *manager() +{ + static QNetworkAccessManager *manager = new QNetworkAccessManager(qApp); + return manager; +} diff --git a/subsurface-core/cloudstorage.h b/subsurface-core/cloudstorage.h new file mode 100644 index 0000000..b4b21dd --- /dev/null +++ b/subsurface-core/cloudstorage.h @@ -0,0 +1,27 @@ +#ifndef CLOUD_STORAGE_H +#define CLOUD_STORAGE_H + +#include <QObject> +#include <QNetworkReply> + +class CloudStorageAuthenticate : public QObject { + Q_OBJECT +public: + QNetworkReply* backend(QString email, QString password, QString pin = "", QString newpasswd = ""); + explicit CloudStorageAuthenticate(QObject *parent); +signals: + void finishedAuthenticate(); + void passwordChangeSuccessful(); +private +slots: + void uploadError(QNetworkReply::NetworkError error); + void sslErrors(QList<QSslError> errorList); + void uploadFinished(); +private: + QNetworkReply *reply; + QString userAgent; + bool verbose; +}; + +QNetworkAccessManager *manager(); +#endif \ No newline at end of file -- 2.7.0
_______________________________________________ subsurface mailing list [email protected] http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
