Make the setup wizard compile again

- introduces more jobs
- needs more cleaning up
This commit is contained in:
Daniel Molkentin 2013-10-28 20:01:59 +01:00
parent aa2baa45fb
commit a91799a11c
16 changed files with 314 additions and 330 deletions

View file

@ -212,14 +212,14 @@ set(mirall_SRCS
mirall/folderwizard.cpp mirall/folderwizard.cpp
mirall/folderstatusmodel.cpp mirall/folderstatusmodel.cpp
mirall/protocolwidget.cpp mirall/protocolwidget.cpp
# wizard/owncloudwizard.cpp wizard/owncloudwizard.cpp
# wizard/owncloudsetuppage.cpp wizard/owncloudsetuppage.cpp
# wizard/owncloudhttpcredspage.cpp wizard/owncloudhttpcredspage.cpp
# wizard/owncloudwizardresultpage.cpp wizard/owncloudwizardresultpage.cpp
# wizard/owncloudwizardcommon.cpp wizard/owncloudwizardcommon.cpp
# wizard/owncloudshibbolethcredspage.cpp wizard/owncloudshibbolethcredspage.cpp
# wizard/owncloudadvancedsetuppage.cpp wizard/owncloudadvancedsetuppage.cpp
# mirall/owncloudsetupwizard.cpp mirall/owncloudsetupwizard.cpp
mirall/updatedetector.cpp mirall/updatedetector.cpp
mirall/occinfo.cpp mirall/occinfo.cpp
mirall/sslerrordialog.cpp mirall/sslerrordialog.cpp
@ -237,14 +237,14 @@ set(mirall_HEADERS
mirall/application.h mirall/application.h
mirall/systray.h mirall/systray.h
mirall/folderwizard.h mirall/folderwizard.h
# mirall/owncloudsetupwizard.h mirall/owncloudsetupwizard.h
# wizard/owncloudwizard.h wizard/owncloudwizard.h
# wizard/owncloudsetuppage.h wizard/owncloudsetuppage.h
# wizard/owncloudhttpcredspage.h wizard/owncloudhttpcredspage.h
# wizard/owncloudwizardresultpage.h wizard/owncloudwizardresultpage.h
# wizard/owncloudwizardcommon.h wizard/owncloudwizardcommon.h
# wizard/owncloudshibbolethcredspage.h wizard/owncloudshibbolethcredspage.h
# wizard/owncloudadvancedsetuppage.h wizard/owncloudadvancedsetuppage.h
mirall/folderstatusmodel.h mirall/folderstatusmodel.h
mirall/updatedetector.h mirall/updatedetector.h
mirall/sslerrordialog.h mirall/sslerrordialog.h

View file

@ -48,13 +48,14 @@ AccountManager *AccountManager::instance()
} }
Account::Account(QObject *parent) Account::Account(AbstractSslErrorHandler *sslErrorHandler, QObject *parent)
: QObject(parent) : QObject(parent)
, _am(0) , _am(0)
, _credentials(0) , _credentials(0)
, _treatSslErrorsAsFailure(false) , _treatSslErrorsAsFailure(false)
, _sslErrorHandler(0) , _sslErrorHandler(0)
{ {
setSslErrorHandler(sslErrorHandler);
} }
void Account::save(QSettings &settings) void Account::save(QSettings &settings)
@ -112,11 +113,9 @@ void Account::setCredentials(AbstractCredentials *cred)
SLOT(slotHandleErrors(QNetworkReply*,QList<QSslError>))); SLOT(slotHandleErrors(QNetworkReply*,QList<QSslError>)));
} }
static const char WEBDAV_PATH[] = "remote.php/webdav/";
QUrl Account::davUrl() const QUrl Account::davUrl() const
{ {
return concatUrlPath(url(), WEBDAV_PATH); return concatUrlPath(url(), davPath());
} }
QList<QNetworkCookie> Account::lastAuthCookies() const QList<QNetworkCookie> Account::lastAuthCookies() const
@ -124,17 +123,36 @@ QList<QNetworkCookie> Account::lastAuthCookies() const
return _am->cookieJar()->cookiesForUrl(_url); return _am->cookieJar()->cookiesForUrl(_url);
} }
QNetworkReply *Account::headRequest(const QString &relPath)
{
return headRequest(concatUrlPath(url(), relPath));
}
QNetworkReply *Account::headRequest(const QUrl &url)
{
QNetworkRequest request(url);
return _am->head(request);
}
QNetworkReply *Account::getRequest(const QString &relPath) QNetworkReply *Account::getRequest(const QString &relPath)
{ {
QNetworkRequest request(concatUrlPath(url(), relPath)); return getRequest(concatUrlPath(url(), relPath));
// ### error handling }
QNetworkReply *Account::getRequest(const QUrl &url)
{
QNetworkRequest request(url);
return _am->get(request); return _am->get(request);
} }
QNetworkReply *Account::davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data) QNetworkReply *Account::davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data)
{ {
req.setUrl(concatUrlPath(davUrl(), relPath)); return davRequest(verb, concatUrlPath(davUrl(), relPath), req, data);
// ### error handling }
QNetworkReply *Account::davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data)
{
req.setUrl(url);
return _am->sendCustomRequest(req, verb, data); return _am->sendCustomRequest(req, verb, data);
} }
@ -167,7 +185,7 @@ QUrl Account::concatUrlPath(const QUrl &url, const QString &concatPath)
{ {
QUrl tmpUrl = url; QUrl tmpUrl = url;
QString path = tmpUrl.path(); QString path = tmpUrl.path();
if (!path.endsWith('/')) { if (!path.endsWith('/') || !concatPath.startsWith('/')) {
path += QLatin1Char('/'); path += QLatin1Char('/');
} }
path += concatPath; path += concatPath;

View file

@ -41,7 +41,7 @@ public:
Account *account() { return _account; } Account *account() { return _account; }
private: private:
AccountManager() {} AccountManager() : _account(0) {}
Account *_account; Account *_account;
static AccountManager *_instance; static AccountManager *_instance;
}; };
@ -59,7 +59,9 @@ public:
class Account : public QObject { class Account : public QObject {
Q_OBJECT Q_OBJECT
public: public:
Account(QObject *parent = 0); static QString davPath() { return "remote.php/webdav/"; }
Account(AbstractSslErrorHandler *sslErrorHandler = 0, QObject *parent = 0);
/** /**
* Saves the account to a given settings file * Saves the account to a given settings file
*/ */
@ -69,6 +71,14 @@ public:
* Creates an account object from from a given settings file. * Creates an account object from from a given settings file.
*/ */
static Account* restore(QSettings &settings); static Account* restore(QSettings &settings);
/**
* @brief Creates a minimal account object
*
* This will set up a ssl error handler
*
* @return A new Account object
*/
static Account* create(const QUrl &url);
/** Holds the accounts credentials */ /** Holds the accounts credentials */
AbstractCredentials* credentials() const; AbstractCredentials* credentials() const;
@ -87,8 +97,12 @@ public:
QList<QNetworkCookie> lastAuthCookies() const; QList<QNetworkCookie> lastAuthCookies() const;
QNetworkReply* headRequest(const QString &relPath);
QNetworkReply* headRequest(const QUrl &url);
QNetworkReply* getRequest(const QString &relPath); QNetworkReply* getRequest(const QString &relPath);
QNetworkReply* getRequest(const QUrl &url);
QNetworkReply* davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data = 0); QNetworkReply* davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data = 0);
QNetworkReply* davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data = 0);
/** The certificates of the account */ /** The certificates of the account */
QList<QSslCertificate> certificateChain() const { return _certificateChain; } QList<QSslCertificate> certificateChain() const { return _certificateChain; }
@ -101,7 +115,7 @@ public:
static QUrl concatUrlPath(const QUrl &url, const QString &concatPath); static QUrl concatUrlPath(const QUrl &url, const QString &concatPath);
private slots: protected slots:
void slotHandleErrors(QNetworkReply*,QList<QSslError>); void slotHandleErrors(QNetworkReply*,QList<QSslError>);
private: private:

