GUI/LIBSYNC: force login flow V2 with config setting

This patch allows a user to set the config variable:

forceLoginV2=true

This will make the client use the browser login flow instead of the
webview. This is useful for making the user experience equal on
Windows, Linux and Mac. Currently only Macs use the v2 flow and it
was only possible to get this behaviour in the Windows and Linux
clients at build time using a CMAKE flag.

The default behaviour is kept the same, and nothing changes for the
user unless the flag is manually set in the config file. A setter is
included in this patch, although it is not yet used in the GUI.

Signed-off-by: Micke Nordin <kano@sunet.se>
This commit is contained in:
Micke Nordin 2023-12-06 09:58:17 +01:00
parent c4f2537418
commit 772d44c66d
9 changed files with 48 additions and 5 deletions

View file

@ -41,6 +41,8 @@ Some interesting values that can be set on the configuration file are:
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``forceLoginV2`` | ``false`` | If the client should force the new login flow, eventhough some circumstances might need the old flow. |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
+----------------------------------+--------------------------+--------------------------------------------------------------------------------------------------------+
| ``maxChunkSize`` | ``1000000000`` (1000 MB) | Specifies the maximum chunk size of uploaded files in bytes. |

View file

@ -213,6 +213,8 @@ int OwncloudSetupPage::nextId() const
return WizardCommon::Page_Flow2AuthCreds;
#ifdef WITH_WEBENGINE
case DetermineAuthTypeJob::WebViewFlow:
if (this->useFlow2)
return WizardCommon::Page_Flow2AuthCreds;
return WizardCommon::Page_WebView;
#endif // WITH_WEBENGINE
case DetermineAuthTypeJob::NoAuthType:

View file

@ -89,6 +89,9 @@ private:
QProgressIndicator *_progressIndi;
OwncloudWizard *_ocWizard;
AddCertificateDialog *addCertDial = nullptr;
// Grab the forceLoginV2-setting from the wizard
bool useFlow2 = _ocWizard->useFlow2();
};
} // namespace OCC

View file

