diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 5bb37c6ce9..d999868509 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -43,6 +43,7 @@ set(client_UI_SRCS wizard/owncloudconnectionmethoddialog.ui wizard/owncloudhttpcredspage.ui wizard/owncloudsetupnocredspage.ui + wizard/termsofservicecheckwidget.ui wizard/webview.ui wizard/welcomepage.ui ) @@ -240,6 +241,8 @@ set(client_SRCS wizard/flow2authwidget.cpp wizard/owncloudsetuppage.h wizard/owncloudsetuppage.cpp + wizard/termsofservicecheckwidget.h + wizard/termsofservicecheckwidget.cpp wizard/termsofservicewizardpage.h wizard/termsofservicewizardpage.cpp wizard/owncloudwizardcommon.h diff --git a/src/gui/owncloudsetupwizard.cpp b/src/gui/owncloudsetupwizard.cpp index 8f10fc52f6..0916ffb738 100644 --- a/src/gui/owncloudsetupwizard.cpp +++ b/src/gui/owncloudsetupwizard.cpp @@ -28,7 +28,6 @@ #include "sslerrordialog.h" #include "wizard/owncloudwizard.h" #include "wizard/owncloudwizardcommon.h" -#include "connectionvalidator.h" #include "creds/credentialsfactory.h" #include "creds/abstractcredentials.h" @@ -382,12 +381,20 @@ void OwncloudSetupWizard::testOwnCloudConnect() job->setFollowRedirects(false); job->setProperties(QList() << "getlastmodified"); connect(job, &PropfindJob::result, _ocWizard, &OwncloudWizard::successfulStep); - connect(job, &PropfindJob::finishedWithError, this, [this] (QNetworkReply *reply) { + connect(job, &PropfindJob::finishedWithError, this, [this] (QNetworkReply *reply) -> void { if (reply && reply->error() == QNetworkReply::ContentAccessDenied) { - testTermsOfService(); - } else { - slotAuthError(); + // A 403 might indicate that the terms of service need to be signed. + // catch this special case here, fall back to the standard error handler if it's not TOS-related + auto davException = OCC::getExceptionFromReply(reply); + if (!davException.first.isEmpty() && davException.first == QStringLiteral(R"(OCA\TermsOfService\TermsNotSignedException)")) { + // authentication was successful, but the user hasn't signed the terms of service yet. Prompt for that in the next step + qCInfo(lcWizard) << "Terms of service not accepted yet! Will prompt the user in the next step"; + _ocWizard->_needsToAcceptTermsOfService = true; + _ocWizard->successfulStep(); + return; + } } + slotAuthError(); }); job->start(); @@ -426,34 +433,25 @@ void OwncloudSetupWizard::slotAuthError() "\"%1\". The URL is bad, the server is misconfigured.") .arg(Utility::escape(redirectUrl.toString())); + } else if (reply->error() == QNetworkReply::ContentNotFoundError) { // A 404 is actually a success: we were authorized to know that the folder does // not exist. It will be created later... - } else if (reply->error() == QNetworkReply::ContentAccessDenied) { - testTermsOfService(); - return; - } else if (reply->error() == QNetworkReply::ContentNotFoundError) { _ocWizard->successfulStep(); return; - // Provide messages for other errors, such as invalid credentials. } else if (reply->error() != QNetworkReply::NoError) { - auto davException = OCC::getExceptionFromReply(reply); + // Provide messages for other errors, such as invalid credentials. if (!_ocWizard->account()->credentials()->stillValid(reply)) { errorMsg = tr("Access forbidden by server. To verify that you have proper access, " "click here to access the service with your browser.") .arg(Utility::escape(_ocWizard->account()->url().toString())); - } else if (!davException.first.isEmpty() && davException.first == QStringLiteral(R"(OCA\TermsOfService\TermsNotSignedException)")) { - qCInfo(lcWizard) << "Terms of service not accepted yet!"; - // TODO: it would be cool to display a new wizard page containing the terms of service - errorMsg = tr("Please accept the Terms of Service with your browser and try again.") - .arg(Utility::escape(_ocWizard->account()->url().toString())); } else { errorMsg = job->errorStringParsingBody(); } - // Something else went wrong, maybe the response was 200 but with invalid data. } else { + // Something else went wrong, maybe the response was 200 but with invalid data. errorMsg = tr("There was an invalid response to an authenticated WebDAV request"); } @@ -488,14 +486,6 @@ bool OwncloudSetupWizard::checkDowngradeAdvised(QNetworkReply *reply) return true; } -void OwncloudSetupWizard::testTermsOfService() -{ - _termsOfServiceChecker = new TermsOfServiceChecker{_ocWizard->account(), this}; - - connect(_termsOfServiceChecker, &TermsOfServiceChecker::done, this, &OwncloudSetupWizard::termsOfServiceChecked); - _termsOfServiceChecker->start(); -} - void OwncloudSetupWizard::slotCreateLocalAndRemoteFolders(const QString &localFolder, const QString &remoteFolder) { qCInfo(lcWizard) << "Setup local sync folder for new oC connection " << localFolder; @@ -749,17 +739,6 @@ void OwncloudSetupWizard::slotSkipFolderConfiguration() emit ownCloudWizardDone(QDialog::Accepted); } -void OwncloudSetupWizard::termsOfServiceChecked() -{ - if (_termsOfServiceChecker && _termsOfServiceChecker->needToSign()) { - QDesktopServices::openUrl(_ocWizard->account()->url()); - } else { - _ocWizard->successfulStep(); - delete _termsOfServiceChecker; - _termsOfServiceChecker = nullptr; - } -} - AccountState *OwncloudSetupWizard::applyAccountChanges() { AccountPtr newAccount = _ocWizard->account(); diff --git a/src/gui/owncloudsetupwizard.h b/src/gui/owncloudsetupwizard.h index fab85d9bbb..b3ad88a8f9 100644 --- a/src/gui/owncloudsetupwizard.h +++ b/src/gui/owncloudsetupwizard.h @@ -45,6 +45,7 @@ public: /** Run the wizard */ static void runWizard(QObject *obj, const char *amember, QWidget *parent = nullptr); static bool bringWizardToFrontIfVisible(); + signals: // overall dialog close signal. void ownCloudWizardDone(int); @@ -70,8 +71,6 @@ private slots: void slotAssistantFinished(int); void slotSkipFolderConfiguration(); - void termsOfServiceChecked(); - private: explicit OwncloudSetupWizard(QObject *parent = nullptr); ~OwncloudSetupWizard() override; @@ -82,9 +81,7 @@ private: bool ensureStartFromScratch(const QString &localFolder); AccountState *applyAccountChanges(); bool checkDowngradeAdvised(QNetworkReply *reply); - void testTermsOfService(); - TermsOfServiceChecker *_termsOfServiceChecker = nullptr; OwncloudWizard *_ocWizard = nullptr; QString _initLocalFolder; QString _remoteFolder; diff --git a/src/gui/wizard/flow2authcredspage.cpp b/src/gui/wizard/flow2authcredspage.cpp index a2f23f6ef2..8eef42fab0 100644 --- a/src/gui/wizard/flow2authcredspage.cpp +++ b/src/gui/wizard/flow2authcredspage.cpp @@ -104,7 +104,13 @@ void Flow2AuthCredsPage::slotFlow2AuthResult(Flow2Auth::Result r, const QString int Flow2AuthCredsPage::nextId() const { - return WizardCommon::Page_TermsOfService; + const auto ocWizard = qobject_cast(wizard()); + Q_ASSERT(ocWizard); + if (ocWizard->needsToAcceptTermsOfService()) { + return WizardCommon::Page_TermsOfService; + } + + return WizardCommon::Page_AdvancedSetup; } void Flow2AuthCredsPage::setConnected() diff --git a/src/gui/wizard/owncloudhttpcredspage.cpp b/src/gui/wizard/owncloudhttpcredspage.cpp index ed514b72a4..436b46b3da 100644 --- a/src/gui/wizard/owncloudhttpcredspage.cpp +++ b/src/gui/wizard/owncloudhttpcredspage.cpp @@ -153,6 +153,12 @@ bool OwncloudHttpCredsPage::validatePage() int OwncloudHttpCredsPage::nextId() const { + const auto ocWizard = qobject_cast(wizard()); + Q_ASSERT(ocWizard); + if (ocWizard->needsToAcceptTermsOfService()) { + return WizardCommon::Page_TermsOfService; + } + return WizardCommon::Page_AdvancedSetup; } diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index 4fb364b8f4..3a209312bd 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -54,6 +54,7 @@ OwncloudWizard::OwncloudWizard(QWidget *parent) , _setupPage(new OwncloudSetupPage(this)) , _httpCredsPage(new OwncloudHttpCredsPage(this)) , _flow2CredsPage(new Flow2AuthCredsPage) + , _termsOfServicePage(new TermsOfServiceWizardPage) , _advancedSetupPage(new OwncloudAdvancedSetupPage(this)) #ifdef WITH_WEBENGINE , _webViewPage(new WebViewPage(this)) @@ -72,6 +73,7 @@ OwncloudWizard::OwncloudWizard(QWidget *parent) setPage(WizardCommon::Page_ServerSetup, _setupPage); setPage(WizardCommon::Page_HttpCreds, _httpCredsPage); setPage(WizardCommon::Page_Flow2AuthCreds, _flow2CredsPage); + setPage(WizardCommon::Page_TermsOfService, _termsOfServicePage); setPage(WizardCommon::Page_AdvancedSetup, _advancedSetupPage); #ifdef WITH_WEBENGINE if (!useFlow2()) { @@ -117,6 +119,7 @@ OwncloudWizard::OwncloudWizard(QWidget *parent) connect(this, &OwncloudWizard::styleChanged, _setupPage, &OwncloudSetupPage::slotStyleChanged); connect(this, &OwncloudWizard::styleChanged, _advancedSetupPage, &OwncloudAdvancedSetupPage::slotStyleChanged); connect(this, &OwncloudWizard::styleChanged, _flow2CredsPage, &Flow2AuthCredsPage::slotStyleChanged); + connect(this, &OwncloudWizard::styleChanged, _termsOfServicePage, &TermsOfServiceWizardPage::styleChanged); customizeStyle(); @@ -217,6 +220,11 @@ bool OwncloudWizard::isConfirmBigFolderChecked() const return _advancedSetupPage->isConfirmBigFolderChecked(); } +bool OwncloudWizard::needsToAcceptTermsOfService() const +{ + return _needsToAcceptTermsOfService; +} + QString OwncloudWizard::ocUrl() const { QString url = field("OCUrl").toString().simplified(); @@ -263,7 +271,7 @@ void OwncloudWizard::successfulStep() #endif // WITH_WEBENGINE case WizardCommon::Page_TermsOfService: - _termsOfServicePage->initializePage(); + // nothing to do here break; case WizardCommon::Page_AdvancedSetup: @@ -292,6 +300,9 @@ void OwncloudWizard::slotCustomButtonClicked(const int which) } else if (which == WizardButton::CustomButton2) { // Because QWizard doesn't have a way of directly going to a specific page (!!!) restart(); + + // in case the wizard had been cancelled at a page where the need for signing the TOS got checked: + _needsToAcceptTermsOfService = false; } } @@ -336,7 +347,8 @@ void OwncloudWizard::slotCurrentPageChanged(int id) #ifdef WITH_WEBENGINE id == WizardCommon::Page_WebView || #endif // WITH_WEBENGINE - id == WizardCommon::Page_Flow2AuthCreds) { + id == WizardCommon::Page_Flow2AuthCreds || + id == WizardCommon::Page_TermsOfService) { setButtonLayout({ QWizard::BackButton, QWizard::Stretch }); } else if (id == WizardCommon::Page_AdvancedSetup) { setButtonLayout({ QWizard::CustomButton2, QWizard::Stretch, QWizard::CustomButton1, QWizard::FinishButton }); diff --git a/src/gui/wizard/owncloudwizard.h b/src/gui/wizard/owncloudwizard.h index 7f950db064..df8e8c6fe1 100644 --- a/src/gui/wizard/owncloudwizard.h +++ b/src/gui/wizard/owncloudwizard.h @@ -69,6 +69,7 @@ public: [[nodiscard]] bool useFlow2() const; [[nodiscard]] bool useVirtualFileSync() const; [[nodiscard]] bool isConfirmBigFolderChecked() const; + [[nodiscard]] bool needsToAcceptTermsOfService() const; void displayError(const QString &, bool retryHTTPonly); [[nodiscard]] AbstractCredentials *getCredentials() const; @@ -140,6 +141,8 @@ private: bool _useFlow2 = ConfigFile().forceLoginV2(); + bool _needsToAcceptTermsOfService = false; + friend class OwncloudSetupWizard; }; diff --git a/src/gui/wizard/termsofservicecheckwidget.cpp b/src/gui/wizard/termsofservicecheckwidget.cpp new file mode 100644 index 0000000000..a5f625bccb --- /dev/null +++ b/src/gui/wizard/termsofservicecheckwidget.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (C) by Jyrki Gadinger + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * 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 "termsofservicecheckwidget.h" + +#include "wizard/owncloudwizardcommon.h" +#include "theme.h" +#include "configfile.h" + +#include "QProgressIndicator.h" + +#include +#include + +namespace OCC { + +Q_LOGGING_CATEGORY(lcTosCheckWidget, "nextcloud.gui.wizard.termsofservicecheckwidget", QtInfoMsg) + + +TermsOfServiceCheckWidget::TermsOfServiceCheckWidget(QWidget *parent) + : QWidget(parent) + , _progressIndicator(new QProgressIndicator(this)) +{ + _pollTimer.setInterval(1000); + QObject::connect(&_pollTimer, &QTimer::timeout, this, &TermsOfServiceCheckWidget::slotPollTimerTimeout); + + _ui.setupUi(this); + + connect(_ui.openLinkButton, &QPushButton::clicked, this, &TermsOfServiceCheckWidget::slotOpenBrowser); + connect(_ui.copyLinkButton, &QPushButton::clicked, this, &TermsOfServiceCheckWidget::slotCopyLinkToClipboard); + + auto sizePolicy = _progressIndicator->sizePolicy(); + sizePolicy.setRetainSizeWhenHidden(true); + _progressIndicator->setSizePolicy(sizePolicy); + + _ui.progressLayout->addWidget(_progressIndicator); + stopSpinner(false); + + customizeStyle(); +} + +TermsOfServiceCheckWidget::~TermsOfServiceCheckWidget() { +} + +void TermsOfServiceCheckWidget::start() +{ + ConfigFile cfg; + std::chrono::milliseconds polltime = cfg.remotePollInterval(); + qCInfo(lcTosCheckWidget) << "setting remote poll timer interval to" << polltime.count() << "msec"; + _secondsInterval = (polltime.count() / 1000); + _secondsLeft = _secondsInterval; + + _pollTimer.start(); + // open browser when the wizard page is shown + slotOpenBrowser(); +} + +void TermsOfServiceCheckWidget::setUrl(const QUrl &url) +{ + _url = url; +} + +void TermsOfServiceCheckWidget::termsNotAcceptedYet() +{ + _secondsLeft = _secondsInterval; + _isBusy = false; + statusChanged(Status::statusPollCountdown); +} + +void TermsOfServiceCheckWidget::setLogo() +{ + const auto backgroundColor = palette().window().color(); + const auto logoIconFileName = Theme::instance()->isBranded() ? Theme::hidpiFileName("external.png", backgroundColor) + : Theme::hidpiFileName(":/client/theme/colored/external.png"); + _ui.logoLabel->setPixmap(logoIconFileName); +} + +void TermsOfServiceCheckWidget::slotStyleChanged() +{ + customizeStyle(); +} + +void TermsOfServiceCheckWidget::slotPollTimerTimeout() +{ + if (_isBusy) { + return; + } + + _isBusy = true; + + _secondsLeft--; + if (_secondsLeft > 0) { + statusChanged(Status::statusPollCountdown); + _isBusy = false; + return; + } + + statusChanged(Status::statusPollNow); + Q_EMIT pollNow(); +} + +void TermsOfServiceCheckWidget::slotOpenBrowser() +{ + QDesktopServices::openUrl(_url); +} + +void TermsOfServiceCheckWidget::slotCopyLinkToClipboard() +{ + statusChanged(Status::statusCopyLinkToClipboard); + QApplication::clipboard()->setText(_url.toString(QUrl::FullyEncoded)); +} + +void TermsOfServiceCheckWidget::statusChanged(Status status) +{ + switch (status) + { + case statusPollCountdown: + if (_statusUpdateSkipCount > 0) { + _statusUpdateSkipCount--; + return; + } + + _ui.statusLabel->setText(tr("Waiting for terms to be accepted") + QStringLiteral("… (%1)").arg(_secondsLeft)); + stopSpinner(true); + return; + + case statusPollNow: + _statusUpdateSkipCount = 0; + _ui.statusLabel->setText(tr("Polling") + QStringLiteral("…")); + startSpinner(); + return; + + case statusCopyLinkToClipboard: + _statusUpdateSkipCount = 3; + _ui.statusLabel->setText(tr("Link copied to clipboard.")); + stopSpinner(true); + return; + } +} + +void TermsOfServiceCheckWidget::startSpinner() +{ + _ui.progressLayout->setEnabled(true); + _ui.statusLabel->setVisible(true); + _progressIndicator->setVisible(true); + _progressIndicator->startAnimation(); + + _ui.openLinkButton->setEnabled(false); + _ui.copyLinkButton->setEnabled(false); +} + +void TermsOfServiceCheckWidget::stopSpinner(bool showStatusLabel) +{ + _ui.progressLayout->setEnabled(false); + _ui.statusLabel->setVisible(showStatusLabel); + _progressIndicator->setVisible(false); + _progressIndicator->stopAnimation(); + + _ui.openLinkButton->setEnabled(_statusUpdateSkipCount == 0); + _ui.copyLinkButton->setEnabled(_statusUpdateSkipCount == 0); +} + +void TermsOfServiceCheckWidget::customizeStyle() +{ + setLogo(); + + if (_progressIndicator) { + const auto isDarkBackground = Theme::isDarkColor(palette().window().color()); + if (isDarkBackground) { + _progressIndicator->setColor(Qt::white); + } else { + _progressIndicator->setColor(Qt::black); + } + } + + _ui.openLinkButton->setText(tr("Open Browser")); + + _ui.copyLinkButton->setText(tr("Copy Link")); + + WizardCommon::customizeHintLabel(_ui.statusLabel); +} + +} // namespace OCC diff --git a/src/gui/wizard/termsofservicecheckwidget.h b/src/gui/wizard/termsofservicecheckwidget.h new file mode 100644 index 0000000000..1c28149d34 --- /dev/null +++ b/src/gui/wizard/termsofservicecheckwidget.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) by Jyrki Gadinger + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ + +#pragma once + +#include +#include + +#include "ui_termsofservicecheckwidget.h" + +class QProgressIndicator; + +namespace OCC { + +class TermsOfServiceCheckWidget : public QWidget +{ + Q_OBJECT +public: + enum Status { + statusPollCountdown = 1, + statusPollNow, + statusCopyLinkToClipboard, + }; + + TermsOfServiceCheckWidget(QWidget *parent = nullptr); + ~TermsOfServiceCheckWidget() override; + + void start(); + void setUrl(const QUrl &url); + void termsNotAcceptedYet(); + +public Q_SLOTS: + void slotStyleChanged(); + +Q_SIGNALS: + void pollNow(); + +private Q_SLOTS: + void slotPollTimerTimeout(); + void slotOpenBrowser(); + void slotCopyLinkToClipboard(); + +private: + Ui_TermsOfServiceCheckWidget _ui{}; + QTimer _pollTimer; + QProgressIndicator *_progressIndicator = nullptr; + int _statusUpdateSkipCount = 0; + qint64 _secondsLeft = 0LL; + qint64 _secondsInterval = 0LL; + bool _isBusy = false; + QUrl _url; + + void statusChanged(Status status); + void startSpinner(); + void stopSpinner(bool showStatusLabel); + void customizeStyle(); + void setLogo(); + +}; + +} // namespace OCC diff --git a/src/gui/wizard/termsofservicecheckwidget.ui b/src/gui/wizard/termsofservicecheckwidget.ui new file mode 100644 index 0000000000..be52d44b11 --- /dev/null +++ b/src/gui/wizard/termsofservicecheckwidget.ui @@ -0,0 +1,248 @@ + + + TermsOfServiceCheckWidget + + + + 0 + 0 + 597 + 387 + + + + + 0 + 0 + + + + + 500 + 280 + + + + Terms of Service + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + Logo + + + Qt::AlignmentFlag::AlignCenter + + + + + + + Qt::Orientation::Vertical + + + + 20 + 32 + + + + + + + + + 12 + true + + + + Switch to your browser to accept the terms of service + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Expanding + + + + 20 + 8 + + + + + + + + Status + + + Qt::AlignmentFlag::AlignCenter + + + 0 + + + + + + + Qt::Orientation::Vertical + + + + 20 + 32 + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 64 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + 0 + + + + + 9 + + + + copyLinkButton + + + true + + + false + + + + + + + + 0 + 0 + + + + + 9 + + + + openLinkButton + + + true + + + false + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Expanding + + + + 20 + 60 + + + + + + + + + diff --git a/src/gui/wizard/termsofservicewizardpage.cpp b/src/gui/wizard/termsofservicewizardpage.cpp index 5a7ec7a7ad..f5b5776281 100644 --- a/src/gui/wizard/termsofservicewizardpage.cpp +++ b/src/gui/wizard/termsofservicewizardpage.cpp @@ -18,6 +18,7 @@ #include "owncloudsetupwizard.h" #include "wizard/owncloudwizard.h" #include "wizard/owncloudwizardcommon.h" +#include "wizard/termsofservicecheckwidget.h" #include "connectionvalidator.h" #include @@ -29,14 +30,35 @@ OCC::TermsOfServiceWizardPage::TermsOfServiceWizardPage() : QWizardPage() { _layout = new QVBoxLayout(this); + + _termsOfServiceCheckWidget = new TermsOfServiceCheckWidget; + _layout->addWidget(_termsOfServiceCheckWidget); + + connect(this, &TermsOfServiceWizardPage::styleChanged, _termsOfServiceCheckWidget, &TermsOfServiceCheckWidget::slotStyleChanged); + connect(_termsOfServiceCheckWidget, &TermsOfServiceCheckWidget::pollNow, this, &TermsOfServiceWizardPage::slotPollNow); } void OCC::TermsOfServiceWizardPage::initializePage() { + _ocWizard = qobject_cast(wizard()); + Q_ASSERT(_ocWizard); + + _termsOfServiceChecker = new TermsOfServiceChecker{_ocWizard->account(), this}; + connect(_termsOfServiceChecker, &TermsOfServiceChecker::done, this, &TermsOfServiceWizardPage::termsOfServiceChecked); + + _termsOfServiceCheckWidget->setUrl(_ocWizard->account()->url()); + _termsOfServiceCheckWidget->slotStyleChanged(); + _termsOfServiceCheckWidget->start(); + + connect(_ocWizard, &OwncloudWizard::onActivate, this, &TermsOfServiceWizardPage::slotPollNow); } void OCC::TermsOfServiceWizardPage::cleanupPage() { + disconnect(_ocWizard, &OwncloudWizard::onActivate, this, &TermsOfServiceWizardPage::slotPollNow); + + _termsOfServiceChecker->deleteLater(); + _termsOfServiceChecker = nullptr; } int OCC::TermsOfServiceWizardPage::nextId() const @@ -51,21 +73,21 @@ bool OCC::TermsOfServiceWizardPage::isComplete() const void TermsOfServiceWizardPage::slotPollNow() { - _termsOfServiceChecker = new TermsOfServiceChecker{_ocWizard->account(), this}; + if (!_termsOfServiceChecker) { + return; + } - connect(_termsOfServiceChecker, &TermsOfServiceChecker::done, this, &TermsOfServiceWizardPage::termsOfServiceChecked); _termsOfServiceChecker->start(); } void TermsOfServiceWizardPage::termsOfServiceChecked() { if (_termsOfServiceChecker && _termsOfServiceChecker->needToSign()) { - QDesktopServices::openUrl(_ocWizard->account()->url()); - } else { - _ocWizard->successfulStep(); - delete _termsOfServiceChecker; - _termsOfServiceChecker = nullptr; + _termsOfServiceCheckWidget->termsNotAcceptedYet(); + return; } + _ocWizard->successfulStep(); } } + diff --git a/src/gui/wizard/termsofservicewizardpage.h b/src/gui/wizard/termsofservicewizardpage.h index 86765e2fb9..2312d98668 100644 --- a/src/gui/wizard/termsofservicewizardpage.h +++ b/src/gui/wizard/termsofservicewizardpage.h @@ -23,6 +23,7 @@ namespace OCC { class OwncloudWizard; class TermsOfServiceChecker; +class TermsOfServiceCheckWidget; class TermsOfServiceWizardPage : public QWizardPage { @@ -35,18 +36,21 @@ public: [[nodiscard]] int nextId() const override; [[nodiscard]] bool isComplete() const override; -Q_SIGNALS: - void connectToOCUrl(const QString &); - void pollNow(); - -private Q_SLOTS: +public Q_SLOTS: void slotPollNow(); - void termsOfServiceChecked(); + +Q_SIGNALS: + void pollNow(); + void styleChanged(); private: QVBoxLayout *_layout = nullptr; OwncloudWizard *_ocWizard = nullptr; TermsOfServiceChecker *_termsOfServiceChecker = nullptr; + TermsOfServiceCheckWidget *_termsOfServiceCheckWidget = nullptr; + +private Q_SLOTS: + void termsOfServiceChecked(); }; } // namespace OCC diff --git a/src/gui/wizard/webviewpage.cpp b/src/gui/wizard/webviewpage.cpp index a3587d1d8e..0d47cb23ee 100644 --- a/src/gui/wizard/webviewpage.cpp +++ b/src/gui/wizard/webviewpage.cpp @@ -92,7 +92,13 @@ void WebViewPage::cleanupPage() } int WebViewPage::nextId() const { - return WizardCommon::Page_TermsOfService; + const auto ocWizard = qobject_cast(wizard()); + Q_ASSERT(ocWizard); + if (ocWizard->needsToAcceptTermsOfService()) { + return WizardCommon::Page_TermsOfService; + } + + return WizardCommon::Page_AdvancedSetup; } bool WebViewPage::isComplete() const {