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
79 changes: 63 additions & 16 deletions src/gui/accountmanager.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2015 ownCloud GmbH
Expand Down Expand Up @@ -276,9 +276,11 @@
selectedAccountIds = childGroups;
}

const auto legacyVersion = oCSettings->value(ConfigFile::clientVersionC, {}).toString();
ConfigFile().setClientPreviousVersionString(legacyVersion);
qCInfo(lcAccountManager) << "Migrating from" << legacyVersion;
qCInfo(lcAccountManager) << "Copy settings" << oCSettings->allKeys().join(", ");
settings = std::move(oCSettings);

ConfigFile::setDiscoveredLegacyConfigPath(configFileInfo.canonicalPath());
break;
} else {
Expand All @@ -288,21 +290,47 @@
}

ConfigFile configFile;
// General settings
configFile.setVfsEnabled(settings->value(ConfigFile::isVfsEnabledC, configFile.isVfsEnabled()).toBool());
configFile.setLaunchOnSystemStartup(settings->value(ConfigFile::launchOnSystemStartupC, configFile.launchOnSystemStartup()).toBool());
configFile.setOptionalServerNotifications(settings->value(ConfigFile::optionalServerNotificationsC, configFile.optionalServerNotifications()).toBool());
configFile.setPromptDeleteFiles(settings->value(ConfigFile::promptDeleteC, configFile.promptDeleteFiles()).toBool());
configFile.setShowCallNotifications(settings->value(ConfigFile::showCallNotificationsC, configFile.showCallNotifications()).toBool());
configFile.setShowChatNotifications(settings->value(ConfigFile::showChatNotificationsC, configFile.showChatNotifications()).toBool());
configFile.setShowQuotaWarningNotifications(settings->value(ConfigFile::showQuotaWarningNotificationsC, configFile.showQuotaWarningNotifications()).toBool());
configFile.setShowInExplorerNavigationPane(settings->value(ConfigFile::showInExplorerNavigationPaneC, configFile.showInExplorerNavigationPane()).toBool());
configFile.setLaunchOnSystemStartup(settings->value(ConfigFile::launchOnSystemStartupC,
configFile.launchOnSystemStartup()).toBool());
configFile.setOptionalServerNotifications(settings->value(ConfigFile::optionalServerNotificationsC,
configFile.optionalServerNotifications()).toBool());
configFile.setPromptDeleteFiles(settings->value(ConfigFile::promptDeleteC,
configFile.promptDeleteFiles()).toBool());
configFile.setShowCallNotifications(settings->value(ConfigFile::showCallNotificationsC,
configFile.showCallNotifications()).toBool());
configFile.setShowChatNotifications(settings->value(ConfigFile::showChatNotificationsC,
configFile.showChatNotifications()).toBool());
configFile.setShowQuotaWarningNotifications(settings->value(ConfigFile::showQuotaWarningNotificationsC,
configFile.showQuotaWarningNotifications()).toBool());
configFile.setShowInExplorerNavigationPane(settings->value(ConfigFile::showInExplorerNavigationPaneC,
configFile.showInExplorerNavigationPane()).toBool());
// Advanced
const auto newBigFolderSizeLimit = settings->value(ConfigFile::newBigFolderSizeLimitC, configFile.newBigFolderSizeLimit().second).toLongLong();
const auto useNewBigFolderSizeLimit = settings->value(ConfigFile::useNewBigFolderSizeLimitC, configFile.useNewBigFolderSizeLimit()).toBool();
configFile.setNewBigFolderSizeLimit(useNewBigFolderSizeLimit, newBigFolderSizeLimit);
configFile.setNotifyExistingFoldersOverLimit(settings->value(ConfigFile::notifyExistingFoldersOverLimitC,
configFile.notifyExistingFoldersOverLimit()).toBool());
configFile.setStopSyncingExistingFoldersOverLimit(settings->value(ConfigFile::stopSyncingExistingFoldersOverLimitC,
configFile.stopSyncingExistingFoldersOverLimit()).toBool());
configFile.setConfirmExternalStorage(settings->value(ConfigFile::confirmExternalStorageC, configFile.confirmExternalStorage()).toBool());
configFile.setMoveToTrash(settings->value(ConfigFile::moveToTrashC, configFile.moveToTrash()).toBool());
// Info
configFile.setUpdateChannel(settings->value(ConfigFile::updateChannelC, configFile.currentUpdateChannel()).toString());
auto previousAppName = settings->contains(ConfigFile::legacyAppName) ? ConfigFile::legacyAppName
: ConfigFile::unbrandedAppName;
const auto updaterGroupName = QString("%1/%2").arg(previousAppName, ConfigFile::autoUpdateCheckC);
configFile.setAutoUpdateCheck(settings->value(updaterGroupName, configFile.autoUpdateCheck()).toBool(), {});
// Network
ClientProxy().saveProxyConfigurationFromSettings(*settings);
configFile.setUseUploadLimit(settings->value(ConfigFile::useUploadLimitC, configFile.useUploadLimit()).toInt());
configFile.setUploadLimit(settings->value(ConfigFile::uploadLimitC, configFile.uploadLimit()).toInt());
configFile.setUseDownloadLimit(settings->value(ConfigFile::useDownloadLimitC, configFile.useDownloadLimit()).toInt());
configFile.setDownloadLimit(settings->value(ConfigFile::downloadLimitC, configFile.downloadLimit()).toInt());

