Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Molkentin <danimo@owncloud.com>2013-11-22 17:01:11 +0400
committerDaniel Molkentin <danimo@owncloud.com>2013-11-25 18:34:16 +0400
commitea2b5fb29cfe511bff8d5a7ae6e0bfa4c55738ea (patch)
treeeedba9f0aeac9fd40143e845f5c58de4d50e6c0b /src/mirall
parent0a2861a7318e354ad126e358c490134719ec3b40 (diff)
Query credentials when needed. Put the account offline if user aborts.
This is only implemented for HTTP auth. Shibboleth still does its own thing.
Diffstat (limited to 'src/mirall')
-rw-r--r--src/mirall/connectionvalidator.cpp12
-rw-r--r--src/mirall/networkjobs.cpp71
-rw-r--r--src/mirall/networkjobs.h25
-rw-r--r--src/mirall/owncloudsetupwizard.cpp8
-rw-r--r--src/mirall/owncloudsetupwizard.h4
5 files changed, 78 insertions, 42 deletions
diff --git a/src/mirall/connectionvalidator.cpp b/src/mirall/connectionvalidator.cpp
index 5bc06f16f..6d6533d4a 100644
--- a/src/mirall/connectionvalidator.cpp
+++ b/src/mirall/connectionvalidator.cpp
@@ -82,6 +82,7 @@ void ConnectionValidator::checkConnection()
{
if( _account ) {
CheckServerJob *checkJob = new CheckServerJob(_account, false, this);
+ checkJob->setIgnoreCredentialFailure(true);
connect(checkJob, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotStatusFound(QUrl,QVariantMap)));
connect(checkJob, SIGNAL(networkError(QNetworkReply*)), SLOT(slotNoStatusFound(QNetworkReply*)));
checkJob->start();
@@ -127,11 +128,12 @@ void ConnectionValidator::slotCheckAuthentication()
{
// simply GET the webdav root, will fail if credentials are wrong.
// continue in slotAuthCheck here :-)
- PropfindJob *propFind = new PropfindJob(_account, "/", this);
- propFind->setProperties(QList<QByteArray>() << "getlastmodified");
- connect(propFind, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess()));
- connect(propFind, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
- propFind->start();
+ PropfindJob *job = new PropfindJob(_account, "/", this);
+ job->setIgnoreCredentialFailure(true);
+ job->setProperties(QList<QByteArray>() << "getlastmodified");
+ connect(job, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess()));
+ connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
+ job->start();
qDebug() << "# checking for authentication settings.";
}
diff --git a/src/mirall/networkjobs.cpp b/src/mirall/networkjobs.cpp
index ce80caefa..2a29dfcbf 100644
--- a/src/mirall/networkjobs.cpp
+++ b/src/mirall/networkjobs.cpp
@@ -23,7 +23,7 @@
#include <QStringList>
#include <QStack>
#include <QTimer>
-
+#include <QMutex>
#include <QDebug>
#include "json.h"
@@ -32,11 +32,13 @@
#include "mirall/account.h"
#include "creds/credentialsfactory.h"
+#include "creds/abstractcredentials.h"
namespace Mirall {
AbstractNetworkJob::AbstractNetworkJob(Account *account, const QString &path, QObject *parent)
: QObject(parent)
+ , _ignoreCredentialFailure(false)
, _reply(0)
, _account(account)
, _path(path)
@@ -70,6 +72,11 @@ void AbstractNetworkJob::resetTimeout()
_timer->start(interval);
}
+void AbstractNetworkJob::setIgnoreCredentialFailure(bool ignore)
+{
+ _ignoreCredentialFailure = ignore;
+}
+
void AbstractNetworkJob::setAccount(Account *account)
{
_account = account;
@@ -80,14 +87,10 @@ void AbstractNetworkJob::setPath(const QString &path)
_path = path;
}
-void AbstractNetworkJob::slotError(QNetworkReply::NetworkError error)
+void AbstractNetworkJob::slotError(QNetworkReply::NetworkError)
{
- if (error == QNetworkReply::ContentAccessDenied) {
- // ### ask for password, retry job, needs refactoring to use start()
- }
qDebug() << metaObject()->className() << "Error:" << _reply->errorString();
emit networkError(_reply);
- deleteLater();
}
void AbstractNetworkJob::setupConnections(QNetworkReply *reply)
@@ -128,10 +131,37 @@ QNetworkReply *AbstractNetworkJob::headRequest(const QUrl &url)
return _account->headRequest(url);
}
+void AbstractNetworkJob::slotFinished()
+{
+ static QMutex mutex;
+ AbstractCredentials *creds = _account->credentials();
+ qDebug() << creds->stillValid(_reply) << _ignoreCredentialFailure << _reply->errorString();
+ if (creds->stillValid(_reply) || _ignoreCredentialFailure) {
+ finished();
+ } else {
+ // If other jobs that still were created from before
+ // the account was put offline by the code below,
+ // we do want them to fail silently while we
+ // query the user
+ if (mutex.tryLock()) {
+ Account *a = account();
+ a->setOnline(false);
+ a->setOnline(creds->fetchFromUser(a));
+ mutex.unlock();
+ }
+ }
+ deleteLater();
+}
+
AbstractNetworkJob::~AbstractNetworkJob() {
_reply->deleteLater();
}
+void AbstractNetworkJob::start()
+{
+ qDebug() << "!!!" << metaObject()->className() << "created for" << account()->url() << "querying" << path();
+}
+
/*********************************************************************************************/
RequestEtagJob::RequestEtagJob(Account *account, const QString &path, QObject *parent)
@@ -167,9 +197,10 @@ void RequestEtagJob::start()
if( reply()->error() != QNetworkReply::NoError ) {
qDebug() << "getting etag: request network error: " << reply()->errorString();
}
+ AbstractNetworkJob::start();
}
-void RequestEtagJob::slotFinished()
+void RequestEtagJob::finished()
{
if (reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 207) {
// Parse DAV response
@@ -188,7 +219,6 @@ void RequestEtagJob::slotFinished()
}
emit etagRetreived(etag);
}
- deleteLater();
}
/*********************************************************************************************/
@@ -204,12 +234,12 @@ void MkColJob::start()
QNetworkReply *reply = davRequest("MKCOL", path());
setReply(reply);
setupConnections(reply);
+ AbstractNetworkJob::start();
}
-void MkColJob::slotFinished()
+void MkColJob::finished()
{
emit finished(reply()->error());
- deleteLater();
}
/*********************************************************************************************/
@@ -236,9 +266,10 @@ void LsColJob::start()
buf->setParent(reply);
setReply(reply);
setupConnections(reply);
+ AbstractNetworkJob::start();
}
-void LsColJob::slotFinished()
+void LsColJob::finished()
{
if (reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 207) {
// Parse DAV response
@@ -264,8 +295,6 @@ void LsColJob::slotFinished()
}
emit directoryListing(folders);
}
-
- deleteLater();
}
/*********************************************************************************************/
@@ -281,6 +310,7 @@ void CheckServerJob::start()
{
setReply(getRequest(path()));
setupConnections(reply());
+ AbstractNetworkJob::start();
}
void CheckServerJob::slotTimeout()
@@ -305,7 +335,7 @@ bool CheckServerJob::installed(const QVariantMap &info)
return info.value(QLatin1String("installed")).toBool();
}
-void CheckServerJob::slotFinished()
+void CheckServerJob::finished()
{
account()->setCertificateChain(reply()->sslConfiguration().peerCertificateChain());
@@ -343,7 +373,6 @@ void CheckServerJob::slotFinished()
} else {
qDebug() << "No proper answer on " << requestedUrl;
}
- deleteLater();
}
/*********************************************************************************************/
@@ -380,6 +409,7 @@ void PropfindJob::start()
setReply(davRequest("PROPFIND", path(), req, buf));
buf->setParent(reply());
setupConnections(reply());
+ AbstractNetworkJob::start();
}
void PropfindJob::setProperties(QList<QByteArray> properties)
@@ -392,7 +422,7 @@ QList<QByteArray> PropfindJob::properties() const
return _properties;
}
-void PropfindJob::slotFinished()
+void PropfindJob::finished()
{
int http_result_code = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -426,8 +456,6 @@ void PropfindJob::slotFinished()
} else {
qDebug() << "Quota request *not* successful, http result code is " << http_result_code;
}
-
- deleteLater();
}
/*********************************************************************************************/
@@ -441,9 +469,10 @@ void EntityExistsJob::start()
{
setReply(headRequest(path()));
setupConnections(reply());
+ AbstractNetworkJob::start();
}
-void EntityExistsJob::slotFinished()
+void EntityExistsJob::finished()
{
emit exists(reply());
}
@@ -473,9 +502,10 @@ void CheckQuotaJob::start()
setReply(davRequest("PROPFIND", path(), req, buf));
buf->setParent(reply());
setupConnections(reply());
+ AbstractNetworkJob::start();
}
-void CheckQuotaJob::slotFinished()
+void CheckQuotaJob::finished()
{
if (reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute) == 207) {
// Parse DAV response
@@ -498,7 +528,6 @@ void CheckQuotaJob::slotFinished()
qint64 total = quotaUsedBytes + quotaAvailableBytes;
emit quotaRetrieved(total, quotaUsedBytes);
}
- deleteLater();
}
} // namespace Mirall
diff --git a/src/mirall/networkjobs.h b/src/mirall/networkjobs.h
index 4b1475fbd..5617f6f30 100644
--- a/src/mirall/networkjobs.h
+++ b/src/mirall/networkjobs.h
@@ -37,7 +37,7 @@ public:
explicit AbstractNetworkJob(Account *account, const QString &path, QObject* parent = 0);
virtual ~AbstractNetworkJob();
- virtual void start() = 0;
+ virtual void start();
void setAccount(Account *account);
Account* account() const { return _account; }
@@ -50,6 +50,9 @@ public:
void setTimeout(qint64 msec);
void resetTimeout();
+ void setIgnoreCredentialFailure(bool ignore);
+ bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; }
+
signals:
void networkError(QNetworkReply *reply);
protected:
@@ -66,13 +69,15 @@ protected:
QNetworkReply* headRequest(const QUrl &url);
int maxRedirects() const { return 10; }
+ virtual void finished() = 0;
private slots:
- virtual void slotFinished() = 0;
+ void slotFinished();
void slotError(QNetworkReply::NetworkError);
virtual void slotTimeout() {}
private:
+ bool _ignoreCredentialFailure;
QNetworkReply *_reply;
Account *_account;
QString _path;
@@ -92,7 +97,7 @@ signals:
void exists(QNetworkReply*);
private slots:
- virtual void slotFinished();
+ virtual void finished();
};
/**
@@ -108,7 +113,7 @@ signals:
void directoryListing(const QStringList &items);
private slots:
- virtual void slotFinished();
+ virtual void finished();
};
/**
@@ -126,7 +131,7 @@ signals:
void result(const QVariantMap &values);
private slots:
- virtual void slotFinished();
+ virtual void finished();
private:
QList<QByteArray> _properties;
@@ -145,11 +150,11 @@ signals:
void finished(QNetworkReply::NetworkError);
private slots:
- virtual void slotFinished();
+ virtual void finished();
};
/**
- * @brief The CheckOwncloudJob class
+ * @brief The CheckServerJob class
*/
class CheckServerJob : public AbstractNetworkJob {
Q_OBJECT
@@ -166,7 +171,7 @@ signals:
void timeout(const QUrl&url);
private slots:
- virtual void slotFinished();
+ virtual void finished();
virtual void slotTimeout();
private:
@@ -188,7 +193,7 @@ signals:
void etagRetreived(const QString &etag);
private slots:
- virtual void slotFinished();
+ virtual void finished();
};
/**
@@ -204,7 +209,7 @@ signals:
void quotaRetrieved(qint64 totalBytes, qint64 availableBytes);
private slots:
- virtual void slotFinished();
+ virtual void finished();
};
} // namespace Mirall
diff --git a/src/mirall/owncloudsetupwizard.cpp b/src/mirall/owncloudsetupwizard.cpp
index 1e613ccd6..808aa3c80 100644
--- a/src/mirall/owncloudsetupwizard.cpp
+++ b/src/mirall/owncloudsetupwizard.cpp
@@ -430,9 +430,10 @@ void DetermineAuthTypeJob::start()
QNetworkReply *reply = getRequest(Account::davPath());
setReply(reply);
setupConnections(reply);
+ AbstractNetworkJob::start();
}
-void DetermineAuthTypeJob::slotFinished()
+void DetermineAuthTypeJob::finished()
{
QUrl redirection = reply()->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
qDebug() << redirection.toString();
@@ -458,7 +459,6 @@ void DetermineAuthTypeJob::slotFinished()
emit authType(WizardCommon::HttpCreds);
}
}
- deleteLater();
}
ValidateDavAuthJob::ValidateDavAuthJob(Account *account, QObject *parent)
@@ -471,12 +471,12 @@ void ValidateDavAuthJob::start()
QNetworkReply *reply = getRequest(Account::davPath());
setReply(reply);
setupConnections(reply);
+ AbstractNetworkJob::start();
}
-void ValidateDavAuthJob::slotFinished()
+void ValidateDavAuthJob::finished()
{
emit authResult(reply());
- deleteLater();
}
} // ns Mirall
diff --git a/src/mirall/owncloudsetupwizard.h b/src/mirall/owncloudsetupwizard.h
index d5cfd87c1..ee9f329bf 100644
--- a/src/mirall/owncloudsetupwizard.h
+++ b/src/mirall/owncloudsetupwizard.h
@@ -39,7 +39,7 @@ public:
signals:
void authResult(QNetworkReply*);
private slots:
- void slotFinished();
+ void finished();
};
class DetermineAuthTypeJob : public AbstractNetworkJob {
@@ -50,7 +50,7 @@ public:
signals:
void authType(WizardCommon::AuthType);
private slots:
- void slotFinished();
+ void finished();
private:
int _redirects;
};