From 61cc21020eec6874738ee291e77ba20821405efb Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 1 Jul 2026 16:20:42 +0200 Subject: [PATCH] fix: Load OIDC prompt from the right value Also adds a test for Linux to read the values from an actual file. --- src/libsync/config/appconfig.cpp | 17 ++++++--- test/testappconfig.cpp | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/libsync/config/appconfig.cpp b/src/libsync/config/appconfig.cpp index 857b3b92955..530adff63c4 100644 --- a/src/libsync/config/appconfig.cpp +++ b/src/libsync/config/appconfig.cpp @@ -68,14 +68,21 @@ OpenIdConfig AppConfig::loadOpenIdConfigFromSystemConfig(const QSettings &system QString clientId = system.value(OidcClientIdKey, QString()).toString(); QString clientSecret = system.value(OidcClientSecretKey, QString()).toString(); QString scopes = system.value(OidcScopesKey, QString()).toString(); - QString prompt = system.value(OidcPortsKey, QString()).toString(); + QString prompt = system.value(OidcPromptKey, QString()).toString(); QVector ports; - QVariant portsVar = system.value(OidcPortsKey, QString()).toString(); - const auto parts = portsVar.toString().split(QLatin1Char(','), Qt::SkipEmptyParts); - for (const QString &p : parts) { + QVariant portsVar = system.value(OidcPortsKey); + QStringList parts; + if (portsVar.typeId() == QMetaType::QString) { + // Windows registry: "8080,8888" is a QString + parts = portsVar.toString().split(QLatin1Char(','), Qt::SkipEmptyParts); + } else { + // .ini files (Linux, macOS): "8080,8888" is a QStringlist + parts = portsVar.toStringList(); + } + for (const QString &p : std::as_const(parts)) { bool ok = false; - const quint16 val = static_cast(p.trimmed().toUInt(&ok)); + quint16 val = p.trimmed().toUShort(&ok); if (ok) { ports.append(val); } diff --git a/test/testappconfig.cpp b/test/testappconfig.cpp index 5abd9882c78..cc46c76f946 100644 --- a/test/testappconfig.cpp +++ b/test/testappconfig.cpp @@ -5,10 +5,51 @@ #include "libsync/owncloudtheme.h" #include "libsync/config/appconfig.h" +static const std::string_view iniData{ + "[Setup]\n" + "ServerUrl=https://cloud.example.com\n" + "AllowServerUrlChange=false\n" + "MoveToTrash=true\n" + "\n" + "[Updater]\n" + "SkipUpdateCheck=true\n" + "\n" + "[OpenIDConnect]\n" + "ClientId=your-client-id\n" + "ClientSecret=your-client-secret\n" + "Ports=8080,8443\n" + "Scopes=openid offline_access email profile\n" + "Prompt=select_account consent\n" +}; + class TestAppConfig : public QObject { Q_OBJECT + QString _configPath; + + bool createConfigFile(const QByteArray &data) { + auto theme = OCC::ownCloudTheme(); + _configPath = OCC::AppConfig::configPath(QOperatingSystemVersion::Unknown, theme); + + QString parent = QFileInfo(_configPath).path(); + if (!QDir().mkpath(parent)) + return false; + + QFile iniFile(_configPath); + if (!iniFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + qDebug()<{8080, 8443})); + QCOMPARE(oidCfg.scopes(), "openid offline_access email profile"); + QCOMPARE(oidCfg.prompt(), "select_account consent"); + } }; QTEST_GUILESS_MAIN(TestAppConfig)