nextcloud-desktop/src/mirall/connectionvalidator.cpp

181 lines
5.7 KiB
C++
Raw Normal View History

2013-05-04 18:01:45 +04:00
/*
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include <QtCore>
2013-10-21 23:42:52 +04:00
#include <QNetworkReply>
2013-05-04 18:01:45 +04:00
#include "mirall/connectionvalidator.h"
#include "mirall/mirallconfigfile.h"
#include "mirall/theme.h"
2013-10-23 16:48:44 +04:00
#include "mirall/account.h"
#include "mirall/networkjobs.h"
#include <creds/abstractcredentials.h>
2013-05-04 18:01:45 +04:00
namespace Mirall {
2013-10-23 16:48:44 +04:00
ConnectionValidator::ConnectionValidator(Account *account, QObject *parent)
: QObject(parent),
2013-10-23 16:48:44 +04:00
_account(account),
_networkError(QNetworkReply::NoError)
2013-05-04 18:01:45 +04:00
{
}
QStringList ConnectionValidator::errors() const
{
return _errors;
}
bool ConnectionValidator::networkError() const
{
return _networkError;
}
QString ConnectionValidator::statusString( Status stat ) const
2013-05-04 18:01:45 +04:00
{
QString re;
switch( stat ) {
case Undefined:
re = QLatin1String("Undefined");
break;
case Connected:
re = QLatin1String("Connected");
break;
case NotConfigured:
re = QLatin1String("NotConfigured");
break;
case ServerVersionMismatch:
re = QLatin1String("Server Version Mismatch");
break;
case CredentialsTooManyAttempts:
re = QLatin1String("Credentials Too Many Attempts");
break;
case CredentialError:
re = QLatin1String("CredentialError");
break;
case CredentialsUserCanceled:
re = QLatin1String("Credential User Canceled");
break;
case CredentialsWrong:
re = QLatin1String("Credentials Wrong");
break;
case StatusNotFound:
re = QLatin1String("Status not found");
break;
default:
re = QLatin1String("status undeclared.");
}
return re;
2013-05-04 18:01:45 +04:00
}
void ConnectionValidator::checkConnection()
{
if( _account ) {
2013-10-23 16:48:44 +04:00
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*)));
2013-11-14 22:20:09 +04:00
checkJob->start();
2013-05-04 18:01:45 +04:00
} else {
2013-10-23 16:48:44 +04:00
_errors << tr("No ownCloud account configured");
2013-05-04 18:01:45 +04:00
emit connectionResult( NotConfigured );
}
}
void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &info)
2013-05-04 18:01:45 +04:00
{
// status.php was found.
2013-10-23 16:48:44 +04:00
qDebug() << "** Application: ownCloud found: "
<< url << " with version "
2013-10-23 16:48:44 +04:00
<< CheckServerJob::versionString(info)
<< "(" << CheckServerJob::version(info) << ")";
2013-05-04 18:01:45 +04:00
// now check the authentication
2013-10-23 16:48:44 +04:00
if( CheckServerJob::version(info).startsWith("4.0") ) {
_errors.append( tr("The configured server for this client is too old") );
_errors.append( tr("Please update to the latest server and restart the client.") );
2013-05-04 18:01:45 +04:00
emit connectionResult( ServerVersionMismatch );
return;
}
AbstractCredentials *creds = _account->credentials();
if (creds->ready()) {
QTimer::singleShot( 0, this, SLOT( slotCheckAuthentication() ));
} else {
connect( creds, SIGNAL(fetched()),
this, SLOT(slotCheckAuthentication()), Qt::UniqueConnection);
creds->fetch(_account);
}
2013-05-04 18:01:45 +04:00
}
// status.php could not be loaded.
void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
2013-05-04 18:01:45 +04:00
{
_account->setState(Account::Disconnected);
2013-10-23 16:48:44 +04:00
_errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
_errors.append( reply->errorString() );
_networkError = (reply->error() != QNetworkReply::NoError);
2013-05-04 18:01:45 +04:00
emit connectionResult( StatusNotFound );
}
void ConnectionValidator::slotCheckAuthentication()
{
AbstractCredentials *creds = _account->credentials();
disconnect( creds, SIGNAL(fetched()),
this, SLOT(slotCheckAuthentication()));
2013-05-04 18:01:45 +04:00
// simply GET the webdav root, will fail if credentials are wrong.
// continue in slotAuthCheck here :-)
PropfindJob *job = new PropfindJob(_account, "/", this);
job->setProperties(QList<QByteArray>() << "getlastmodified");
connect(job, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess()));
connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
job->start();
2013-10-23 16:48:44 +04:00
qDebug() << "# checking for authentication settings.";
2013-05-04 18:01:45 +04:00
}
void ConnectionValidator::slotAuthFailed(QNetworkReply *reply)
2013-05-04 18:01:45 +04:00
{
2013-10-23 16:48:44 +04:00
Status stat = StatusNotFound;
2013-05-04 18:01:45 +04:00
if( reply->error() == QNetworkReply::AuthenticationRequiredError ||
reply->error() == QNetworkReply::OperationCanceledError ) { // returned if the user/pwd is wrong.
qDebug() << reply->error() << reply->errorString();
2013-05-04 18:01:45 +04:00
qDebug() << "******** Password is wrong!";
_errors << tr("The provided credentials are not correct");
2013-05-04 18:01:45 +04:00
stat = CredentialsWrong;
switch (_account->state()) {
case Account::SignedOut:
_account->setState(Account::SignedOut);
break;
default:
_account->setState(Account::Disconnected);
}
} else if( reply->error() != QNetworkReply::NoError ) {
_errors << reply->errorString();
2013-05-04 18:01:45 +04:00
}
emit connectionResult( stat );
}
2013-10-23 16:48:44 +04:00
void ConnectionValidator::slotAuthSuccess()
{
_account->setState(Account::Connected);
2013-10-23 16:48:44 +04:00
emit connectionResult(Connected);
2013-05-04 18:01:45 +04:00
}
2013-10-23 16:48:44 +04:00
} // namespace Mirall