, _state(AccountState::Disconnected)
, _connectionStatus(ConnectionValidator::Undefined)
, _waitingForNewCredentials(false)
+ , _termsOfServiceChecker(_account)
, _maintenanceToConnectedDelay(60000 + (QRandomGenerator::global()->generate() % (4 * 60000))) // 1-5min delay
, _remoteWipe(new RemoteWipe(_account))
, _isDesktopNotificationsAllowed(true)
this, &AccountState::slotPushNotificationsReady);
connect(account.data(), &Account::serverUserStatusChanged, this,
&AccountState::slotServerUserStatusChanged);
+ connect(&_termsOfServiceChecker, &TermsOfServiceChecker::done,
+ this, [this] ()
+ {
+ if (_termsOfServiceChecker.needToSign()) {
+ slotConnectionValidatorResult(ConnectionValidator::NeedToSignTermsOfService, {});
+ }
+ });
connect(account.data(), &Account::termsOfServiceNeedToBeChecked,
- this, [this] () {
- checkConnectivity();
- });
+ this, [this] ()
+ {
+ _termsOfServiceChecker.start();
+ });
connect(this, &AccountState::isConnectedChanged, [=]{
// Get the Apps available on the server if we're now connected.
, _previousErrors(previousErrors)
, _accountState(accountState)
, _account(accountState->account())
+ , _termsOfServiceChecker(_account)
{
+ connect(&_termsOfServiceChecker, &TermsOfServiceChecker::done,
+ this, &ConnectionValidator::termsOfServiceCheckDone);
}
void ConnectionValidator::checkServerAndAuth()
checkServerTermsOfService();
}
-void ConnectionValidator::checkServerTermsOfService()
-{
- // The main flow now needs the capabilities
- auto *job = new JsonApiJob(_account, QLatin1String("ocs/v2.php/apps/terms_of_service/terms"), this);
- job->setTimeout(timeoutToUseMsec);
- QObject::connect(job, &JsonApiJob::jsonReceived, this, &ConnectionValidator::slotServerTermsOfServiceRecieved);
- QObject::connect(job, &JsonApiJob::networkError, this, [] (QNetworkReply *reply)
- {
- qCInfo(lcConnectionValidator()) << "network error" << reply->error();
- });
- job->start();
-}
-
void ConnectionValidator::fetchUser()
{
auto *userInfo = new UserInfo(_accountState.data(), true, true, this);
return true;
}
+void ConnectionValidator::checkServerTermsOfService()
+{
+ _termsOfServiceChecker.start();
+}
+
void ConnectionValidator::slotUserFetched(UserInfo *userInfo)
{
if(userInfo) {
#endif
}
-void ConnectionValidator::slotServerTermsOfServiceRecieved(const QJsonDocument &reply)
+void ConnectionValidator::termsOfServiceCheckDone()
{
- qCDebug(lcConnectionValidator) << "Terms of service status" << reply;
-
- if (reply.object().contains("ocs")) {
- const auto hasSigned = reply.object().value("ocs").toObject().value("data").toObject().value("hasSigned").toBool(false);
-
- if (!hasSigned) {
- reportResult(NeedToSignTermsOfService);
- return;
- }
+ if (_termsOfServiceChecker.needToSign()) {
+ reportResult(NeedToSignTermsOfService);
+ return;
}
fetchUser();
deleteLater();
}
+TermsOfServiceChecker::TermsOfServiceChecker(AccountPtr account, QObject *parent)
+ : QObject(parent)
+ , _account(account)
+{
+}
+
+TermsOfServiceChecker::TermsOfServiceChecker(QObject *parent)
+ : QObject(parent)
+{
+}
+
+bool TermsOfServiceChecker::needToSign() const
+{
+ return _needToSign;
+}
+
+void TermsOfServiceChecker::start()
+{
+ checkServerTermsOfService();
+}
+
+void TermsOfServiceChecker::slotServerTermsOfServiceRecieved(const QJsonDocument &reply)
+{
+ qCDebug(lcConnectionValidator) << "Terms of service status" << reply;
+
+ if (reply.object().contains("ocs")) {
+ const auto needToSign = !reply.object().value("ocs").toObject().value("data").toObject().value("hasSigned").toBool(false);
+ if (needToSign != _needToSign) {
+ _needToSign = needToSign;
+ emit needToSignChanged();
+ }
+ } else if (_needToSign) {
+ _needToSign = false;
+ emit needToSignChanged();
+ }
+
+ emit done();
+}
+
+void TermsOfServiceChecker::checkServerTermsOfService()
+{
+ if (!_account) {
+ emit done();
+ }
+
+ // The main flow now needs the capabilities
+ auto *job = new JsonApiJob(_account, QLatin1String("ocs/v2.php/apps/terms_of_service/terms"), this);
+ job->setTimeout(timeoutToUseMsec);
+ QObject::connect(job, &JsonApiJob::jsonReceived, this, &TermsOfServiceChecker::slotServerTermsOfServiceRecieved);
+ QObject::connect(job, &JsonApiJob::networkError, this, [] (QNetworkReply *reply)
+ {
+ qCInfo(lcConnectionValidator()) << "network error" << reply->error();
+ });
+ job->start();
+}
+
} // namespace OCC
class UserInfo;
+class TermsOfServiceChecker : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(bool needToSign READ needToSign NOTIFY needToSignChanged FINAL)
+public:
+ explicit TermsOfServiceChecker(AccountPtr account,
+ QObject *parent = nullptr);
+
+ explicit TermsOfServiceChecker(QObject *parent = nullptr);
+
+ [[nodiscard]] bool needToSign() const;
+
+public slots:
+ void start();
+
+signals:
+ void needToSignChanged();
+
+ void done();
+
+private slots:
+ void slotServerTermsOfServiceRecieved(const QJsonDocument &reply);
+
+private:
+ void checkServerTermsOfService();
+
+ AccountPtr _account;
+ bool _needToSign = false;
+};
+
class ConnectionValidator : public QObject
{
Q_OBJECT
void slotCapabilitiesRecieved(const QJsonDocument &);
void slotUserFetched(OCC::UserInfo *userInfo);
- void slotServerTermsOfServiceRecieved(const QJsonDocument &reply);
+
+ void termsOfServiceCheckDone();
private:
#ifndef TOKEN_AUTH_ONLY
#endif
void reportResult(Status status);
void checkServerCapabilities();
- void checkServerTermsOfService();
void fetchUser();
/** Sets the account's server version
*/
bool setAndCheckServerVersion(const QString &version);
+ void checkServerTermsOfService();
+
const QStringList _previousErrors;
QStringList _errors;
AccountStatePtr _accountState;
AccountPtr _account;
+ TermsOfServiceChecker _termsOfServiceChecker;
bool _isCheckingServerAndAuth = false;
};
}