View file

@ -174,8 +174,7 @@ void AccountSettings::slotFolderWizardRejected()
void AccountSettings::slotOpenAccountWizard() void AccountSettings::slotOpenAccountWizard()
{ {
this->topLevelWidget()->close(); this->topLevelWidget()->close();
// ### TODO OwncloudSetupWizard::runWizard(qApp, SLOT(slotownCloudWizardDone(int)), 0);
//OwncloudSetupWizard::runWizard(qApp, SLOT(slotownCloudWizardDone(int)), 0);
} }
void AccountSettings::slotAddFolder( Folder *folder ) void AccountSettings::slotAddFolder( Folder *folder )

View file

@ -117,8 +117,10 @@ Application::Application(int &argc, char **argv) :
MirallConfigFile cfg; MirallConfigFile cfg;
QSettings settings(cfg.configFile(), QSettings::IniFormat); QSettings settings(cfg.configFile(), QSettings::IniFormat);
Account *account = Account::restore(settings); Account *account = Account::restore(settings);
if (account) {
account->setSslErrorHandler(new SslDialogErrorHandler); account->setSslErrorHandler(new SslDialogErrorHandler);
AccountManager::instance()->setAccount(account); AccountManager::instance()->setAccount(account);
}
FolderMan::instance()->setSyncEnabled(false); FolderMan::instance()->setSyncEnabled(false);

View file

@ -88,20 +88,19 @@ void ConnectionValidator::checkConnection()
{ {
if( AccountManager::instance()->account() ) { if( AccountManager::instance()->account() ) {
CheckServerJob *checkJob = new CheckServerJob(_account, false, this); CheckServerJob *checkJob = new CheckServerJob(_account, false, this);
connect(checkJob, SIGNAL(instanceFound(QVariantMap)), SLOT(slotStatusFound(QVariantMap))); connect(checkJob, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotStatusFound(QUrl,QVariantMap)));
connect(checkJob, SIGNAL(networkError(QNetworkReply::NetworkError,QString)), connect(checkJob, SIGNAL(networkError(QNetworkReply*)), SLOT(slotNoStatusFound(QNetworkReply*)));
SLOT(slotNoStatusFound(QNetworkReply::NetworkError,QString)));
} else { } else {
_errors << tr("No ownCloud account configured"); _errors << tr("No ownCloud account configured");
emit connectionResult( NotConfigured ); emit connectionResult( NotConfigured );
} }
} }
void ConnectionValidator::slotStatusFound( const QVariantMap &info ) void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &info)
{ {
// status.php was found. // status.php was found.
qDebug() << "** Application: ownCloud found: " qDebug() << "** Application: ownCloud found: "
<< _account->url() << " with version " << url << " with version "
<< CheckServerJob::versionString(info) << CheckServerJob::versionString(info)
<< "(" << CheckServerJob::version(info) << ")"; << "(" << CheckServerJob::version(info) << ")";
// now check the authentication // now check the authentication
@ -117,12 +116,12 @@ void ConnectionValidator::slotStatusFound( const QVariantMap &info )
} }
// status.php could not be loaded. // status.php could not be loaded.
void ConnectionValidator::slotNoStatusFound(QNetworkReply::NetworkError error, const QString &errStr) void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
{ {
// ### TODO // ### TODO
_errors.append(tr("Unable to connect to %1").arg(_account->url().toString())); _errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
_errors.append( errStr ); _errors.append( reply->errorString() );
_networkError = (error != QNetworkReply::NoError); _networkError = (reply->error() != QNetworkReply::NoError);
emit connectionResult( StatusNotFound ); emit connectionResult( StatusNotFound );
} }
@ -133,22 +132,21 @@ void ConnectionValidator::slotCheckAuthentication()
// continue in slotAuthCheck here :-) // continue in slotAuthCheck here :-)
PropfindJob *propFind = new PropfindJob(_account, "/", QList<QByteArray>() << "getlastmodified", this); PropfindJob *propFind = new PropfindJob(_account, "/", QList<QByteArray>() << "getlastmodified", this);
connect(propFind, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess())); connect(propFind, SIGNAL(result(QVariantMap)), SLOT(slotAuthSuccess()));
connect(propFind, SIGNAL(networkError(QNetworkReply::NetworkError, QString)), connect(propFind, SIGNAL(networkError(QNetworkReply*)), SLOT(slotAuthFailed(QNetworkReply*)));
SLOT(slotAuthFailed(QNetworkReply::NetworkError, QString)));
qDebug() << "# checking for authentication settings."; qDebug() << "# checking for authentication settings.";
} }
void ConnectionValidator::slotAuthFailed(QNetworkReply::NetworkError error, const QString& errString) void ConnectionValidator::slotAuthFailed(QNetworkReply *reply)
{ {
Status stat = StatusNotFound; Status stat = StatusNotFound;
if( error == QNetworkReply::AuthenticationRequiredError || if( reply->error() == QNetworkReply::AuthenticationRequiredError ||
error == QNetworkReply::OperationCanceledError ) { // returned if the user is wrong. reply->error() == QNetworkReply::OperationCanceledError ) { // returned if the user is wrong.
qDebug() << "******** Password is wrong!"; qDebug() << "******** Password is wrong!";
_errors << tr("The provided credentials are not correct"); _errors << tr("The provided credentials are not correct");
stat = CredentialsWrong; stat = CredentialsWrong;
} else if( error != QNetworkReply::NoError ) { } else if( reply->error() != QNetworkReply::NoError ) {
_errors << errString; _errors << reply->errorString();
} }
emit connectionResult( stat ); emit connectionResult( stat );

View file

@ -58,11 +58,11 @@ signals:
public slots: public slots:
protected slots: protected slots:
void slotStatusFound( const QVariantMap &info ); void slotStatusFound(const QUrl&url, const QVariantMap &info);
void slotNoStatusFound(QNetworkReply::NetworkError error, const QString& errString); void slotNoStatusFound(QNetworkReply *reply);
void slotCheckAuthentication(); void slotCheckAuthentication();
void slotAuthFailed(QNetworkReply::NetworkError error, const QString& errString); void slotAuthFailed(QNetworkReply *reply);
void slotAuthSuccess(); void slotAuthSuccess();
private: private:

View file

@ -206,8 +206,7 @@ void FolderWizardTargetPage::slotCreateRemoteFolder(QString folder)
MkColJob *job = new MkColJob(AccountManager::instance()->account(), folder, this); MkColJob *job = new MkColJob(AccountManager::instance()->account(), folder, this);
/* check the owncloud configuration file and query the ownCloud */ /* check the owncloud configuration file and query the ownCloud */
connect(job, SIGNAL(finished()), SLOT(slotCreateRemoteFolderFinished())); connect(job, SIGNAL(finished()), SLOT(slotCreateRemoteFolderFinished()));
connect(job, SIGNAL(networkError(QNetworkReply::NetworkError,QString)), connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotHandleNetworkError(QNetworkReply*)));
SLOT(slotHandleNetworkError(QNetworkReply::NetworkError,QString)));
} }
void FolderWizardTargetPage::slotCreateRemoteFolderFinished() void FolderWizardTargetPage::slotCreateRemoteFolderFinished()
@ -217,9 +216,9 @@ void FolderWizardTargetPage::slotCreateRemoteFolderFinished()
slotRefreshFolders(); slotRefreshFolders();
} }
void FolderWizardTargetPage::slotHandleNetworkError(QNetworkReply::NetworkError, const QString& error) void FolderWizardTargetPage::slotHandleNetworkError(QNetworkReply *reply)
{ {
qDebug() << "** webdav mkdir request failed:" << error; qDebug() << "** webdav mkdir request failed:" << reply->error();
showWarn(tr("Failed to create the folder on %1.<br/>Please check manually.") showWarn(tr("Failed to create the folder on %1.<br/>Please check manually.")
.arg(Theme::instance()->appNameGUI())); .arg(Theme::instance()->appNameGUI()));
} }

