Fix review comments from Claudio II.
authoralex-z <blackslayer4@gmail.com>
Thu, 29 Dec 2022 17:28:28 +0000 (18:28 +0100)
committerallexzander <allexzander@users.noreply.github.com>
Fri, 30 Dec 2022 13:46:06 +0000 (14:46 +0100)
Signed-off-by: alex-z <blackslayer4@gmail.com>
src/gui/CMakeLists.txt
src/gui/accountsetupcommandlinemanager.cpp
src/gui/accountsetupcommandlinemanager.h
src/gui/accountsetupfromcommandlinejob.cpp [new file with mode: 0644]
src/gui/accountsetupfromcommandlinejob.h [new file with mode: 0644]
src/gui/application.cpp

index ed1820809f2fb51f9befe1b549acf7b488587243..af02aa4295e7b303c51f1aec488d42a0e32552a4 100644 (file)
@@ -65,6 +65,8 @@ set(client_SRCS
     accountmanager.cpp
     accountsettings.h
     accountsettings.cpp
+    accountsetupfromcommandlinejob.h
+    accountsetupfromcommandlinejob.cpp
     accountsetupcommandlinemanager.h
     accountsetupcommandlinemanager.cpp
     application.h
index dbc5c46042a159f3358d9271e935da05d3f286aa..39fe895cafec24944c474eac917626d0edca38ff 100644 (file)
  */
 
 #include "accountsetupcommandlinemanager.h"
-
-#include "accountmanager.h"
-#include "creds/webflowcredentials.h"
-#include "filesystem.h"
-#include "folder.h"
-#include "folderman.h"
-#include "networkjobs.h"
-
-#include <QDir>
-#include <QGuiApplication>
-#include <QJsonObject>
-#include <QLoggingCategory>
-#include <QObject>
-#include <QUrl>
+#include "accountsetupfromcommandlinejob.h"
 
 namespace OCC
 {
 Q_LOGGING_CATEGORY(lcAccountSetupCommandLineManager, "nextcloud.gui.accountsetupcommandlinemanager", QtInfoMsg)
 
-AccountSetupFromCommandLineJob::AccountSetupFromCommandLineJob(QString appPassword,
-                                                               QString userId,
-                                                               QUrl serverUrl,
-                                                               QString localDirPath,
-                                                               bool nonVfsMode,
-                                                               QString remoteDirPath,
-                                                               QObject *parent)
-    : QObject(parent)
-    , _appPassword(appPassword)
-    , _userId(userId)
-    , _serverUrl(serverUrl)
-    , _localDirPath(localDirPath)
-    , _nonVfsMode(nonVfsMode)
-    , _remoteDirPath(remoteDirPath)
-{
-}
-
-void AccountSetupFromCommandLineJob::handleAccountSetupFromCommandLine()
-{
-    if (AccountManager::instance()->accountFromUserId(QStringLiteral("%1@%2").arg(_userId).arg(_serverUrl.host()))) {
-        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 already exists!").arg(QDir::toNativeSeparators(_userId)), true);
-        return;
-    }
-
-    if (!_localDirPath.isEmpty()) {
-        QDir dir(_localDirPath);
-        if (dir.exists() && !dir.isEmpty()) {
-            printAccountSetupFromCommandLineStatusAndExit(
-                QStringLiteral("Local folder %1 already exists and is non-empty!").arg(QDir::toNativeSeparators(_localDirPath)),
-                true);
-            return;
-        }
-
-        qCInfo(lcAccountSetupCommandLineManager) << "Creating folder" << _localDirPath;
-        if (!dir.exists() && !dir.mkpath(".")) {
-            printAccountSetupFromCommandLineStatusAndExit(
-                QStringLiteral("Folder creation failed. Could not create local folder %1").arg(QDir::toNativeSeparators(_localDirPath)),
-                true);
-            return;
-        }
-
-        FileSystem::setFolderMinimumPermissions(_localDirPath);
-        Utility::setupFavLink(_localDirPath);
-    }
-
-    const auto credentials = new WebFlowCredentials(_userId, _appPassword);
-    _account = AccountManager::createAccount();
-    _account->setCredentials(credentials);
-    _account->setUrl(_serverUrl);
-
-    fetchUserName();
-}
-
-void AccountSetupFromCommandLineJob::checkLastModifiedWithPropfind()
-{
-    const auto job = new PropfindJob(_account, "/", this);
-    job->setIgnoreCredentialFailure(true);
-    // There is custom redirect handling in the error handler,
-    // so don't automatically follow redirects.
-    job->setFollowRedirects(false);
-    job->setProperties(QList<QByteArray>() << QByteArrayLiteral("getlastmodified"));
-    connect(job, &PropfindJob::result, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess);
-    connect(job, &PropfindJob::finishedWithError, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure);
-    job->start();
-}
-
-void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess()
-{
-    const auto accountManager = AccountManager::instance();
-    const auto accountState = accountManager->addAccount(_account);
-    accountManager->save();
-
-    if (!_localDirPath.isEmpty()) {
-        FolderDefinition definition;
-        definition.localPath = _localDirPath;
-        definition.targetPath = FolderDefinition::prepareTargetPath(!_remoteDirPath.isEmpty() ? _remoteDirPath : QStringLiteral("/"));
-        definition.virtualFilesMode = _nonVfsMode ? Vfs::Off : bestAvailableVfsMode();
-
-        const auto folderMan = FolderMan::instance();
-
-        definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
-        definition.alias = folderMan->map().size() > 0 ? QString::number(folderMan->map().size()) : QString::number(0);
-
-        if (folderMan->navigationPaneHelper().showInExplorerNavigationPane()) {
-            definition.navigationPaneClsid = QUuid::createUuid();
-        }
-
-        folderMan->setSyncEnabled(false);
-
-        if (const auto folder = folderMan->addFolder(accountState, definition)) {
-            if (definition.virtualFilesMode != Vfs::Off) {
-                folder->setRootPinState(PinState::OnlineOnly);
-            }
-            folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/"));
-            qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("Folder %1 setup from command line success.").arg(definition.localPath);
-            printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false);
-        } else {
-            accountManager->deleteAccount(accountState);
-            printAccountSetupFromCommandLineStatusAndExit(
-                QStringLiteral("Account %1 setup from command line failed, due to folder creation failure.").arg(_account->displayName()),
-                false);
-        }
-    } else {
-        qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("Set up a new account without a folder.");
-        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false);
-    }
-}
-
-void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure()
-{
-    const auto job = qobject_cast<PropfindJob *>(sender());
-    if (!job) {
-        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Cannot check for authed redirects. This slot should be invoked from PropfindJob!"), true);
-        return;
-    }
-    const auto reply = job->reply();
-
-    QString errorMsg;
-
-    // If there were redirects on the *authed* requests, also store
-    // the updated server URL, similar to redirects on status.php.
-    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
-    if (!redirectUrl.isEmpty()) {
-        qCInfo(lcAccountSetupCommandLineManager) << "Authed request was redirected to" << redirectUrl.toString();
-
-        // strip the expected path
-        auto path = redirectUrl.path();
-        static QString expectedPath = "/" + _account->davPath();
-        if (path.endsWith(expectedPath)) {
-            path.chop(expectedPath.size());
-            redirectUrl.setPath(path);
-
-            qCInfo(lcAccountSetupCommandLineManager) << "Setting account url to" << redirectUrl.toString();
-            _account->setUrl(redirectUrl);
-            checkLastModifiedWithPropfind();
-        }
-        errorMsg = tr("The authenticated request to the server was redirected to "
-                      "\"%1\". The URL is bad, the server is misconfigured.")
-                       .arg(Utility::escape(redirectUrl.toString()));
-
-        // 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::ContentNotFoundError) {
-        accountSetupFromCommandLinePropfindHandleSuccess();
-    } else if (reply->error() != QNetworkReply::NoError) {
-        if (!_account->credentials()->stillValid(reply)) {
-            errorMsg = tr("Access forbidden by server. To verify that you have proper access, "
-                          "<a href=\"%1\">click here</a> to access the service with your browser.")
-                           .arg(Utility::escape(_account->url().toString()));
-        } else {
-            errorMsg = job->errorStringParsingBody();
-        }
-        // Something else went wrong, maybe the response was 200 but with invalid data.
-    } else {
-        errorMsg = tr("There was an invalid response to an authenticated WebDAV request");
-    }
-    printAccountSetupFromCommandLineStatusAndExit(
-        QStringLiteral("Account %1 setup from command line failed with error: %2.").arg(_account->displayName()).arg(errorMsg),
-        true);
-}
-
-void AccountSetupFromCommandLineJob::printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure)
-{
-    if (isFailure) {
-        qCWarning(lcAccountSetupCommandLineManager) << status;
-    } else {
-        qCInfo(lcAccountSetupCommandLineManager) << status;
-    }
-    QTimer::singleShot(0, this, [this, isFailure]() {
-        this->deleteLater();
-        if (!isFailure) {
-            qApp->quit();
-        } else {
-            qApp->exit(1);
-        }
-    });
-}
-
-void AccountSetupFromCommandLineJob::fetchUserName()
-{
-    const auto fetchUserNameJob = new JsonApiJob(_account, QStringLiteral("/ocs/v1.php/cloud/user"));
-    connect(fetchUserNameJob, &JsonApiJob::jsonReceived, this, [this](const QJsonDocument &json, int statusCode) {
-        sender()->deleteLater();
-
-        if (statusCode != 100) {
-            printAccountSetupFromCommandLineStatusAndExit("Could not fetch username.", true);
-            return;
-        }
-
-        const auto objData = json.object().value("ocs").toObject().value("data").toObject();
-        const auto userId = objData.value("id").toString("");
-        const auto displayName = objData.value("display-name").toString("");
-        _account->setDavUser(userId);
-        _account->setDavDisplayName(displayName);
-
-        checkLastModifiedWithPropfind();
-    });
-    fetchUserNameJob->start();
-}
-
 bool AccountSetupCommandLineManager::parseCommandlineOption(const QString &option, QStringListIterator &optionsIterator, QString &errorMessage)
 {
     if (option == QStringLiteral("--apppassword")) {
@@ -269,12 +56,12 @@ bool AccountSetupCommandLineManager::parseCommandlineOption(const QString &optio
         } else {
             errorMessage = QStringLiteral("userid not specified");
         }
-    } else if (option == QLatin1String("--nonvfsmode")) {
+    } else if (option == QLatin1String("--isvfsenabled")) {
         if (optionsIterator.hasNext() && !optionsIterator.peekNext().startsWith(QLatin1String("--"))) {
-            _nonVfsMode = optionsIterator.next().toInt() != 0;
+            _isVfsEnabled = optionsIterator.next().toInt() != 0;
             return true;
         } else {
-            errorMessage = QStringLiteral("nonVfsMode not specified");
+            errorMessage = QStringLiteral("isvfsenabled not specified");
         }
     } 
     return false;
@@ -289,7 +76,7 @@ void AccountSetupCommandLineManager::setupAccountFromCommandLine(QObject *parent
 {
     if (isCommandLineParsed()) {
         qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("Command line has been parsed and account setup parameters have been found. Attempting setup a new account %1...").arg(_userId);
-        const auto accountSetupJob = new AccountSetupFromCommandLineJob(_appPassword, _userId, _serverUrl, _localDirPath, _nonVfsMode, _remoteDirPath, parent);
+        const auto accountSetupJob = new AccountSetupFromCommandLineJob(_appPassword, _userId, _serverUrl, _localDirPath, _isVfsEnabled, _remoteDirPath, parent);
         accountSetupJob->handleAccountSetupFromCommandLine();
     } else {
         qCInfo(lcAccountSetupCommandLineManager) << QStringLiteral("No account setup parameters have been found, or they are invalid. Proceed with normal startup...");
@@ -299,7 +86,7 @@ void AccountSetupCommandLineManager::setupAccountFromCommandLine(QObject *parent
     _serverUrl.clear();
     _remoteDirPath.clear();
     _localDirPath.clear();
-    _nonVfsMode = false;
+    _isVfsEnabled = true;
 }
 
 QString AccountSetupCommandLineManager::_appPassword;
@@ -307,5 +94,5 @@ QString AccountSetupCommandLineManager::_userId;
 QUrl AccountSetupCommandLineManager::_serverUrl;
 QString AccountSetupCommandLineManager::_remoteDirPath;
 QString AccountSetupCommandLineManager::_localDirPath;
-bool AccountSetupCommandLineManager::_nonVfsMode = false;
+bool AccountSetupCommandLineManager::_isVfsEnabled = true;
 }
index 2875febdc658445fe86d651cc4989098a8ee1481..f9b1e9279603b8b41bfaf082572538287a7ba3ec 100644 (file)
 
 #pragma once
 
-#include "account.h"
-#include "accountstate.h"
-
+#include <QObject>
+#include <QString>
 #include <QStringList>
+#include <QUrl>
 
 namespace OCC {
-
-class AccountSetupFromCommandLineJob : public QObject
-{
-    Q_OBJECT
-public:
-    AccountSetupFromCommandLineJob(QString appPassword,
-                                   QString userId,
-                                   QUrl serverUrl,
-                                   QString localDirPath = {},
-                                   bool nonVfsMode = false,
-                                   QString remoteDirPath = QStringLiteral("/"),
-                                   QObject *parent = nullptr);
-
-public slots:
-    void handleAccountSetupFromCommandLine();
-
-private slots:
-    void checkLastModifiedWithPropfind();
-
-    void accountSetupFromCommandLinePropfindHandleSuccess();
-
-    void accountSetupFromCommandLinePropfindHandleFailure();
-
-    void printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure);
-
-    void fetchUserName();
-
-private:
-    QString _appPassword;
-    QString _userId;
-    QUrl _serverUrl;
-    QString _localDirPath;
-    bool _nonVfsMode = false;
-    QString _remoteDirPath;
-
-    AccountPtr _account;
-};
-
-
 class AccountSetupCommandLineManager
 {
 public:
@@ -76,7 +37,7 @@ private:
     static QUrl _serverUrl;
     static QString _remoteDirPath;
     static QString _localDirPath;
-    static bool _nonVfsMode;
+    static bool _isVfsEnabled;
 };
 
 }
diff --git a/src/gui/accountsetupfromcommandlinejob.cpp b/src/gui/accountsetupfromcommandlinejob.cpp
new file mode 100644 (file)
index 0000000..eeff0cf
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) by Oleksandr Zolotov <alex@nextcloud.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; 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 "accountsetupfromcommandlinejob.h"
+
+#include "accountmanager.h"
+#include "accountstate.h"
+#include "creds/webflowcredentials.h"
+#include "filesystem.h"
+#include "folder.h"
+#include "folderman.h"
+#include "networkjobs.h"
+
+#include <QDir>
+#include <QGuiApplication>
+#include <QJsonObject>
+#include <QLoggingCategory>
+
+namespace OCC
+{
+Q_LOGGING_CATEGORY(lcAccountSetupCommandLineJob, "nextcloud.gui.accountsetupcommandlinejob", QtInfoMsg)
+
+AccountSetupFromCommandLineJob::AccountSetupFromCommandLineJob(QString appPassword,
+                                                               QString userId,
+                                                               QUrl serverUrl,
+                                                               QString localDirPath,
+                                                               bool isVfsEnabled,
+                                                               QString remoteDirPath,
+                                                               QObject *parent)
+    : QObject(parent)
+    , _appPassword(appPassword)
+    , _userId(userId)
+    , _serverUrl(serverUrl)
+    , _localDirPath(localDirPath)
+    , _isVfsEnabled(isVfsEnabled)
+    , _remoteDirPath(remoteDirPath)
+{
+}
+
+void AccountSetupFromCommandLineJob::handleAccountSetupFromCommandLine()
+{
+    if (AccountManager::instance()->accountFromUserId(QStringLiteral("%1@%2").arg(_userId).arg(_serverUrl.host()))) {
+        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 already exists!").arg(QDir::toNativeSeparators(_userId)), true);
+        return;
+    }
+
+    if (!_localDirPath.isEmpty()) {
+        QDir dir(_localDirPath);
+        if (dir.exists() && !dir.isEmpty()) {
+            printAccountSetupFromCommandLineStatusAndExit(
+                QStringLiteral("Local folder %1 already exists and is non-empty!").arg(QDir::toNativeSeparators(_localDirPath)),
+                true);
+            return;
+        }
+
+        qCInfo(lcAccountSetupCommandLineJob) << "Creating folder" << _localDirPath;
+        if (!dir.exists() && !dir.mkpath(".")) {
+            printAccountSetupFromCommandLineStatusAndExit(
+                QStringLiteral("Folder creation failed. Could not create local folder %1").arg(QDir::toNativeSeparators(_localDirPath)),
+                true);
+            return;
+        }
+
+        FileSystem::setFolderMinimumPermissions(_localDirPath);
+        Utility::setupFavLink(_localDirPath);
+    }
+
+    const auto credentials = new WebFlowCredentials(_userId, _appPassword);
+    _account = AccountManager::createAccount();
+    _account->setCredentials(credentials);
+    _account->setUrl(_serverUrl);
+
+    fetchUserName();
+}
+
+void AccountSetupFromCommandLineJob::checkLastModifiedWithPropfind()
+{
+    const auto job = new PropfindJob(_account, "/", this);
+    job->setIgnoreCredentialFailure(true);
+    // There is custom redirect handling in the error handler,
+    // so don't automatically follow redirects.
+    job->setFollowRedirects(false);
+    job->setProperties(QList<QByteArray>() << QByteArrayLiteral("getlastmodified"));
+    connect(job, &PropfindJob::result, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess);
+    connect(job, &PropfindJob::finishedWithError, this, &AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure);
+    job->start();
+}
+
+void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleSuccess()
+{
+    const auto accountManager = AccountManager::instance();
+    const auto accountState = accountManager->addAccount(_account);
+    accountManager->save();
+
+    if (!_localDirPath.isEmpty()) {
+        setupLocalSyncFolder(accountState);
+    } else {
+        qCInfo(lcAccountSetupCommandLineJob) << QStringLiteral("Set up a new account without a folder.");
+        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false);
+    }
+}
+
+void AccountSetupFromCommandLineJob::accountSetupFromCommandLinePropfindHandleFailure()
+{
+    const auto job = qobject_cast<PropfindJob *>(sender());
+    if (!job) {
+        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Cannot check for authed redirects. This slot should be invoked from PropfindJob!"), true);
+        return;
+    }
+    const auto reply = job->reply();
+
+    QString errorMsg;
+
+    // If there were redirects on the *authed* requests, also store
+    // the updated server URL, similar to redirects on status.php.
+    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
+    if (!redirectUrl.isEmpty()) {
+        qCInfo(lcAccountSetupCommandLineJob) << "Authed request was redirected to" << redirectUrl.toString();
+
+        // strip the expected path
+        auto path = redirectUrl.path();
+        static QString expectedPath = "/" + _account->davPath();
+        if (path.endsWith(expectedPath)) {
+            path.chop(expectedPath.size());
+            redirectUrl.setPath(path);
+
+            qCInfo(lcAccountSetupCommandLineJob) << "Setting account url to" << redirectUrl.toString();
+            _account->setUrl(redirectUrl);
+            checkLastModifiedWithPropfind();
+        }
+        errorMsg = tr("The authenticated request to the server was redirected to "
+                      "\"%1\". The URL is bad, the server is misconfigured.")
+                       .arg(Utility::escape(redirectUrl.toString()));
+
+        // 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::ContentNotFoundError) {
+        accountSetupFromCommandLinePropfindHandleSuccess();
+    } else if (reply->error() != QNetworkReply::NoError) {
+        if (!_account->credentials()->stillValid(reply)) {
+            errorMsg = tr("Access forbidden by server. To verify that you have proper access, "
+                          "<a href=\"%1\">click here</a> to access the service with your browser.")
+                           .arg(Utility::escape(_account->url().toString()));
+        } else {
+            errorMsg = job->errorStringParsingBody();
+        }
+        // Something else went wrong, maybe the response was 200 but with invalid data.
+    } else {
+        errorMsg = tr("There was an invalid response to an authenticated WebDAV request");
+    }
+    printAccountSetupFromCommandLineStatusAndExit(
+        QStringLiteral("Account %1 setup from command line failed with error: %2.").arg(_account->displayName()).arg(errorMsg),
+        true);
+}
+
+void AccountSetupFromCommandLineJob::setupLocalSyncFolder(AccountState *accountState)
+{
+    FolderDefinition definition;
+    definition.localPath = _localDirPath;
+    definition.targetPath = FolderDefinition::prepareTargetPath(!_remoteDirPath.isEmpty() ? _remoteDirPath : QStringLiteral("/"));
+    definition.virtualFilesMode = _isVfsEnabled ? bestAvailableVfsMode() : Vfs::Off;
+
+    const auto folderMan = FolderMan::instance();
+
+    definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
+    definition.alias = folderMan->map().size() > 0 ? QString::number(folderMan->map().size()) : QString::number(0);
+
+    if (folderMan->navigationPaneHelper().showInExplorerNavigationPane()) {
+        definition.navigationPaneClsid = QUuid::createUuid();
+    }
+
+    folderMan->setSyncEnabled(false);
+
+    if (const auto folder = folderMan->addFolder(accountState, definition)) {
+        if (definition.virtualFilesMode != Vfs::Off) {
+            folder->setRootPinState(PinState::OnlineOnly);
+        }
+        folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, QStringList() << QLatin1String("/"));
+        qCInfo(lcAccountSetupCommandLineJob) << QStringLiteral("Folder %1 setup from command line success.").arg(definition.localPath);
+        printAccountSetupFromCommandLineStatusAndExit(QStringLiteral("Account %1 setup from command line success.").arg(_account->displayName()), false);
+    } else {
+        AccountManager::instance()->deleteAccount(accountState);
+        printAccountSetupFromCommandLineStatusAndExit(
+            QStringLiteral("Account %1 setup from command line failed, due to folder creation failure.").arg(_account->displayName()),
+            false);
+    }
+}
+
+void AccountSetupFromCommandLineJob::printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure)
+{
+    if (isFailure) {
+        qCWarning(lcAccountSetupCommandLineJob) << status;
+    } else {
+        qCInfo(lcAccountSetupCommandLineJob) << status;
+    }
+    QTimer::singleShot(0, this, [this, isFailure]() {
+        this->deleteLater();
+        if (!isFailure) {
+            qApp->quit();
+        } else {
+            qApp->exit(1);
+        }
+    });
+}
+
+void AccountSetupFromCommandLineJob::fetchUserName()
+{
+    const auto fetchUserNameJob = new JsonApiJob(_account, QStringLiteral("/ocs/v1.php/cloud/user"));
+    connect(fetchUserNameJob, &JsonApiJob::jsonReceived, this, [this](const QJsonDocument &json, int statusCode) {
+        sender()->deleteLater();
+
+        if (statusCode != 100) {
+            printAccountSetupFromCommandLineStatusAndExit("Could not fetch username.", true);
+            return;
+        }
+
+        const auto objData = json.object().value("ocs").toObject().value("data").toObject();
+        const auto userId = objData.value("id").toString("");
+        const auto displayName = objData.value("display-name").toString("");
+        _account->setDavUser(userId);
+        _account->setDavDisplayName(displayName);
+
+        checkLastModifiedWithPropfind();
+    });
+    fetchUserNameJob->start();
+}
+}
diff --git a/src/gui/accountsetupfromcommandlinejob.h b/src/gui/accountsetupfromcommandlinejob.h
new file mode 100644 (file)
index 0000000..8485c72
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) by Oleksandr Zolotov <alex@nextcloud.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; 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 "account.h"
+
+#include <QObject>
+#include <QString>
+#include <QUrl>
+
+namespace OCC
+{
+class AccountState;
+
+class AccountSetupFromCommandLineJob : public QObject
+{
+    Q_OBJECT
+
+public:
+    AccountSetupFromCommandLineJob(QString appPassword,
+                                   QString userId,
+                                   QUrl serverUrl,
+                                   QString localDirPath = {},
+                                   bool nonVfsMode = false,
+                                   QString remoteDirPath = QStringLiteral("/"),
+                                   QObject *parent = nullptr);
+
+public slots:
+    void handleAccountSetupFromCommandLine();
+
+private slots:
+    void checkLastModifiedWithPropfind();
+
+    void accountSetupFromCommandLinePropfindHandleSuccess();
+
+    void accountSetupFromCommandLinePropfindHandleFailure();
+
+    void setupLocalSyncFolder(AccountState *accountState);
+
+    void printAccountSetupFromCommandLineStatusAndExit(const QString &status, bool isFailure);
+
+    void fetchUserName();
+
+private:
+    QString _appPassword;
+    QString _userId;
+    QUrl _serverUrl;
+    QString _localDirPath;
+    bool _isVfsEnabled = true;
+    QString _remoteDirPath;
+
+    AccountPtr _account;
+};
+}
index 54d696ab8d7008658938066c94e6cd73d34fcc4c..eeaab85da7dc0173ef62d2273ce46c680efd4ac3 100644 (file)
@@ -90,7 +90,7 @@ namespace {
         "  --userid             : userId (username as on the server) to pass when creating an account via command-line.\n"
         "  --apppassword        : appPassword to pass when creating an account via command-line.\n"
         "  --localdirpath       : (optional) path where to create a local sync folder when creating an account via command-line.\n"
-        "  --nonvfsmode         : whether to set up a non-VFS folder (1 for 'yes' or 0 for 'no') when creating an account via command-line.\n"
+        "  --isvfsenabled       : whether to set a VFS or non-VFS folder (1 for 'yes' or 0 for 'no') when creating an account via command-line.\n"
         "  --remotedirpath      : (optional) path to a remote subfolder when creating an account via command-line.\n"
         "  --serverurl          : a server URL to use when creating an account via command-line.\n";