From d98faf5fb9f1d7cfaba09cf755e1f9a0264ee5fa Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Wed, 6 Dec 2023 09:58:17 +0100 Subject: [PATCH] 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 --- doc/conffile.rst | 2 ++ src/gui/wizard/owncloudsetuppage.cpp | 2 ++ src/gui/wizard/owncloudsetuppage.h | 3 +++ src/gui/wizard/owncloudwizard.cpp | 15 +++++++++++---- src/gui/wizard/owncloudwizard.h | 4 ++++ src/libsync/configfile.cpp | 9 +++++++++ src/libsync/configfile.h | 4 ++++ src/libsync/networkjobs.cpp | 13 ++++++++++++- src/libsync/networkjobs.h | 1 + 9 files changed, 48 insertions(+), 5 deletions(-) diff --git a/doc/conffile.rst b/doc/conffile.rst index 8d403df30bd8a..670cc4d607540 100644 --- a/doc/conffile.rst +++ b/doc/conffile.rst @@ -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. | diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index c7134478ab0ae..15be3e342dd5e 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -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: diff --git a/src/gui/wizard/owncloudsetuppage.h b/src/gui/wizard/owncloudsetuppage.h index e9c5da0d2c0d0..06cea0753695e 100644 --- a/src/gui/wizard/owncloudsetuppage.h +++ b/src/gui/wizard/owncloudsetuppage.h @@ -89,6 +89,9 @@ protected slots: QProgressIndicator *_progressIndi; OwncloudWizard *_ocWizard; AddCertificateDialog *addCertDial = nullptr; + + // Grab the forceLoginV2-setting from the wizard + bool useFlow2 = _ocWizard->useFlow2(); }; } // namespace OCC diff --git a/src/gui/wizard/owncloudwizard.cpp b/src/gui/wizard/owncloudwizard.cpp index faac2f5ad8934..a70421a762ebc 100644 --- a/src/gui/wizard/owncloudwizard.cpp +++ b/src/gui/wizard/owncloudwizard.cpp @@ -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; diff --git a/src/gui/wizard/owncloudwizard.h b/src/gui/wizard/owncloudwizard.h index 58d3e915d9d1b..7b006c7272c25 100644 --- a/src/gui/wizard/owncloudwizard.h +++ b/src/gui/wizard/owncloudwizard.h @@ -21,6 +21,7 @@ #include #include +#include "libsync/configfile.h" #include "networkjobs.h" #include "wizard/owncloudwizardcommon.h" #include "accountfwd.h" @@ -87,6 +88,7 @@ class OwncloudWizard : public QWizard QSslKey _clientSslKey; // key extracted from pkcs12 QSslCertificate _clientSslCertificate; // cert extracted from pkcs12 QList _clientSslCaCertificates; + bool useFlow2() { return _useFlow2; }; public slots: void setAuthType(OCC::DetermineAuthTypeJob::AuthType type); @@ -131,6 +133,8 @@ public slots: bool _registration = false; + bool _useFlow2 = ConfigFile().forceLoginV2(); + friend class OwncloudSetupWizard; }; diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index 60cb2cc71aeba..39949683f8bce 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -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(); } diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h index 21e58412afcc5..0ca15b807c73c 100644 --- a/src/libsync/configfile.h +++ b/src/libsync/configfile.h @@ -153,6 +153,10 @@ class OWNCLOUDSYNC_EXPORT ConfigFile [[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); diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index 3c784675feb61..48f10eb363be3 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -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 diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index 4fc397a7a4129..5670d0769590b 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -542,6 +542,7 @@ class OWNCLOUDSYNC_EXPORT DetermineAuthTypeJob : public QObject bool _getDone = false; bool _propfindDone = false; bool _oldFlowDone = false; + bool useFlow2 = false; }; /**