View file

@ -77,7 +77,7 @@ protected slots:
void slotAddRemoteFolder(); void slotAddRemoteFolder();
void slotCreateRemoteFolder(QString); void slotCreateRemoteFolder(QString);
void slotCreateRemoteFolderFinished(); void slotCreateRemoteFolderFinished();
void slotHandleNetworkError(QNetworkReply::NetworkError, const QString& error); void slotHandleNetworkError(QNetworkReply*);
void slotUpdateDirectories(QStringList); void slotUpdateDirectories(QStringList);
void slotRefreshFolders(); void slotRefreshFolders();
void slotItemExpanded(QTreeWidgetItem*); void slotItemExpanded(QTreeWidgetItem*);

View file

@ -15,6 +15,8 @@
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QSslConfiguration> #include <QSslConfiguration>
#include <QBuffer> #include <QBuffer>
#include <QXmlStreamReader> #include <QXmlStreamReader>
@ -28,6 +30,8 @@
#include "mirall/networkjobs.h" #include "mirall/networkjobs.h"
#include "mirall/account.h" #include "mirall/account.h"
#include "creds/credentialsfactory.h"
namespace Mirall { namespace Mirall {
AbstractNetworkJob::AbstractNetworkJob(Account *account, const QString &path, QObject *parent) AbstractNetworkJob::AbstractNetworkJob(Account *account, const QString &path, QObject *parent)
@ -40,14 +44,10 @@ AbstractNetworkJob::AbstractNetworkJob(Account *account, const QString &path, QO
void AbstractNetworkJob::setReply(QNetworkReply *reply) void AbstractNetworkJob::setReply(QNetworkReply *reply)
{ {
_reply = reply; if (_reply) {
_reply->deleteLater();
} }
_reply = reply;
QNetworkReply *AbstractNetworkJob::takeReply()
{
QNetworkReply *reply = _reply;
_reply = 0;
return reply;
} }
void AbstractNetworkJob::setAccount(Account *account) void AbstractNetworkJob::setAccount(Account *account)
@ -63,7 +63,7 @@ void AbstractNetworkJob::setPath(const QString &path)
void AbstractNetworkJob::slotError() void AbstractNetworkJob::slotError()
{ {
qDebug() << metaObject()->className() << "Error:" << _reply->errorString(); qDebug() << metaObject()->className() << "Error:" << _reply->errorString();
emit networkError(_reply->error(), _reply->errorString()); emit networkError(_reply);
deleteLater(); deleteLater();
} }
@ -72,9 +72,6 @@ void AbstractNetworkJob::setupConnections(QNetworkReply *reply)
connect(reply, SIGNAL(finished()), SLOT(slotFinished())); connect(reply, SIGNAL(finished()), SLOT(slotFinished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError())); this, SLOT(slotError()));
// connect( reply, SIGNAL(error(QNetworkReply::NetworkError)),
// ownCloudInfo::instance(), SLOT(slotError(QNetworkReply::NetworkError)));
} }
QNetworkReply* AbstractNetworkJob::davRequest(const QByteArray &verb, const QString &relPath, QNetworkReply* AbstractNetworkJob::davRequest(const QByteArray &verb, const QString &relPath,
@ -83,11 +80,31 @@ QNetworkReply* AbstractNetworkJob::davRequest(const QByteArray &verb, const QStr
return _account->davRequest(verb, relPath, req, data); return _account->davRequest(verb, relPath, req, data);
} }
QNetworkReply *AbstractNetworkJob::davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data)
{
return _account->davRequest(verb, url, req, data);
}
QNetworkReply* AbstractNetworkJob::getRequest(const QString &relPath) QNetworkReply* AbstractNetworkJob::getRequest(const QString &relPath)
{ {
return _account->getRequest(relPath); return _account->getRequest(relPath);
} }
QNetworkReply *AbstractNetworkJob::getRequest(const QUrl &url)
{
return _account->getRequest(url);
}
QNetworkReply *AbstractNetworkJob::headRequest(const QString &relPath)
{
return _account->headRequest(relPath);
}
QNetworkReply *AbstractNetworkJob::headRequest(const QUrl &url)
{
return _account->headRequest(url);
}
AbstractNetworkJob::~AbstractNetworkJob() { AbstractNetworkJob::~AbstractNetworkJob() {
_reply->deleteLater(); _reply->deleteLater();
} }
@ -161,9 +178,7 @@ MkColJob::MkColJob(Account *account, const QString &path, QObject *parent)
void MkColJob::slotFinished() void MkColJob::slotFinished()
{ {
// ### useful error handling? emit finished(reply()->error());
// QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
emit finished();
deleteLater(); deleteLater();
} }
@ -222,7 +237,7 @@ void LsColJob::slotFinished()
/*********************************************************************************************/ /*********************************************************************************************/
CheckServerJob::CheckServerJob(Account *account, bool followRedirect, QObject *parent) CheckServerJob::CheckServerJob(Account *account, bool followRedirect, QObject *parent)
: AbstractNetworkJob(account, QLatin1String("/status.php") , parent) : AbstractNetworkJob(account, QLatin1String("status.php") , parent)
, _followRedirects(followRedirect) , _followRedirects(followRedirect)
, _redirectCount(0) , _redirectCount(0)
{ {
@ -251,7 +266,7 @@ void CheckServerJob::slotFinished()
// ### this should no longer be needed // ### this should no longer be needed
if( reply()->error() == QNetworkReply::NoError && reply()->size() == 0 ) { if( reply()->error() == QNetworkReply::NoError && reply()->size() == 0 ) {
// This seems to be a bit strange behaviour of QNetworkAccessManager. // This seems to be a bit strange behaviour of QNetworkAccessManager.
// It calls the finised slot multiple times but only the first read wins. // It calls the finished slot multiple times but only the first read wins.
// That happend when the code connected the finished signal of the manager. // That happend when the code connected the finished signal of the manager.
// It did not happen when the code connected to the reply finish signal. // It did not happen when the code connected to the reply finish signal.
qDebug() << "WRN: NetworkReply with not content but also no error! " << reply(); qDebug() << "WRN: NetworkReply with not content but also no error! " << reply();
@ -270,12 +285,10 @@ void CheckServerJob::slotFinished()
if (requestedUrl.scheme() == QLatin1String("https") && if (requestedUrl.scheme() == QLatin1String("https") &&
redirectUrl.scheme() == QLatin1String("http")) { redirectUrl.scheme() == QLatin1String("http")) {
qDebug() << Q_FUNC_INFO << "HTTPS->HTTP downgrade detected!"; qDebug() << Q_FUNC_INFO << "HTTPS->HTTP downgrade detected!";
} else if (requestedUrl == redirectUrl || _redirectCount >= MAX_REDIRECTS) { } else if (requestedUrl == redirectUrl || _redirectCount >= maxRedirects()) {
qDebug() << Q_FUNC_INFO << "Redirect loop detected!"; qDebug() << Q_FUNC_INFO << "Redirect loop detected!";
} else { } else {
takeReply()->deleteLater(); setReply(getRequest(redirectUrl));
// ### FIXME
//setReply(getRequest(redirectUrl));
setupConnections(reply()); setupConnections(reply());
return; return;
} }
@ -292,7 +305,7 @@ void CheckServerJob::slotFinished()
if( status.contains("installed") if( status.contains("installed")
&& status.contains("version") && status.contains("version")
&& status.contains("versionstring") ) { && status.contains("versionstring") ) {
emit instanceFound(status); emit instanceFound(reply()->url(), status);
} else { } else {
qDebug() << "No proper answer on " << requestedUrl; qDebug() << "No proper answer on " << requestedUrl;
} }
@ -366,4 +379,16 @@ void PropfindJob::slotFinished()
deleteLater(); deleteLater();
} }
EntityExistsJob::EntityExistsJob(Account *account, const QString &path, QObject *parent)
: AbstractNetworkJob(account, path, parent)
{
setReply(headRequest(path));
setupConnections(reply());
}
void EntityExistsJob::slotFinished()
{
emit exists(reply());
}
} // namespace Mirall } // namespace Mirall

View file

@ -17,14 +17,15 @@
#define NETWORKJOBS_H #define NETWORKJOBS_H
#include <QObject> #include <QObject>
#include <QNetworkRequest>
#include <QNetworkReply> #include <QNetworkReply>
class QNetworkReply;
class QUrl; class QUrl;
namespace Mirall { namespace Mirall {
class Account; class Account;
class AbstractSslErrorHandler;
/** /**
* @brief The AbstractNetworkJob class * @brief The AbstractNetworkJob class
@ -42,17 +43,23 @@ public:
void setReply(QNetworkReply *reply); void setReply(QNetworkReply *reply);
QNetworkReply* reply() const { return _reply; } QNetworkReply* reply() const { return _reply; }
QNetworkReply* takeReply(); // for redirect handling
signals: signals:
void networkError(QNetworkReply::NetworkError, const QString& errorString); void networkError(QNetworkReply *reply);
protected: protected:
void setupConnections(QNetworkReply *reply); void setupConnections(QNetworkReply *reply);
QNetworkReply* davRequest(const QByteArray& verb, const QString &relPath, QNetworkReply* davRequest(const QByteArray& verb, const QString &relPath,
QNetworkRequest req = QNetworkRequest(), QNetworkRequest req = QNetworkRequest(),
QIODevice *data = 0); QIODevice *data = 0);
QNetworkReply* davRequest(const QByteArray& verb, const QUrl &url,
QNetworkRequest req = QNetworkRequest(),
QIODevice *data = 0);
QNetworkReply* getRequest(const QString &relPath); QNetworkReply* getRequest(const QString &relPath);
QNetworkReply* getRequest(const QUrl &url);
QNetworkReply* headRequest(const QString &relPath);
QNetworkReply* headRequest(const QUrl &url);
int maxRedirects() const { return 10; }
private slots: private slots:
virtual void slotFinished() = 0; virtual void slotFinished() = 0;
@ -64,6 +71,20 @@ private:
QString _path; QString _path;
}; };
/**
* @brief The EntityExistsJob class
*/
class EntityExistsJob : public AbstractNetworkJob {
Q_OBJECT
public:
explicit EntityExistsJob(Account *account, const QString &path, QObject* parent = 0);
signals:
void exists(QNetworkReply*);
private slots:
virtual void slotFinished();
};
/** /**
* @brief The LsColJob class * @brief The LsColJob class
*/ */
@ -74,7 +95,6 @@ public:
signals: signals:
void directoryListing(const QStringList &items); void directoryListing(const QStringList &items);
void networkError();
private slots: private slots:
virtual void slotFinished(); virtual void slotFinished();
@ -106,8 +126,7 @@ public:
explicit MkColJob(Account *account, const QString &path, QObject *parent = 0); explicit MkColJob(Account *account, const QString &path, QObject *parent = 0);
signals: signals:
void finished(); void finished(QNetworkReply::NetworkError);
void networkError();
private slots: private slots:
virtual void slotFinished(); virtual void slotFinished();
@ -126,8 +145,7 @@ public:
static bool installed(const QVariantMap &info); static bool installed(const QVariantMap &info);
signals: signals:
void instanceFound(const QVariantMap &info); void instanceFound(const QUrl&url, const QVariantMap &info);
void networkError();
private slots: private slots:
virtual void slotFinished(); virtual void slotFinished();
@ -135,8 +153,6 @@ private slots:
private: private:
bool _followRedirects; bool _followRedirects;
bool _redirectCount; bool _redirectCount;
static const int MAX_REDIRECTS = 10;
}; };

View file

@ -91,8 +91,7 @@ bool ownCloudGui::checkConfigExists(bool openSettings)
return true; return true;
} else { } else {
qDebug() << "No configured folders yet, starting setup wizard"; qDebug() << "No configured folders yet, starting setup wizard";
//### TODO OwncloudSetupWizard::runWizard(this, SLOT(slotownCloudWizardDone(int)));
//OwncloudSetupWizard::runWizard(this, SLOT(slotownCloudWizardDone(int)));
return false; return false;
} }
} }