// Try to load the single account.
configFile.setMigrationPhase(ConfigFile::MigrationPhase::SetupUsers);
if (!settings->childKeys().isEmpty()) {
settings->beginGroup(accountsC);
const auto childGroups = selectedAccountIds.isEmpty() ? settings->childGroups() : selectedAccountIds;
Expand Down Expand Up @@ -582,13 +610,33 @@
}
acc->_settingsMap.insert(key, settings.value(key));
}

acc->setCredentials(CredentialsFactory::create(authType));
acc->setProxyType(settings.value(networkProxyTypeC).value<QNetworkProxy::ProxyType>());
acc->setProxyHostName(settings.value(networkProxyHostNameC).toString());
acc->setProxyPort(settings.value(networkProxyPortC).toInt());
acc->setProxyNeedsAuth(settings.value(networkProxyNeedsAuthC).toBool());
acc->setProxyUser(settings.value(networkProxyUserC).toString());

{
auto accountProxyType = settings.value(networkProxyTypeC).value<QNetworkProxy::ProxyType>();
auto accountProxyHost = settings.value(networkProxyHostNameC).toString();
auto accountProxyPort = settings.value(networkProxyPortC).toInt();
auto accountProxyNeedsAuth = settings.value(networkProxyNeedsAuthC).toBool();
auto accountProxyUser = settings.value(networkProxyUserC).toString();
const auto globalProxyType = settings.value(ClientProxy::proxyTypeC).value<QNetworkProxy::ProxyType>();
qCDebug(lcAccountManager) << "Account proxy type:" << accountProxyType;
qCDebug(lcAccountManager) << "Global proxy type:" << globalProxyType;
if (accountProxyType == QNetworkProxy::NoProxy && globalProxyType != QNetworkProxy::NoProxy) {
accountProxyType = globalProxyType;
accountProxyHost = settings.value(ClientProxy::proxyHostC).toString();
accountProxyPort = settings.value(ClientProxy::proxyPortC).toInt();
accountProxyNeedsAuth = settings.value(ClientProxy::proxyNeedsAuthC).toBool();
accountProxyUser = settings.value(ClientProxy::proxyUserC).toString();
qCInfo(lcAccountManager) << "Account has no proxy set, using global proxy instead.";
}

acc->setProxyType(accountProxyType);
acc->setProxyHostName(accountProxyHost);
acc->setProxyPort(accountProxyPort);
acc->setProxyNeedsAuth(accountProxyNeedsAuth);
acc->setProxyUser(accountProxyUser);
}

acc->setUploadLimitSetting(
settings.value(
networkUploadLimitSettingC,
Expand All @@ -599,7 +647,6 @@
networkDownloadLimitSettingC,
QVariant::fromValue(Account::AccountNetworkTransferLimitSetting::NoLimit)
).value<Account::AccountNetworkTransferLimitSetting>());

acc->setUploadLimit(settings.value(networkUploadLimitC).toInt());
acc->setDownloadLimit(settings.value(networkDownloadLimitC).toInt());

Expand Down Expand Up @@ -786,7 +833,7 @@

bool AccountManager::forceLegacyImport() const
{
return _forceLegacyImport;
return _forceLegacyImport;
}