@ -65,7 +65,8 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
setPage(WizardCommon::Page_Flow2AuthCreds, _flow2CredsPage);
setPage(WizardCommon::Page_AdvancedSetup, _advancedSetupPage);
#ifdef WITH_WEBENGINE
setPage(WizardCommon::Page_WebView, _webViewPage);
if(!useFlow2())
setPage(WizardCommon::Page_WebView, _webViewPage);
#endif // WITH_WEBENGINE
connect(this, &QDialog::finished, this, &OwncloudWizard::basicSetupFinished);
@ -78,7 +79,8 @@ OwncloudWizard::OwncloudWizard(QWidget *parent)
connect(_httpCredsPage, &OwncloudHttpCredsPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
connect(_flow2CredsPage, &Flow2AuthCredsPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
#ifdef WITH_WEBENGINE
connect(_webViewPage, &WebViewPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
if(!useFlow2())
connect(_webViewPage, &WebViewPage::connectToOCUrl, this, &OwncloudWizard::connectToOCUrl);
#endif // WITH_WEBENGINE
connect(_advancedSetupPage, &OwncloudAdvancedSetupPage::createLocalAndRemoteFolders,
this, &OwncloudWizard::createLocalAndRemoteFolders);
@ -235,7 +237,8 @@ void OwncloudWizard::successfulStep()
#ifdef WITH_WEBENGINE
case WizardCommon::Page_WebView:
_webViewPage->setConnected();
if(!this->useFlow2())
_webViewPage->setConnected();
break;
#endif // WITH_WEBENGINE
@ -276,7 +279,11 @@ void OwncloudWizard::setAuthType(DetermineAuthTypeJob::AuthType type)
_credentialsPage = _flow2CredsPage;
#ifdef WITH_WEBENGINE
} else if (type == DetermineAuthTypeJob::WebViewFlow) {
_credentialsPage = _webViewPage;
if(this->useFlow2()) {
_credentialsPage = _flow2CredsPage;
} else {
_credentialsPage = _webViewPage;
}
#endif // WITH_WEBENGINE
} else { // try Basic auth even for "Unknown"
_credentialsPage = _httpCredsPage;

View file

@ -21,6 +21,7 @@
#include <QSslKey>
#include <QSslCertificate>
#include "libsync/configfile.h"
#include "networkjobs.h"
#include "wizard/owncloudwizardcommon.h"
#include "accountfwd.h"
@ -87,6 +88,7 @@ public:
QSslKey _clientSslKey; // key extracted from pkcs12
QSslCertificate _clientSslCertificate; // cert extracted from pkcs12
QList<QSslCertificate> _clientSslCaCertificates;
bool useFlow2() { return _useFlow2; };
public slots:
void setAuthType(OCC::DetermineAuthTypeJob::AuthType type);
@ -131,6 +133,8 @@ private:
bool _registration = false;
bool _useFlow2 = ConfigFile().forceLoginV2();
friend class OwncloudSetupWizard;
};

View file

@ -104,6 +104,8 @@ static constexpr char stopSyncingExistingFoldersOverLimitC[] = "stopSyncingExist
static constexpr char confirmExternalStorageC[] = "confirmExternalStorage";
static constexpr char moveToTrashC[] = "moveToTrash";
static constexpr char forceLoginV2C[] = "forceLoginV2";
static constexpr char certPath[] = "http_certificatePath";
static constexpr char certPasswd[] = "http_certificatePasswd";
@ -991,6 +993,13 @@ void ConfigFile::setMoveToTrash(bool isChecked)
setValue(moveToTrashC, isChecked);
}
bool ConfigFile::forceLoginV2() const {
return getValue(forceLoginV2C, QString(), false).toBool();
}
void ConfigFile::setForceLoginV2(bool isChecked) {
setValue(forceLoginV2C, isChecked);
}
bool ConfigFile::showMainDialogAsNormalWindow() const {
return getValue(showMainDialogAsNormalWindowC, {}, false).toBool();
}

View file

@ -153,6 +153,10 @@ public:
[[nodiscard]] bool moveToTrash() const;
void setMoveToTrash(bool);
/** If we should force loginflow v2 */
[[nodiscard]] bool forceLoginV2() const;
void setForceLoginV2(bool);
[[nodiscard]] bool showMainDialogAsNormalWindow() const;
static bool setConfDir(const QString &value);

View file

@ -44,6 +44,7 @@
#include "creds/abstractcredentials.h"
#include "creds/httpcredentials.h"
#include "configfile.h"
namespace OCC {
@ -1011,7 +1012,9 @@ bool JsonApiJob::finished()
DetermineAuthTypeJob::DetermineAuthTypeJob(AccountPtr account, QObject *parent)
: QObject(parent)
, _account(account)
{
useFlow2 = ConfigFile().forceLoginV2();
}
void DetermineAuthTypeJob::start()
@ -1077,7 +1080,11 @@ void DetermineAuthTypeJob::start()
if (flow != QJsonValue::Undefined) {
if (flow.toInt() == 1) {
#ifdef WITH_WEBENGINE
_resultOldFlow = WebViewFlow;
if(!this->useFlow2) {
_resultOldFlow = WebViewFlow;
} else {
qCWarning(lcDetermineAuthTypeJob) << "Server only supports flow1, but this client was configured to only use flow2";
}
#else // WITH_WEBENGINE
qCWarning(lcDetermineAuthTypeJob) << "Server does only support flow1, but this client was compiled without support for flow1";
#endif // WITH_WEBENGINE
@ -1111,6 +1118,8 @@ void DetermineAuthTypeJob::checkAllDone()
// WebViewFlow > Basic
if (_account->serverVersionInt() >= Account::makeServerVersion(12, 0, 0)) {
result = WebViewFlow;
if(useFlow2)
result = LoginFlowV2;
}
#endif // WITH_WEBENGINE
@ -1123,6 +1132,8 @@ void DetermineAuthTypeJob::checkAllDone()
// If we determined that we need the webview flow (GS for example) then we switch to that
if (_resultOldFlow == WebViewFlow) {
result = WebViewFlow;
if(useFlow2)
result = LoginFlowV2;
}
#endif // WITH_WEBENGINE

View file

@ -549,6 +549,7 @@ private:
bool _getDone = false;
bool _propfindDone = false;
bool _oldFlowDone = false;
bool useFlow2 = false;
};
/**