View file

@ -28,7 +28,9 @@
#include "mirall/mirallaccessmanager.h" #include "mirall/mirallaccessmanager.h"
#include "mirall/account.h" #include "mirall/account.h"
#include "mirall/networkjobs.h" #include "mirall/networkjobs.h"
#include "mirall/sslerrordialog.h"
#include "creds/credentialsfactory.h"
#include "creds/abstractcredentials.h" #include "creds/abstractcredentials.h"
#include "creds/dummycredentials.h" #include "creds/dummycredentials.h"
@ -36,11 +38,8 @@ namespace Mirall {
OwncloudSetupWizard::OwncloudSetupWizard(QObject* parent) : OwncloudSetupWizard::OwncloudSetupWizard(QObject* parent) :
QObject( parent ), QObject( parent ),
_account(0),
_ocWizard(new OwncloudWizard), _ocWizard(new OwncloudWizard),
_mkdirRequestReply(),
_checkInstallationRequest(),
_checkRemoteFolderRequest(),
_configHandle(),
_remoteFolder() _remoteFolder()
{ {
connect( _ocWizard, SIGNAL(determineAuthType(const QString&)), connect( _ocWizard, SIGNAL(determineAuthType(const QString&)),
@ -80,24 +79,15 @@ void OwncloudSetupWizard::runWizard(QObject* obj, const char* amember, QWidget *
void OwncloudSetupWizard::startWizard() void OwncloudSetupWizard::startWizard()
{ {
// Set useful default values.
MirallConfigFile cfgFile;
Account *account = AccountManager::instance()->account(); Account *account = AccountManager::instance()->account();
if (!account) {
_ocWizard->setConfigExists( account != 0 ); account = new Account(new SslDialogErrorHandler);
// Fill the entry fields with existing values. account->setCredentials(CredentialsFactory::create("dummy"));
QString url = account->url();
//QString user = cfgFile.ownCloudUser();
bool configExists = !( url.isEmpty()/* || user.isEmpty()*/ );
if( !url.isEmpty() ) {
_ocWizard->setOCUrl( url );
} }
_ocWizard->setAccount(account);
_remoteFolder = Theme::instance()->defaultServerFolder(); _remoteFolder = Theme::instance()->defaultServerFolder();
// remoteFolder may be empty, which means / // remoteFolder may be empty, which means /
QString localFolder = Theme::instance()->defaultClientFolder(); QString localFolder = Theme::instance()->defaultClientFolder();
// if its a relative path, prepend with users home dir, otherwise use as absolute path // if its a relative path, prepend with users home dir, otherwise use as absolute path
@ -118,184 +108,62 @@ void OwncloudSetupWizard::startWizard()
_ocWizard->raise(); _ocWizard->raise();
} }
void OwncloudSetupWizard::slotDetermineAuthType(const QString& serverUrl) // also checks if an installation is valid and determines auth type in a second step
void OwncloudSetupWizard::slotDetermineAuthType(const QString &urlString)
{ {
QString url(serverUrl); QString fixedUrl = urlString;
qDebug() << "Connect to url: " << url; QUrl url = QUrl::fromUserInput(fixedUrl);
_ocWizard->setField(QLatin1String("OCUrl"), url ); // fromUserInput defaults to http, not http if no scheme is specified
_ocWizard->appendToConfigurationLog(tr("Trying to connect to %1 at %2 to determine authentication type...") if (!fixedUrl.startsWith("http://") || !fixedUrl.startsWith("https://")) {
.arg( Theme::instance()->appNameGUI() ).arg(url) ); url.setScheme("https");
// write a temporary config. }
QDateTime now = QDateTime::currentDateTime(); Account *account = _ocWizard->account();
account->setUrl(url);
// remove a possibly existing custom config. CheckServerJob *job = new CheckServerJob(_ocWizard->account(), false, this);
if( ! _configHandle.isEmpty() ) { connect(job, SIGNAL(instanceFound(QUrl,QVariantMap)), SLOT(slotOwnCloudFoundAuth(QUrl,QVariantMap)));
// remove the old config file. connect(job, SIGNAL(networkError(QNetworkReply*)), SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*)));
MirallConfigFile oldConfig( _configHandle );
oldConfig.cleanupCustomConfig();
} }
_configHandle = now.toString(QLatin1String("MMddyyhhmmss")); void OwncloudSetupWizard::slotOwnCloudFoundAuth(const QUrl& url, const QVariantMap &info)
MirallConfigFile cfgFile( _configHandle, true );
if( url.isEmpty() ) return;
if( !( url.startsWith(QLatin1String("https://")) || url.startsWith(QLatin1String("http://"))) ) {
qDebug() << "url does not start with a valid protocol, assuming https.";
url.prepend(QLatin1String("https://"));
// FIXME: give a hint about the auto completion
_ocWizard->setOCUrl(url);
}
cfgFile.writeOwncloudConfig( Theme::instance()->appName(),
url,
new DummyCredentials);
ownCloudInfo* info = ownCloudInfo::instance();
info->setCustomConfigHandle( _configHandle );
if( info->isConfigured() ) {
// reset the SSL Untrust flag to let the SSL dialog appear again.
info->resetSSLUntrust();
connect(info, SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
SLOT(slotOwnCloudFoundAuth(QString,QString,QString,QString)));
connect(info, SIGNAL(noOwncloudFound(QNetworkReply*)),
SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*)));
_checkInstallationRequest = info->checkInstallation();
} else {
qDebug() << " ownCloud seems not to be configured, can not start test connect.";
}
}
void OwncloudSetupWizard::slotOwnCloudFoundAuth( const QString& url, const QString& infoString, const QString& version, const QString& )
{ {
disconnect(ownCloudInfo::instance(), SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
this, SLOT(slotOwnCloudFoundAuth(QString,QString,QString,QString)));
disconnect(ownCloudInfo::instance(), SIGNAL(noOwncloudFound(QNetworkReply*)),
this, SLOT(slotNoOwnCloudFoundAuth(QNetworkReply*)));
_ocWizard->appendToConfigurationLog(tr("<font color=\"green\">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/>") _ocWizard->appendToConfigurationLog(tr("<font color=\"green\">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/>")
.arg( url ).arg(Theme::instance()->appNameGUI()).arg(infoString).arg(version)); .arg(url.toString())
.arg(Theme::instance()->appNameGUI())
.arg(CheckServerJob::versionString(info))
.arg(CheckServerJob::version(info)));
MirallAccessManager* nm = new MirallAccessManager(this); DetermineAuthTypeJob *job = new DetermineAuthTypeJob(_ocWizard->account(), this);
// TODO: We should get this path from owncloud info. connect(job, SIGNAL(authType(WizardCommon::AuthType)),
QNetworkReply* reply = nm->get (QNetworkRequest (url + "/remote.php/webdav/")); _ocWizard, SLOT(setAuthType(WizardCommon::AuthType)));
connect (reply, SIGNAL(finished()),
this, SLOT(slotAuthCheckReplyFinished()));
nm->setProperty ("mirallRedirs", QVariant (0));
} }
void OwncloudSetupWizard::slotAuthCheckReplyFinished() void OwncloudSetupWizard::slotNoOwnCloudFoundAuth(QNetworkReply *reply)
{ {
QNetworkReply* reply = qobject_cast< QNetworkReply* > (sender ()); _ocWizard->displayError(tr("Failed to connect to %1 at %2:<br/>%3")
QUrl redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); .arg(Theme::instance()->appNameGUI())
QNetworkAccessManager* nm = reply->manager (); .arg(reply->url().toString())
const int redirCount = nm->property ("mirallRedirs").toInt(); .arg(reply->errorString()));
if (redirCount > 10) {
redirection.clear ();
}
disconnect (reply, SIGNAL(finished()),
this, SLOT(slotAuthCheckReplyFinished()));
if ((reply->error () == QNetworkReply::AuthenticationRequiredError) || redirection.isEmpty()) {
reply->deleteLater();
nm->deleteLater();
_ocWizard->setAuthType (WizardCommon::HttpCreds);
} else if (redirection.toString().endsWith ("/remote.php/webdav/")) {
QNetworkReply* newReply = nm->get (QNetworkRequest(redirection));
connect (newReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotAuthCheckReplyError(QNetworkReply::NetworkError)));
connect (newReply, SIGNAL(finished()),
this, SLOT(slotAuthCheckReplyFinished(QNetworkReply::NetworkError)));
reply->deleteLater();
nm->setProperty ("mirallRedirs", QVariant(redirCount + 1));
} else {
QRegExp shibbolethyWords ("SAML|wayf");
shibbolethyWords.setCaseSensitivity (Qt::CaseInsensitive);
if (redirection.toString ().contains (shibbolethyWords)) {
_ocWizard->setAuthType(WizardCommon::Shibboleth);
} else {
// TODO: Send an error.
// eh?
_ocWizard->setAuthType (WizardCommon::HttpCreds);
}
reply->deleteLater();
nm->deleteLater();
}
}
void OwncloudSetupWizard::slotNoOwnCloudFoundAuth( QNetworkReply *err )
{
disconnect(ownCloudInfo::instance(), SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),
this, SLOT(slotOwnCloudFound(QString,QString,QString,QString)));
disconnect(ownCloudInfo::instance(), SIGNAL(noOwncloudFound(QNetworkReply*)),
this, SLOT(slotNoOwnCloudFound(QNetworkReply*)));
_ocWizard->displayError(tr("Failed to connect to %1:<br/>%2").
arg(Theme::instance()->appNameGUI()).arg(err->errorString()));
// remove the config file again
MirallConfigFile cfgFile( _configHandle );
cfgFile.cleanupCustomConfig();
} }
void OwncloudSetupWizard::slotConnectToOCUrl( const QString& url ) void OwncloudSetupWizard::slotConnectToOCUrl( const QString& url )
{ {
qDebug() << "Connect to url: " << url; qDebug() << "Connect to url: " << url;
_ocWizard->account()->setCredentials(_ocWizard->getCredentials());
_ocWizard->setField(QLatin1String("OCUrl"), url ); _ocWizard->setField(QLatin1String("OCUrl"), url );
_ocWizard->appendToConfigurationLog(tr("Trying to connect to %1 at %2...") _ocWizard->appendToConfigurationLog(tr("Trying to connect to %1 at %2...")
.arg( Theme::instance()->appNameGUI() ).arg(url) ); .arg( Theme::instance()->appNameGUI() ).arg(url) );
testOwnCloudConnect(); testOwnCloudConnect();
} }
void OwncloudSetupWizard::testOwnCloudConnect() void OwncloudSetupWizard::testOwnCloudConnect()
{ {
// write a temporary config. ValidateDavAuthJob *job = new ValidateDavAuthJob(_ocWizard->account(), this);
QDateTime now = QDateTime::currentDateTime(); connect(job, SIGNAL(authResult(QNetworkReply*)), SLOT(slotConnectionCheck(QNetworkReply*)));
if( _configHandle.isEmpty() ) {
_configHandle = now.toString(QLatin1String("MMddyyhhmmss"));
} }
MirallConfigFile cfgFile( _configHandle, true ); void OwncloudSetupWizard::slotConnectionCheck(QNetworkReply* reply)
QString url = _ocWizard->field(QLatin1String("OCUrl")).toString();
if( url.isEmpty() ) return;
if( !( url.startsWith(QLatin1String("https://")) || url.startsWith(QLatin1String("http://"))) ) {
qDebug() << "url does not start with a valid protocol, assuming https.";
url.prepend(QLatin1String("https://"));
// FIXME: give a hint about the auto completion
_ocWizard->setOCUrl(url);
}
cfgFile.writeOwncloudConfig( Theme::instance()->appName(),
url,
_ocWizard->getCredentials());
ownCloudInfo* info(ownCloudInfo::instance());
info->setCustomConfigHandle( _configHandle );
// If there is already a config, take its proxy config.
if( info->isConfigured() ) {
MirallConfigFile prevCfg;
cfgFile.setProxyType( prevCfg.proxyType(), prevCfg.proxyHostName(), prevCfg.proxyPort(),
prevCfg.proxyNeedsAuth(), prevCfg.proxyUser(), prevCfg.proxyPassword() );
}
connect( info,SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this,SLOT(slotConnectionCheck(QString,QNetworkReply*)));
qDebug() << "# checking for authentication settings.";
_checkRemoteFolderRequest = info->getWebDAVPath(_remoteFolder ); // this call needs to be authenticated.
// continue in slotConnectionCheck
}
void OwncloudSetupWizard::slotConnectionCheck(const QString&, QNetworkReply* reply)
{ {
// disconnect from ownCloud Info signals
disconnect(ownCloudInfo::instance(), SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this, SLOT(slotConnectionCheck(QString,QNetworkReply*)));
switch (reply->error()) { switch (reply->error()) {
case QNetworkReply::NoError: case QNetworkReply::NoError:
case QNetworkReply::ContentNotFoundError: case QNetworkReply::ContentNotFoundError:
@ -312,8 +180,6 @@ void OwncloudSetupWizard::slotCreateLocalAndRemoteFolders(const QString& localFo
{ {
qDebug() << "Setup local sync folder for new oC connection " << localFolder; qDebug() << "Setup local sync folder for new oC connection " << localFolder;
const QDir fi( localFolder ); const QDir fi( localFolder );
// FIXME: Show problems with local folder properly.
bool localFolderOk = true;
if( fi.exists() ) { if( fi.exists() ) {
// there is an existing local folder. If its non empty, it can only be synced if the // there is an existing local folder. If its non empty, it can only be synced if the
@ -325,38 +191,20 @@ void OwncloudSetupWizard::slotCreateLocalAndRemoteFolders(const QString& localFo
Utility::setupFavLink( localFolder ); Utility::setupFavLink( localFolder );
// FIXME: Create a local sync folder. // FIXME: Create a local sync folder.
res += tr("ok"); res += tr("ok");
EntityExistsJob *job = new EntityExistsJob(_ocWizard->account(), remoteFolder, this);
connect(job, SIGNAL(exists(QNetworkReply*)), SLOT(slotAuthCheckReply(QNetworkReply*)));
} else { } else {
res += tr("failed."); res += tr("failed.");
qDebug() << "Failed to create " << fi.path(); qDebug() << "Failed to create " << fi.path();
localFolderOk = false;
_ocWizard->displayError(tr("Could not create local folder %1").arg(localFolder)); _ocWizard->displayError(tr("Could not create local folder %1").arg(localFolder));
} }
_ocWizard->appendToConfigurationLog( res ); _ocWizard->appendToConfigurationLog( res );
} }
if( localFolderOk ) {
checkRemoteFolder(remoteFolder);
}
} }
void OwncloudSetupWizard::checkRemoteFolder(const QString& remoteFolder) // ### TODO move into EntityExistsJob once we decide if/how to return gui strings from jobs
void OwncloudSetupWizard::slotAuthCheckReply(QNetworkReply *reply)
{ {
ownCloudInfo* info(ownCloudInfo::instance());
connect( info,SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this,SLOT(slotAuthCheckReply(QString,QNetworkReply*)));
qDebug() << "# checking for existence of remote folder.";
info->setCustomConfigHandle(_configHandle);
_checkRemoteFolderRequest = info->getWebDAVPath(remoteFolder); // this call needs to be authenticated.
// continue in slotAuthCheckReply
}
void OwncloudSetupWizard::slotAuthCheckReply( const QString&, QNetworkReply *reply )
{
// disconnect from ownCloud Info signals
disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudDirExists(QString,QNetworkReply*)),
this,SLOT(slotAuthCheckReply(QString,QNetworkReply*)));
bool ok = true; bool ok = true;
QString error; QString error;
QNetworkReply::NetworkError errId = reply->error(); QNetworkReply::NetworkError errId = reply->error();
@ -364,11 +212,11 @@ void OwncloudSetupWizard::slotAuthCheckReply( const QString&, QNetworkReply *rep
if( errId == QNetworkReply::NoError ) { if( errId == QNetworkReply::NoError ) {
qDebug() << "******** Remote folder found, all cool!"; qDebug() << "******** Remote folder found, all cool!";
} else if( errId == QNetworkReply::ContentNotFoundError ) { } else if( errId == QNetworkReply::ContentNotFoundError ) {
if( createRemoteFolder() ) { if( _remoteFolder.isEmpty() ) {
return; // Finish here, the mkdir request will go on. error = tr("No remote folder specified!");
} else {
error = tr("The remote folder could not be accessed!");
ok = false; ok = false;
} else {
createRemoteFolder();
} }
} else { } else {
error = tr("Error: %1").arg(reply->errorString()); error = tr("Error: %1").arg(reply->errorString());
@ -382,25 +230,19 @@ void OwncloudSetupWizard::slotAuthCheckReply( const QString&, QNetworkReply *rep
finalizeSetup( ok ); finalizeSetup( ok );
} }
bool OwncloudSetupWizard::createRemoteFolder() void OwncloudSetupWizard::createRemoteFolder()
{ {
if( _remoteFolder.isEmpty() ) return false;
_ocWizard->appendToConfigurationLog( tr("creating folder on ownCloud: %1" ).arg( _remoteFolder )); _ocWizard->appendToConfigurationLog( tr("creating folder on ownCloud: %1" ).arg( _remoteFolder ));
ownCloudInfo* info(ownCloudInfo::instance());
connect(info, SIGNAL(webdavColCreated(QNetworkReply::NetworkError)),
this, SLOT(slotCreateRemoteFolderFinished(QNetworkReply::NetworkError)));
_mkdirRequestReply = info->mkdirRequest( _remoteFolder ); MkColJob *job = new MkColJob(_ocWizard->account(), _remoteFolder, this);
connect(job, SIGNAL(finished(QNetworkReply::NetworkError)), SLOT(slotCreateRemoteFolderFinished(QNetworkReply::NetworkError)));
return (_mkdirRequestReply != NULL);
} }
void OwncloudSetupWizard::slotCreateRemoteFolderFinished( QNetworkReply::NetworkError error ) void OwncloudSetupWizard::slotCreateRemoteFolderFinished( QNetworkReply::NetworkError error )
{ {
qDebug() << "** webdav mkdir request finished " << error; qDebug() << "** webdav mkdir request finished " << error;
disconnect(ownCloudInfo::instance(), SIGNAL(webdavColCreated(QNetworkReply::NetworkError)), // disconnect(ownCloudInfo::instance(), SIGNAL(webdavColCreated(QNetworkReply::NetworkError)),
this, SLOT(slotCreateRemoteFolderFinished(QNetworkReply::NetworkError))); // this, SLOT(slotCreateRemoteFolderFinished(QNetworkReply::NetworkError)));
bool success = true; bool success = true;
@ -459,7 +301,7 @@ void OwncloudSetupWizard::finalizeSetup( bool success )
// accept the custom config to be the main one if Accepted. // accept the custom config to be the main one if Accepted.
void OwncloudSetupWizard::slotAssistantFinished( int result ) void OwncloudSetupWizard::slotAssistantFinished( int result )
{ {
MirallConfigFile cfg( _configHandle ); MirallConfigFile cfg;
FolderMan *folderMan = FolderMan::instance(); FolderMan *folderMan = FolderMan::instance();
if( result == QDialog::Rejected ) { if( result == QDialog::Rejected ) {
@ -535,29 +377,63 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
} }
} }
// clear the custom config handle // // clear the custom config handle
_configHandle.clear(); // _configHandle.clear();
ownCloudInfo::instance()->setCustomConfigHandle( QString::null ); // ownCloudInfo::instance()->setCustomConfigHandle( QString::null );
// notify others. // notify others.
emit ownCloudWizardDone( result ); emit ownCloudWizardDone( result );
} }
void OwncloudSetupWizard::slotClearPendingRequests() DetermineAuthTypeJob::DetermineAuthTypeJob(Account *account, QObject *parent)
: AbstractNetworkJob(account, QString(), parent)
, _redirects(0)
{ {
qDebug() << "Pending request: " << _mkdirRequestReply; QNetworkReply *reply = getRequest(Account::davPath());
if( _mkdirRequestReply && _mkdirRequestReply->isRunning() ) { setReply(reply);
qDebug() << "ABORTing pending mkdir request."; setupConnections(reply);
_mkdirRequestReply->abort();
} }
if( _checkInstallationRequest && _checkInstallationRequest->isRunning() ) {
qDebug() << "ABORTing pending check installation request."; void DetermineAuthTypeJob::slotFinished()
_checkInstallationRequest->abort(); {
QUrl redirection = reply()->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if (_redirects >= maxRedirects()) {
redirection.clear();
} }
if( _checkRemoteFolderRequest && _checkRemoteFolderRequest->isRunning() ) { if ((reply()->error() == QNetworkReply::AuthenticationRequiredError) || redirection.isEmpty()) {
qDebug() << "ABORTing pending remote folder check request."; emit authType(WizardCommon::HttpCreds);
_checkRemoteFolderRequest->abort(); } else if (redirection.toString().endsWith(Account::davPath())) {
// do a new run
_redirects++;
setReply(getRequest(redirection));
setupConnections(reply());
} else {
QRegExp shibbolethyWords("SAML|wayf");
shibbolethyWords.setCaseSensitivity(Qt::CaseInsensitive);
if (redirection.toString().contains(shibbolethyWords)) {
emit authType(WizardCommon::Shibboleth);
} else {
// TODO: Send an error.
// eh?
emit authType(WizardCommon::HttpCreds);
} }
} }
deleteLater();
}
ValidateDavAuthJob::ValidateDavAuthJob(Account *account, QObject *parent)
: AbstractNetworkJob(account, QString(), parent)
{
QNetworkReply *reply = getRequest(Account::davPath());
setReply(reply);
setupConnections(reply);
}
void ValidateDavAuthJob::slotFinished()
{
emit authResult(reply());
deleteLater();
}
} // ns Mirall } // ns Mirall

View file

@ -22,10 +22,37 @@
#include <QPointer> #include <QPointer>
#include "mirall/theme.h" #include "mirall/theme.h"
#include "mirall/networkjobs.h"
#include "wizard/owncloudwizardcommon.h"
namespace Mirall { namespace Mirall {
class OwncloudWizard; class OwncloudWizard;
class Account;
class ValidateDavAuthJob : public AbstractNetworkJob {
Q_OBJECT
public:
ValidateDavAuthJob(Account* account, QObject *parent = 0);
signals:
void authResult(QNetworkReply*);
private slots:
void slotFinished();
};
class DetermineAuthTypeJob : public AbstractNetworkJob {
Q_OBJECT
public:
explicit DetermineAuthTypeJob(Account *account, QObject *parent = 0);
signals:
void authType(WizardCommon::AuthType);
private slots:
void slotFinished();
private:
int _redirects;
};
class OwncloudSetupWizard : public QObject class OwncloudSetupWizard : public QObject
{ {
@ -40,18 +67,16 @@ signals:
private slots: private slots:
void slotDetermineAuthType(const QString&); void slotDetermineAuthType(const QString&);
void slotOwnCloudFoundAuth(const QString&, const QString&, const QString&, const QString&); void slotOwnCloudFoundAuth(const QUrl&, const QVariantMap&);
void slotAuthCheckReplyFinished(); void slotNoOwnCloudFoundAuth(QNetworkReply *reply);
void slotNoOwnCloudFoundAuth(QNetworkReply*);
void slotConnectToOCUrl(const QString&); void slotConnectToOCUrl(const QString&);
void slotConnectionCheck(const QString&, QNetworkReply*); void slotConnectionCheck(QNetworkReply*);
void slotCreateLocalAndRemoteFolders(const QString&, const QString&); void slotCreateLocalAndRemoteFolders(const QString&, const QString&);
void slotAuthCheckReply(const QString&, QNetworkReply*); void slotAuthCheckReply(QNetworkReply*);
void slotCreateRemoteFolderFinished(QNetworkReply::NetworkError); void slotCreateRemoteFolderFinished(QNetworkReply::NetworkError);
void slotAssistantFinished( int ); void slotAssistantFinished( int );
void slotClearPendingRequests();
private: private:
explicit OwncloudSetupWizard(QObject *parent = 0 ); explicit OwncloudSetupWizard(QObject *parent = 0 );
@ -59,16 +84,13 @@ private:
void startWizard(); void startWizard();
void testOwnCloudConnect(); void testOwnCloudConnect();
void checkRemoteFolder(const QString& remoteFolder); void createRemoteFolder();
bool createRemoteFolder();
void finalizeSetup( bool ); void finalizeSetup( bool );
Account* _account;
OwncloudWizard* _ocWizard; OwncloudWizard* _ocWizard;
QPointer<QNetworkReply> _mkdirRequestReply;
QPointer<QNetworkReply> _checkInstallationRequest;
QPointer<QNetworkReply> _checkRemoteFolderRequest;
QString _configHandle;
QString _remoteFolder; QString _remoteFolder;
}; };
} }

View file

@ -14,9 +14,11 @@
* for more details. * for more details.
*/ */
#include "wizard/owncloudwizard.h" #include "mirall/account.h"
#include "mirall/mirallconfigfile.h" #include "mirall/mirallconfigfile.h"
#include "mirall/theme.h" #include "mirall/theme.h"
#include "wizard/owncloudwizard.h"
#include "wizard/owncloudsetuppage.h" #include "wizard/owncloudsetuppage.h"
#include "wizard/owncloudhttpcredspage.h" #include "wizard/owncloudhttpcredspage.h"
#include "wizard/owncloudshibbolethcredspage.h" #include "wizard/owncloudshibbolethcredspage.h"
@ -77,6 +79,16 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
setSubTitleFormat(Qt::RichText); setSubTitleFormat(Qt::RichText);
} }
void OwncloudWizard::setAccount(Account *account)
{
_account = account;
}
Account *OwncloudWizard::account() const
{
return _account;
}
void OwncloudWizard::setMultipleFoldersExist(bool exist) void OwncloudWizard::setMultipleFoldersExist(bool exist)
{ {
_advancedSetupPage->setMultipleFoldersExist(exist); _advancedSetupPage->setMultipleFoldersExist(exist);

View file

@ -23,6 +23,7 @@
namespace Mirall { namespace Mirall {
class Account;
class OwncloudSetupPage; class OwncloudSetupPage;
class OwncloudHttpCredsPage; class OwncloudHttpCredsPage;
class OwncloudShibbolethCredsPage; class OwncloudShibbolethCredsPage;
@ -43,6 +44,8 @@ public:
OwncloudWizard(QWidget *parent = 0); OwncloudWizard(QWidget *parent = 0);
void setAccount(Account *account);
Account* account() const;
void setOCUrl( const QString& ); void setOCUrl( const QString& );
void setupCustomMedia( QVariant, QLabel* ); void setupCustomMedia( QVariant, QLabel* );
@ -56,10 +59,10 @@ public:
void setConfigExists( bool ); void setConfigExists( bool );
bool configExists(); bool configExists();
void successfulStep(); void successfulStep();
void setAuthType(WizardCommon::AuthType type);
AbstractCredentials* getCredentials() const; AbstractCredentials* getCredentials() const;
public slots: public slots:
void setAuthType(WizardCommon::AuthType type);
void setRemoteFolder( const QString& ); void setRemoteFolder( const QString& );
void appendToConfigurationLog( const QString& msg, LogType type = LogParagraph ); void appendToConfigurationLog( const QString& msg, LogType type = LogParagraph );
void slotCurrentPageChanged( int ); void slotCurrentPageChanged( int );
@ -73,6 +76,7 @@ signals:
void basicSetupFinished( int ); void basicSetupFinished( int );
private: private:
Account* _account;
OwncloudSetupPage* _setupPage; OwncloudSetupPage* _setupPage;
OwncloudHttpCredsPage* _httpCredsPage; OwncloudHttpCredsPage* _httpCredsPage;
OwncloudShibbolethCredsPage* _shibbolethCredsPage; OwncloudShibbolethCredsPage* _shibbolethCredsPage;