From c65b544757c0e357bbfca3141606d1274f0d5022 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 18 Sep 2024 19:05:02 +0800 Subject: [PATCH 01/11] Add combo box to setup page UI Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetupnocredspage.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/wizard/owncloudsetupnocredspage.ui b/src/gui/wizard/owncloudsetupnocredspage.ui index d67873450d..d12a9e1438 100644 --- a/src/gui/wizard/owncloudsetupnocredspage.ui +++ b/src/gui/wizard/owncloudsetupnocredspage.ui @@ -199,6 +199,9 @@ + + + From a2c818e157cfa5d0b5e6263aa744f2f73a7be517 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:05:24 +0800 Subject: [PATCH 02/11] Add property for detecting of application override server url is in fact a JSON array string describing multiple servers Signed-off-by: Claudio Cambra --- src/libsync/theme.cpp | 16 ++++++++++++++++ src/libsync/theme.h | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/src/libsync/theme.cpp b/src/libsync/theme.cpp index 11c8982bf1..407db59bab 100644 --- a/src/libsync/theme.cpp +++ b/src/libsync/theme.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include "nextcloudtheme.h" @@ -383,6 +385,7 @@ Theme::Theme() #endif #ifdef APPLICATION_SERVER_URL _overrideServerUrl = QString::fromLatin1(APPLICATION_SERVER_URL); + updateMultipleOverrideServers(); #endif } @@ -432,6 +435,18 @@ bool Theme::forceOverrideServerUrl() const return _forceOverrideServerUrl; } +void Theme::updateMultipleOverrideServers() +{ + const auto json = overrideServerUrl().toUtf8(); + const auto doc = QJsonDocument::fromJson(json); + _multipleOverrideServers = doc.isArray() && !doc.array().empty(); +} + +bool Theme::multipleOverrideServers() const +{ + return _multipleOverrideServers; +} + bool Theme::isVfsEnabled() const { return _isVfsEnabled; @@ -954,6 +969,7 @@ void Theme::setOverrideServerUrl(const QString &overrideServerUrl) { if (_overrideServerUrl != overrideServerUrl) { _overrideServerUrl = overrideServerUrl; + updateMultipleOverrideServers(); emit overrideServerUrlChanged(); } } diff --git a/src/libsync/theme.h b/src/libsync/theme.h index 0cca5484e4..b414c9fa3f 100644 --- a/src/libsync/theme.h +++ b/src/libsync/theme.h @@ -232,11 +232,18 @@ public: /** * Setting a value here will pre-define the server url. + * Can be a url OR a JSON array of servers description objects: {"name": "x", "url": "y"} * * The respective UI controls will be disabled only if forceOverrideServerUrl() is true */ [[nodiscard]] QString overrideServerUrl() const; + /** + * Indicates whether the override server URL is in fact a JSON array of server description + * objects. + */ + [[nodiscard]] bool multipleOverrideServers() const; + /** * Enforce a pre-defined server url. * @@ -627,6 +634,7 @@ private: Theme(Theme const &); Theme &operator=(Theme const &); + void updateMultipleOverrideServers(); void connectToPaletteSignal(); #if defined(Q_OS_WIN) QPalette reserveDarkPalette; // Windows 11 button and window dark colours @@ -638,6 +646,7 @@ private: QString _overrideServerUrl; bool _forceOverrideServerUrl = false; + bool _multipleOverrideServers = false; bool _isVfsEnabled = false; bool _startLoginFlowAutomatically = false; From e3979ea52f1912c803d6092d04ae8446cd8dbe1b Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:06:01 +0800 Subject: [PATCH 03/11] Do not apply override server url as account url if this is a multi-server JSON string Signed-off-by: Claudio Cambra --- src/gui/accountmanager.cpp | 3 ++- src/gui/owncloudsetupwizard.cpp | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/accountmanager.cpp b/src/gui/accountmanager.cpp index 4f41267cde..57dfd097bb 100644 --- a/src/gui/accountmanager.cpp +++ b/src/gui/accountmanager.cpp @@ -456,7 +456,8 @@ AccountPtr AccountManager::loadAccountHelper(QSettings &settings) const auto overrideUrl = Theme::instance()->overrideServerUrl(); const auto forceAuth = Theme::instance()->forceConfigAuthType(); - if (!forceAuth.isEmpty() && !overrideUrl.isEmpty()) { + const auto multipleOverrideServers = Theme::instance()->multipleOverrideServers(); + if (!forceAuth.isEmpty() && !overrideUrl.isEmpty() && !multipleOverrideServers) { // If forceAuth is set, this might also mean the overrideURL has changed. // See enterprise issues #1126 acc->setUrl(overrideUrl); diff --git a/src/gui/owncloudsetupwizard.cpp b/src/gui/owncloudsetupwizard.cpp index c60fd118ff..40b88289a3 100644 --- a/src/gui/owncloudsetupwizard.cpp +++ b/src/gui/owncloudsetupwizard.cpp @@ -103,7 +103,9 @@ void OwncloudSetupWizard::startWizard() { AccountPtr account = AccountManager::createAccount(); account->setCredentials(CredentialsFactory::create("dummy")); - account->setUrl(Theme::instance()->overrideServerUrl()); + const auto defaultUrl = + Theme::instance()->multipleOverrideServers() ? QString{} : Theme::instance()->overrideServerUrl(); + account->setUrl(defaultUrl); _ocWizard->setAccount(account); _ocWizard->setOCUrl(account->url().toString()); From 1decedd56f15c26fe144713ea62270891bafafb0 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:06:59 +0800 Subject: [PATCH 04/11] Show or hide multi-server overrides or text field depending on type of override url Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index a5374eb59f..75ba4322af 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include "QProgressIndicator.h" @@ -47,15 +49,27 @@ OwncloudSetupPage::OwncloudSetupPage(QWidget *parent) setupServerAddressDescriptionLabel(); - Theme *theme = Theme::instance(); + const auto theme = Theme::instance(); if (theme->overrideServerUrl().isEmpty()) { + _ui.comboBox->hide(); _ui.leUrl->setPostfix(theme->wizardUrlPostfix()); _ui.leUrl->setPlaceholderText(theme->wizardUrlHint()); - } else if (Theme::instance()->forceOverrideServerUrl()) { + } else if (theme->multipleOverrideServers() && theme->forceOverrideServerUrl()) { + _ui.leUrl->hide(); + const auto overrideJsonUtf8 = theme->overrideServerUrl().toUtf8(); + const auto serversJsonArray = QJsonDocument::fromJson(overrideJsonUtf8).array(); + + for (const auto &serverJson : serversJsonArray) { + const auto serverObject = serverJson.toObject(); + const auto serverName = serverObject.value("name").toString(); + const auto serverUrl = serverObject.value("url").toString(); + _ui.comboBox->addItem(serverName, serverUrl); + } + } else if (theme->forceOverrideServerUrl()) { + _ui.comboBox->hide(); _ui.leUrl->setEnabled(false); } - registerField(QLatin1String("OCUrl*"), _ui.leUrl); auto sizePolicy = _progressIndi->sizePolicy(); From 6358f002630445702bb0a8c2a523de9083decc91 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:07:15 +0800 Subject: [PATCH 05/11] Accept combo box selection as completed state in setup page Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index 75ba4322af..4656d1947c 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -179,7 +179,7 @@ void OwncloudSetupPage::slotUrlEditFinished() bool OwncloudSetupPage::isComplete() const { - return !_ui.leUrl->text().isEmpty() && !_checking; + return (!_ui.leUrl->text().isEmpty() || !_ui.comboBox->currentData().toString().isEmpty()) && !_checking; } void OwncloudSetupPage::initializePage() From 5c08e4501986a952ab3afa2cc96343c719860858 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:08:30 +0800 Subject: [PATCH 06/11] If using multi-server override url and forcing it then provide combo box selection url as url in setup page Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index 4656d1947c..b213fbb030 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -240,8 +240,12 @@ int OwncloudSetupPage::nextId() const QString OwncloudSetupPage::url() const { - QString url = _ui.leUrl->fullText().simplified(); - return url; + const auto theme = Theme::instance(); + if (theme->multipleOverrideServers() && theme->forceOverrideServerUrl()) { + return _ui.comboBox->currentData().toString(); + } else { + return _ui.leUrl->fullText().simplified(); + } } bool OwncloudSetupPage::validatePage() From 0663120f4fd33ed62c5028559353d953e131b9a8 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 15:09:01 +0800 Subject: [PATCH 07/11] Use url method instead of text field contents as url when deciding on error string in setup page Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index b213fbb030..10dcb30291 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -288,7 +288,8 @@ void OwncloudSetupPage::setErrorString(const QString &err, bool retryHTTPonly) _ui.errorLabel->setVisible(false); } else { if (retryHTTPonly) { - QUrl url(_ui.leUrl->fullText()); + const auto urlString = url(); + QUrl url(urlString); if (url.scheme() == "https") { // Ask the user how to proceed when connecting to a https:// URL fails. // It is possible that the server is secured with client-side TLS certificates, From d84ede3ef249c7f2fc6132cc1544afeed0a08a61 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 18:13:05 +0800 Subject: [PATCH 08/11] Do not automatically validate server URL when enforced servers is active but have multiple servers Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index 10dcb30291..fdbb8248e6 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -206,7 +206,7 @@ void OwncloudSetupPage::initializePage() if (nextButton) { nextButton->setFocus(); } - } else if (isServerUrlOverridden) { + } else if (isServerUrlOverridden && !Theme::instance()->multipleOverrideServers()) { // If the overwritten url is not empty and we force this overwritten url // we just check the server type and switch to next page // immediately. From 72fe0d8818d617a4edc6ad30fd0da506d07fff89 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 18:13:18 +0800 Subject: [PATCH 09/11] Display server URL in multi-server enforced combo box Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index fdbb8248e6..1a0cc9f0d8 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -63,7 +63,8 @@ OwncloudSetupPage::OwncloudSetupPage(QWidget *parent) const auto serverObject = serverJson.toObject(); const auto serverName = serverObject.value("name").toString(); const auto serverUrl = serverObject.value("url").toString(); - _ui.comboBox->addItem(serverName, serverUrl); + const auto serverDisplayString = QString("%1 (%2)").arg(serverName, serverUrl); + _ui.comboBox->addItem(serverDisplayString, serverUrl); } } else if (theme->forceOverrideServerUrl()) { _ui.comboBox->hide(); From f13bdb3aa9e82e604157134b560267a6fc1b6070 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 18:13:42 +0800 Subject: [PATCH 10/11] Use a raw string in config.h.in for application server url Signed-off-by: Claudio Cambra --- config.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h.in b/config.h.in index fd2b177661..be30055020 100644 --- a/config.h.in +++ b/config.h.in @@ -23,7 +23,7 @@ #cmakedefine APPLICATION_HELP_URL "@APPLICATION_HELP_URL@" #cmakedefine APPLICATION_ICON_NAME "@APPLICATION_ICON_NAME@" #cmakedefine APPLICATION_ICON_SET "@APPLICATION_ICON_SET@" -#cmakedefine APPLICATION_SERVER_URL "@APPLICATION_SERVER_URL@" +#cmakedefine APPLICATION_SERVER_URL R"(@APPLICATION_SERVER_URL@)" #cmakedefine APPLICATION_SERVER_URL_ENFORCE "@APPLICATION_SERVER_URL_ENFORCE@" #cmakedefine LINUX_APPLICATION_ID "@LINUX_APPLICATION_ID@" #cmakedefine APPLICATION_WIZARD_HEADER_BACKGROUND_COLOR "@APPLICATION_WIZARD_HEADER_BACKGROUND_COLOR@" From c16b6205f155fff54963501eff2f32b550a8ccad Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 19 Sep 2024 19:10:07 +0800 Subject: [PATCH 11/11] Ensure we hide the combo box for multiple override servers by default Signed-off-by: Claudio Cambra --- src/gui/wizard/owncloudsetuppage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/wizard/owncloudsetuppage.cpp b/src/gui/wizard/owncloudsetuppage.cpp index 1a0cc9f0d8..708949f759 100644 --- a/src/gui/wizard/owncloudsetuppage.cpp +++ b/src/gui/wizard/owncloudsetuppage.cpp @@ -69,6 +69,8 @@ OwncloudSetupPage::OwncloudSetupPage(QWidget *parent) } else if (theme->forceOverrideServerUrl()) { _ui.comboBox->hide(); _ui.leUrl->setEnabled(false); + } else { + _ui.comboBox->hide(); } registerField(QLatin1String("OCUrl*"), _ui.leUrl);