diff options
author | Daniel Molkentin <danimo@owncloud.com> | 2013-11-22 17:01:11 +0400 |
---|---|---|
committer | Daniel Molkentin <danimo@owncloud.com> | 2013-11-25 18:34:16 +0400 |
commit | ea2b5fb29cfe511bff8d5a7ae6e0bfa4c55738ea (patch) | |
tree | eedba9f0aeac9fd40143e845f5c58de4d50e6c0b /src/mirall | |
parent | 0a2861a7318e354ad126e358c490134719ec3b40 (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.cpp | 12 | ||||
-rw-r--r-- | src/mirall/networkjobs.cpp | 71 | ||||
-rw-r--r-- | src/mirall/networkjobs.h | 25 | ||||
-rw-r--r-- | src/mirall/owncloudsetupwizard.cpp | 8 | ||||
-rw-r--r-- | src/mirall/owncloudsetupwizard.h | 4 |
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; }; |