void AccountManager::setForceLegacyImport(const bool forceLegacyImport)
Expand Down
11 changes: 10 additions & 1 deletion src/gui/accountstate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,12 @@
// make little sense, we might be missing client certs.
if (!account()->credentials()->wasFetched()) {
_waitingForNewCredentials = true;
account()->credentials()->fetchFromKeychain();
ConfigFile configFile;

Check warning on line 299 in src/gui/accountstate.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/accountstate.cpp:299:20 [cppcoreguidelines-init-variables]

variable 'configFile' is not initialized
const auto shouldTryUnbrandedToBrandedMigration = configFile.shouldTryUnbrandedToBrandedMigration();
qCDebug(lcAccountState) << "shouldTryUnbrandedToBrandedMigration?" << shouldTryUnbrandedToBrandedMigration;
qCDebug(lcAccountState) << "migrationPhase?" << configFile.migrationPhase();
const auto appName = shouldTryUnbrandedToBrandedMigration ? configFile.unbrandedAppName : "";
account()->credentials()->fetchFromKeychain(appName);
return;
}

Expand Down Expand Up @@ -492,6 +497,10 @@
qCInfo(lcAccountState) << "Fetched credentials for" << _account->url().toString()
<< "attempting to connect";
_waitingForNewCredentials = false;
ConfigFile configFile;

Check warning on line 500 in src/gui/accountstate.cpp

View workflow job for this annotation

GitHub Actions / build

src/gui/accountstate.cpp:500:16 [cppcoreguidelines-init-variables]

variable 'configFile' is not initialized
if (configFile.isMigrationInProgress()) {
configFile.setMigrationPhase(ConfigFile::MigrationPhase::Done);
}
checkConnectivity();
}

Expand Down
29 changes: 17 additions & 12 deletions src/gui/application.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014 ownCloud GmbH
Expand Down Expand Up @@ -119,19 +119,22 @@

bool Application::configVersionMigration()
{
ConfigFile configFile;
const auto shouldTryToMigrate = configFile.shouldTryToMigrate();
if (!shouldTryToMigrate) {
qCInfo(lcApplication) << "This is not an upgrade/downgrade/migration. Proceed to read current application config file.";
configFile.setMigrationPhase(ConfigFile::MigrationPhase::Done);
return false;
}

configFile.setMigrationPhase(ConfigFile::MigrationPhase::SetupConfigFile);
QStringList deleteKeys, ignoreKeys;
AccountManager::backwardMigrationSettingsKeys(&deleteKeys, &ignoreKeys);
FolderMan::backwardMigrationSettingsKeys(&deleteKeys, &ignoreKeys);

ConfigFile configFile;

// Did the client version change?
// (The client version is adjusted further down)
const auto currentVersion = QVersionNumber::fromString(MIRALL_VERSION_STRING);
const auto previousVersion = QVersionNumber::fromString(configFile.clientVersionString());
const auto versionChanged = previousVersion != currentVersion;
const auto downgrading = previousVersion > currentVersion;

configFile.setClientPreviousVersionString(configFile.clientVersionString());

qCDebug(lcApplication) << "Migration is in progress:" << configFile.isMigrationInProgress();
const auto versionChanged = configFile.isUpgrade() || configFile.isDowngrade();
if (versionChanged) {
qCInfo(lcApplication) << "Version changed. Removing updater settings from config.";
configFile.cleanUpdaterConfiguration();
Expand Down Expand Up @@ -177,7 +180,7 @@
"Continuing will mean <b>%2 these settings</b>.<br>"
"<br>"
"The current configuration file was already backed up to <i>%3</i>.")
.arg((downgrading ? tr("newer", "newer software version") : tr("older", "older software version")),
.arg((configFile.isDowngrade() ? tr("newer", "newer software version") : tr("older", "older software version")),
deleteKeys.isEmpty()? tr("ignoring") : tr("deleting"),
backupFilesList.join("<br>")));
box.addButton(tr("Quit"), QMessageBox::AcceptRole);
Expand Down Expand Up @@ -484,7 +487,8 @@
void Application::setupAccountsAndFolders()
{
_folderManager.reset(new FolderMan);

ConfigFile configFile;
configFile.setMigrationPhase(ConfigFile::MigrationPhase::SetupUsers);
const auto accountsRestoreResult = restoreLegacyAccount();
const auto accounts = AccountManager::instance()->accounts();
if (accountsRestoreResult != AccountManager::AccountsRestoreSuccessFromLegacyVersion
Expand All @@ -496,6 +500,7 @@
return;
}

configFile.setMigrationPhase(ConfigFile::MigrationPhase::SetupFolders);
const auto foldersListSize = FolderMan::instance()->setupFolders();
FolderMan::instance()->setSyncEnabled(true);

Expand Down
13 changes: 9 additions & 4 deletions src/gui/creds/webflowcredentials.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
Expand Down Expand Up @@ -132,8 +132,9 @@
return _ready;
}

void WebFlowCredentials::fetchFromKeychain() {
void WebFlowCredentials::fetchFromKeychain(const QString &appName) {
_wasFetched = true;
_appName = appName;

// Make sure we get the user from the config file
fetchUser();
Expand Down Expand Up @@ -223,7 +224,6 @@
}

_account->setCredentialSetting(userC, _user);
emit _account->wantsAccountSaved(_account->sharedFromThis());

// write cert if there is one
if (!_clientSslCertificate.isNull()) {
Expand Down Expand Up @@ -361,7 +361,7 @@

_account->deleteAppPassword();

const auto kck = keychainKey(_account->url().toString(), _user, _account->id());
const auto kck = keychainKey(_account->url().toString(), _user, _account->id(), _appName);
if (kck.isEmpty()) {
qCWarning(lcWebFlowCredentials()) << "InvalidateToken: User is empty, bailing out!";
return;
Expand Down Expand Up @@ -424,6 +424,7 @@
_user + clientCertificatePEMC,
_keychainMigration,
this);
job->setAppName(_appName);
connect(job, &KeychainChunk::ReadJob::finished, this, &WebFlowCredentials::slotReadClientCertPEMJobDone);
job->start();
}
Expand All @@ -443,6 +444,7 @@
_user + clientKeyPEMC,
_keychainMigration,
this);
job->setAppName(_appName);
connect(job, &KeychainChunk::ReadJob::finished, this, &WebFlowCredentials::slotReadClientKeyPEMJobDone);
job->start();
}
Expand Down Expand Up @@ -483,6 +485,7 @@
_user + clientCaCertificatePEMC + QString::number(_clientSslCaCertificates.count()),
_keychainMigration,
this);
job->setAppName(_appName);
connect(job, &KeychainChunk::ReadJob::finished, this, &WebFlowCredentials::slotReadClientCaCertsPEMJobDone);
job->start();
} else {
Expand Down Expand Up @@ -516,7 +519,8 @@
const QString kck = keychainKey(
_account->url().toString(),
_user,
_keychainMigration ? QString() : _account->id());
_keychainMigration ? QString() : _account->id(),
_appName);

