Location service: retrieve the userid using the cloud storage API

This should actually not be in the mobile section at all. This needs to be
available on the desktop as well.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2015-11-18 13:14:19 -08:00
parent 18e52c1da4
commit 74b15922f3
3 changed files with 73 additions and 1 deletions

View file

@ -11,6 +11,9 @@
#include <QApplication>
#include <QTimer>
#define GPS_FIX_ADD_URL "http://api.subsurface-divelog.org/api/dive/add/"
#define GET_WEBSERVICE_UID_URL "https://cloud.subsurface-divelog.org/webuserid/"
GpsLocation::GpsLocation(QObject *parent)
{
// create a QSettings object that's separate from the main application settings
@ -79,6 +82,44 @@ void GpsLocation::status(QString msg)
qmlUiShowMessage(qPrintable(msg));
}
QString GpsLocation::getUserid(QString user, QString passwd)
{
qDebug() << "called getUserid";
QEventLoop loop;
QTimer timer;
timer.setSingleShot(true);
QNetworkAccessManager *manager = new QNetworkAccessManager(qApp);
QUrl url(GET_WEBSERVICE_UID_URL);
QString data;
data = user + " " + passwd;
QNetworkRequest request;
request.setUrl(url);
request.setRawHeader("Accept", "text/html");
request.setRawHeader("Content-type", "application/x-www-form-urlencoded");
reply = manager->post(request, data.toUtf8());
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(getUseridError(QNetworkReply::NetworkError)));
timer.start(10000);
loop.exec();
if (timer.isActive()) {
timer.stop();
if (reply->error() == QNetworkReply::NoError) {
QString result = reply->readAll();
status(QString("received ") + result);
result.remove("WebserviceID:");
reply->deleteLater();
return result;
}
} else {
status("Getting Web service ID timed out");
}
reply->deleteLater();
return QString();
}
int GpsLocation::getGpsNum() const
{
return geoSettings->value("count", 0).toInt();
@ -223,6 +264,11 @@ void GpsLocation::postError(QNetworkReply::NetworkError error)
status(QString("error when sending a GPS fix: %1").arg(reply->errorString()));
}
void GpsLocation::getUseridError(QNetworkReply::NetworkError error)
{
status(QString("error when retrieving Subsurface webservice user id: %1").arg(reply->errorString()));
}
void GpsLocation::uploadToServer()
{
// we want to do this one at a time (the server prefers that)
@ -231,7 +277,7 @@ void GpsLocation::uploadToServer()
timer.setSingleShot(true);
QNetworkAccessManager *manager = new QNetworkAccessManager(qApp);
QUrl url("http://api.subsurface-divelog.org/api/dive/add/");
QUrl url(GPS_FIX_ADD_URL);
int count = geoSettings->value("count", 0).toInt();
for (int i = 0; i < count; i++) {
QDateTime dt;

View file

@ -16,6 +16,7 @@ public:
GpsLocation(QObject *parent);
bool applyLocations();
int getGpsNum() const;
QString getUserid(QString user, QString passwd);
private:
QGeoPositionInfo lastPos;
@ -32,6 +33,7 @@ public slots:
void updateTimeout();
void uploadToServer();
void postError(QNetworkReply::NetworkError error);
void getUseridError(QNetworkReply::NetworkError error);
void clearGpsData();
};

View file

@ -25,6 +25,12 @@ QMLManager::QMLManager() :
setCloudUserName(prefs.cloud_storage_email);
setCloudPassword(prefs.cloud_storage_password);
setSaveCloudPassword(prefs.save_password_local);
// if the cloud credentials are valid, we should get the GPS Webservice ID as well
if (!same_string(prefs.cloud_storage_email, "") &&
!same_string(prefs.cloud_storage_password, "") &&
same_string(prefs.userid, ""))
locationProvider->getUserid(prefs.cloud_storage_email, prefs.cloud_storage_password);
setDistanceThreshold(prefs.distance_threshold);
setTimeThreshold(prefs.time_threshold / 60);
if (!same_string(prefs.cloud_storage_email, "") && !same_string(prefs.cloud_storage_password, ""))
@ -38,6 +44,7 @@ QMLManager::~QMLManager()
void QMLManager::savePreferences()
{
QSettings s;
bool cloudCredentialsChanged = false;
s.beginGroup("LocationService");
s.setValue("time_threshold", timeThreshold() * 60);
prefs.time_threshold = timeThreshold() * 60;
@ -53,15 +60,32 @@ void QMLManager::savePreferences()
if (!same_string(prefs.cloud_storage_email, qPrintable(cloudUserName()))) {
free(prefs.cloud_storage_email);
prefs.cloud_storage_email = strdup(qPrintable(cloudUserName()));
cloudCredentialsChanged = true;
}
if (saveCloudPassword() != prefs.save_password_local)
prefs.save_password_local = saveCloudPassword();
cloudCredentialsChanged |= !same_string(prefs.cloud_storage_password, qPrintable(cloudPassword()));
if (saveCloudPassword()) {
if (!same_string(prefs.cloud_storage_password, qPrintable(cloudPassword()))) {
free(prefs.cloud_storage_password);
prefs.cloud_storage_password = strdup(qPrintable(cloudPassword()));
}
}
// if the cloud credentials are valid, we should get the GPS Webservice ID as well
if (!same_string(prefs.cloud_storage_email, "") &&
!same_string(prefs.cloud_storage_password, "")) {
if (same_string(prefs.userid, "") || cloudCredentialsChanged) {
QString userid = locationProvider->getUserid(prefs.cloud_storage_email, prefs.cloud_storage_password);
if (!userid.isEmpty()) {
// overwrite the existing userid
free(prefs.userid);
prefs.userid = strdup(qPrintable(userid));
s.setValue("subsurface_webservice_uid", prefs.userid);
}
}
}
}
void QMLManager::loadDives()