Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions src/libsync/config/appconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<quint16> 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<quint16>(p.trimmed().toUInt(&ok));
quint16 val = p.trimmed().toUShort(&ok);
if (ok) {
ports.append(val);
}
Expand Down
61 changes: 61 additions & 0 deletions test/testappconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()<<iniFile.errorString();
return false;
}
bool ok = iniFile.write(data) == data.length();
iniFile.close();
return ok;
}

void cleanupConfigFile() {
QFile::remove(_configPath);
}

private Q_SLOTS:
void testConfigPath()
{
Expand All @@ -17,6 +58,26 @@ private Q_SLOTS:
QCOMPARE(OCC::AppConfig::configPath(QOperatingSystemVersion::MacOS, t), QString("/Library/Preferences/com.owncloud.desktopclient/ownCloud.ini"));
QCOMPARE(OCC::AppConfig::configPath(QOperatingSystemVersion::Unknown, t), QString("/etc/ownCloud/ownCloud.ini"));
}

void testFromFile()
Comment thread
modSpike marked this conversation as resolved.
{
if (!OCC::Utility::isLinux()) {
QSKIP("This test only works on Linux");
}

auto cleanup = qScopeGuard([this]() { TestAppConfig::cleanupConfigFile(); });
QVERIFY(createConfigFile(QByteArray(iniData)));

OCC::AppConfig appConfig;
QVERIFY(!appConfig.allowServerUrlChange());

OCC::OpenIdConfig oidCfg = appConfig.openIdConfig();
QCOMPARE(oidCfg.clientId(), "your-client-id");
QCOMPARE(oidCfg.clientSecret(), "your-client-secret");
QCOMPARE(oidCfg.ports(), (QList<quint16>{8080, 8443}));
QCOMPARE(oidCfg.scopes(), "openid offline_access email profile");
QCOMPARE(oidCfg.prompt(), "select_account consent");
}
};

QTEST_GUILESS_MAIN(TestAppConfig)
Expand Down
Loading