auto job = new ReadPasswordJob(Theme::instance()->appName(), this);
#if defined(KEYCHAINCHUNK_ENABLE_INSECURE_FALLBACK)
Expand Down Expand Up @@ -547,6 +551,7 @@
_password = job->textData();
_ready = true;
_credentialsValid = true;
persist();
} else {
_ready = false;
}
Expand Down
3 changes: 2 additions & 1 deletion src/gui/creds/webflowcredentials.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#ifndef WEBFLOWCREDENTIALS_H
#define WEBFLOWCREDENTIALS_H

#include <QSslCertificate>

Check failure on line 9 in src/gui/creds/webflowcredentials.h

View workflow job for this annotation

GitHub Actions / build

src/gui/creds/webflowcredentials.h:9:10 [clang-diagnostic-error]

'QSslCertificate' file not found
#include <QSslKey>
#include <QNetworkRequest>
#include <QQueue>
Expand Down Expand Up @@ -55,7 +55,7 @@

[[nodiscard]] bool ready() const override;

void fetchFromKeychain() override;
void fetchFromKeychain(const QString &appName = {}) override;
void askFromUser() override;

bool stillValid(QNetworkReply *reply) override;
Expand Down Expand Up @@ -127,6 +127,7 @@
bool _ready = false;
bool _credentialsValid = false;
bool _keychainMigration = false;
QString _appName;

WebFlowCredentialsDialog *_askDialog = nullptr;
};
Expand Down
1 change: 1 addition & 0 deletions src/gui/generalsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,7 @@ void GeneralSettings::slotToggleOptionalServerNotifications(bool enable)
cfgFile.setOptionalServerNotifications(enable);
_ui->chatNotificationsCheckBox->setEnabled(enable);
_ui->callNotificationsCheckBox->setEnabled(enable);
_ui->quotaWarningNotificationsCheckBox->setEnabled(enable);
}

void GeneralSettings::slotToggleChatNotifications(bool enable)
Expand Down
Loading
Loading