Skip to content

Commit 4b6d659

Browse files
committed
Added accounts config version-based migration.
- added forward migration possibility to Application::configVersionMigration(); - added version abstruction for accounts and each account settings; - added version 14 to account settings: - forcly removes buggy up/down network limits(#9037). Signed-off-by: Oleksandr Khryshchuk <[email protected]>
1 parent 633ddad commit 4b6d659

File tree

4 files changed

+149
-40
lines changed

4 files changed

+149
-40
lines changed

src/gui/accountmanager.cpp

Lines changed: 88 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,6 @@ constexpr auto legacyCfgFileNameC = "owncloud.cfg";
7272
constexpr auto unbrandedRelativeConfigLocationC = "/Nextcloud/nextcloud.cfg";
7373
constexpr auto unbrandedCfgFileNameC = "nextcloud.cfg";
7474

75-
// The maximum versions that this client can read
76-
constexpr auto maxAccountsVersion = 13;
77-
constexpr auto maxAccountVersion = 13;
78-
7975
constexpr auto serverHasValidSubscriptionC = "serverHasValidSubscription";
8076

8177
constexpr auto generalC = "General";
@@ -84,6 +80,17 @@ constexpr auto generalC = "General";
8480

8581
namespace OCC {
8682

83+
namespace {
84+
template<typename VersionType>
85+
inline VersionType VersionFromSetting(QSettings *settings) {
86+
return settings->value(QLatin1String(versionC), int(VersionType::Min)).value<VersionType>();
87+
}
88+
template<typename VersionType>
89+
inline void VersionToSetting(QSettings *settings, VersionType version) {
90+
settings->setValue(QLatin1String(versionC), int(version));
91+
}
92+
}
93+
8794
Q_LOGGING_CATEGORY(lcAccountManager, "nextcloud.gui.account.manager", QtInfoMsg)
8895

8996
AccountManager *AccountManager::instance()
@@ -149,35 +156,50 @@ AccountManager::AccountsRestoreResult AccountManager::restore(const bool alsoRes
149156
}
150157

151158
ConfigFile().cleanupGlobalNetworkConfiguration();
152-
ClientProxy().cleanupGlobalNetworkConfiguration();
159+
ClientProxy().cleanupGlobalNetworkConfiguration();
153160

154161
return result;
155162
}
156163

157164
void AccountManager::backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys)
158165
{
159166
const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
160-
const auto accountsVersion = settings->value(QLatin1String(versionC)).toInt();
167+
const auto accountsVersion = VersionFromSetting<AccountsVersion>(settings.get());
161168

162169
qCInfo(lcAccountManager) << "Checking for accounts versions.";
163170
qCInfo(lcAccountManager) << "Config accounts version:" << accountsVersion;
164-
qCInfo(lcAccountManager) << "Max accounts Version is set to:" << maxAccountsVersion;
165-
if (accountsVersion <= maxAccountsVersion) {
171+
qCInfo(lcAccountManager) << "Max accounts Version is set to:" << AccountsVersion::Max;
172+
if (accountsVersion <= AccountsVersion::Max) {
166173
const auto settingsChildGroups = settings->childGroups();
167174
for (const auto &accountId : settingsChildGroups) {
168175
settings->beginGroup(accountId);
169-
const auto accountVersion = settings->value(QLatin1String(versionC), 1).toInt();
176+
const auto accountVersion = VersionFromSetting<AccountVersion>(settings.get());
170177

171-
if (accountVersion > maxAccountVersion) {
178+
if (accountVersion > AccountVersion::Max) {
172179
ignoreKeys->append(settings->group());
173180
qCInfo(lcAccountManager) << "Ignoring account" << accountId << "because of version" << accountVersion;
174181
}
182+
175183
settings->endGroup();
176184
}
177185
} else {
178186
deleteKeys->append(settings->group());
179187
}
180188
}
189+
190+
void AccountManager::migrateToActualVersion()
191+
{
192+
const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
193+
194+
migrateAccountsSettings(settings);
195+
196+
for (const auto &accountId : settings->childGroups()) {
197+
settings->beginGroup(accountId);
198+
migrateAccountSettings(settings);
199+
settings->endGroup();
200+
}
201+
}
202+
181203
#if !DISABLE_ACCOUNT_MIGRATION
182204
bool AccountManager::restoreFromLegacySettings()
183205
{
@@ -317,7 +339,7 @@ bool AccountManager::restoreFromLegacySettings()
317339
moveNetworkSettingsFromGlobalToAccount(acc);
318340
}
319341
configFile.cleanupGlobalNetworkConfiguration();
320-
ClientProxy().cleanupGlobalNetworkConfiguration();
342+
ClientProxy().cleanupGlobalNetworkConfiguration();
321343
return true;
322344
}
323345

@@ -339,7 +361,9 @@ bool AccountManager::restoreFromLegacySettings()
339361
void AccountManager::save(bool saveCredentials)
340362
{
341363
const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
342-
settings->setValue(QLatin1String(versionC), maxAccountsVersion);
364+
365+
VersionToSetting(settings.get(), AccountsVersion::Max);
366+
343367
for (const auto &acc : std::as_const(_accounts)) {
344368
settings->beginGroup(acc->account()->id());
345369
saveAccountHelper(acc->account(), *settings, saveCredentials);
@@ -376,7 +400,7 @@ void AccountManager::saveAccountState(AccountState *a)
376400
void AccountManager::saveAccountHelper(const AccountPtr &account, QSettings &settings, bool saveCredentials)
377401
{
378402
qCDebug(lcAccountManager) << "Saving settings to" << settings.fileName();
379-
settings.setValue(QLatin1String(versionC), maxAccountVersion);
403+
VersionToSetting(&settings, AccountVersion::Max);
380404
if (account->isPublicShareLink()) {
381405
settings.setValue(QLatin1String(urlC), account->publicShareLinkUrl().toString());
382406
} else {
@@ -798,4 +822,55 @@ void AccountManager::setForceLegacyImport(const bool forceLegacyImport)
798822
_forceLegacyImport = forceLegacyImport;
799823
Q_EMIT forceLegacyImportChanged();
800824
}
825+
826+
void AccountManager::migrateAccountsSettings(const std::unique_ptr<QSettings> &settings)
827+
{
828+
const auto accountsVersion = VersionFromSetting<AccountsVersion>(settings.get());
829+
830+
switch (accountsVersion) {
831+
// Nothing here for now
832+
default:
833+
VersionToSetting(settings.get(), AccountsVersion::Max);
834+
break;
835+
}
836+
}
837+
838+
void AccountManager::migrateAccountSettings(const std::unique_ptr<QSettings> &settings)
839+
{
840+
const auto accountVersion = VersionFromSetting<AccountVersion>(settings.get());
841+
842+
switch (accountVersion)
843+
{
844+
// No previous statements
845+
case AccountVersion::V13: {
846+
// Related to issue #9037
847+
const auto networkLimitSettingFix = [&settings](const QString &key) {
848+
using NetworkLimitSetting = Account::AccountNetworkTransferLimitSetting;
849+
850+
const auto limitSetting = settings->value(key).value<NetworkLimitSetting>();
851+
852+
switch (limitSetting) {
853+
case NetworkLimitSetting::LegacyGlobalLimit:
854+
[[fallthrough]];
855+
case NetworkLimitSetting::AutoLimit:
856+
settings->setValue(key, int(NetworkLimitSetting::NoLimit));
857+
break;
858+
default:
859+
break;
860+
}
861+
};
862+
863+
qCInfo(lcAccountManager) << "Migrating account" << settings->group()
864+
<< "settings from version" << accountVersion
865+
<< "to" << AccountVersion::V14;
866+
867+
networkLimitSettingFix(networkDownloadLimitSettingC);
868+
networkLimitSettingFix(networkUploadLimitSettingC);
869+
} [[fallthrough]];
870+
// Tip: add new migration rules here
871+
default:
872+
VersionToSetting(settings.get(), AccountVersion::Max);
873+
break;
874+
}
875+
}
801876
}

src/gui/accountmanager.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,21 @@ class AccountManager : public QObject
3131
};
3232
Q_ENUM (AccountsRestoreResult);
3333

34+
enum class AccountsVersion {
35+
V13 = 13,
36+
Min = V13,
37+
Max = V13
38+
};
39+
Q_ENUM (AccountsVersion);
40+
41+
enum class AccountVersion {
42+
V13 = 13,
43+
V14,
44+
Min = V13,
45+
Max = V14
46+
};
47+
Q_ENUM (AccountVersion);
48+
3449
static AccountManager *instance();
3550
~AccountManager() override = default;
3651

@@ -83,6 +98,12 @@ class AccountManager : public QObject
8398
*/
8499
static void backwardMigrationSettingsKeys(QStringList *deleteKeys, QStringList *ignoreKeys);
85100

101+
/**
102+
* Checks the versions of account groups and each account individually
103+
* then attempts a soft migration.
104+
*/
105+
static void migrateToActualVersion();
106+
86107
public slots:
87108
/// Saves account data when adding user, when updating e.g. dav user, not including the credentials
88109
void saveAccount(const OCC::AccountPtr &newAccountData);
@@ -110,6 +131,9 @@ public slots:
110131
void capabilitiesChanged();
111132

112133
private:
134+
static void migrateAccountsSettings(const std::unique_ptr<QSettings> &settings);
135+
static void migrateAccountSettings(const std::unique_ptr<QSettings> &settings);
136+
113137
// saving and loading Account to settings
114138
void saveAccountHelper(const AccountPtr &account, QSettings &settings, bool saveCredentials = true);
115139
AccountPtr loadAccountHelper(QSettings &settings);

src/gui/application.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,6 @@ bool Application::configVersionMigration()
141141
return true;
142142
}
143143

144-
// 'Launch on system startup' defaults to true > 3.11.x
145-
const auto theme = Theme::instance();
146-
configFile.setLaunchOnSystemStartup(configFile.launchOnSystemStartup());
147-
Utility::setLaunchOnStartup(theme->appName(), theme->appNameGUI(), configFile.launchOnSystemStartup());
148-
149-
// default is now off to displaying dialog warning user of too many files deletion
150-
configFile.setPromptDeleteFiles(false);
151-
152144
// back up all old config files
153145
QStringList backupFilesList;
154146
QDir configDir(configFile.configPath());
@@ -190,15 +182,27 @@ bool Application::configVersionMigration()
190182
}
191183
}
192184

193-
if (!deleteKeys.isEmpty()) {
194-
auto settings = ConfigFile::settingsWithGroup("foo");
195-
settings->endGroup();
185+
if (downgrading) {
186+
// 'Launch on system startup' defaults to true > 3.11.x
187+
const auto theme = Theme::instance();
188+
configFile.setLaunchOnSystemStartup(configFile.launchOnSystemStartup());
189+
Utility::setLaunchOnStartup(theme->appName(), theme->appNameGUI(), configFile.launchOnSystemStartup());
190+
191+
// default is now off to displaying dialog warning user of too many files deletion
192+
configFile.setPromptDeleteFiles(false);
196193

197-
// Wipe confusing keys from the future, ignore the others
198-
for (const auto &badKey : std::as_const(deleteKeys)) {
199-
settings->remove(badKey);
200-
qCInfo(lcApplication) << "Migration: removed" << badKey << "key from settings.";
194+
if (!deleteKeys.isEmpty()) {
195+
auto settings = ConfigFile::settingsWithGroup("foo");
196+
settings->endGroup();
197+
198+
// Wipe confusing keys from the future, ignore the others
199+
for (const auto &badKey : std::as_const(deleteKeys)) {
200+
settings->remove(badKey);
201+
qCInfo(lcApplication) << "Migration: removed" << badKey << "key from settings.";
202+
}
201203
}
204+
} else { // upgrading
205+
AccountManager::migrateToActualVersion();
202206
}
203207

204208
configFile.setClientVersionString(MIRALL_VERSION_STRING);
@@ -323,6 +327,8 @@ Application::Application(int &argc, char **argv)
323327
// only copy the settings and check what should be skipped
324328
if (!configVersionMigration()) {
325329
qCWarning(lcApplication) << "Config version migration was not possible.";
330+
} else {
331+
AccountManager::instance()->save();
326332
}
327333

328334
ConfigFile cfg;

src/gui/networksettings.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -198,36 +198,40 @@ void NetworkSettings::saveProxySettings()
198198

199199
void NetworkSettings::saveBWLimitSettings()
200200
{
201+
using NetworkTransferLimitSetting = Account::AccountNetworkTransferLimitSetting;
202+
201203
const auto downloadLimit = _ui->downloadSpinBox->value();
202204
const auto uploadLimit = _ui->uploadSpinBox->value();
203205

204-
auto useDownloadLimit = 0;
205-
auto useUploadLimit = 0;
206+
auto useDownloadLimit = NetworkTransferLimitSetting::NoLimit;
207+
auto useUploadLimit = NetworkTransferLimitSetting::NoLimit;
206208

207209
if (_ui->downloadLimitRadioButton->isChecked()) {
208-
useDownloadLimit = 1;
210+
useDownloadLimit = NetworkTransferLimitSetting::ManualLimit;
209211
} else if (_ui->noDownloadLimitRadioButton->isChecked()) {
210-
useDownloadLimit = 0;
212+
useDownloadLimit = NetworkTransferLimitSetting::NoLimit;
211213
} else if (_ui->autoDownloadLimitRadioButton->isChecked()) {
212-
useDownloadLimit = -1;
214+
useDownloadLimit = NetworkTransferLimitSetting::AutoLimit;
213215
} else if (_account) {
214-
useDownloadLimit = -2;
216+
// Legacy global. See Account::AccountNetworkTransferLimitSetting::LegacyGlobalLimit
217+
useDownloadLimit = NetworkTransferLimitSetting::NoLimit;
215218
}
216219

217220
if (_ui->uploadLimitRadioButton->isChecked()) {
218-
useUploadLimit = 1;
221+
useUploadLimit = NetworkTransferLimitSetting::ManualLimit;
219222
} else if (_ui->noUploadLimitRadioButton->isChecked()) {
220-
useUploadLimit = 0;
223+
useUploadLimit = NetworkTransferLimitSetting::NoLimit;
221224
} else if (_ui->autoUploadLimitRadioButton->isChecked()) {
222-
useUploadLimit = -1;
225+
useUploadLimit = NetworkTransferLimitSetting::AutoLimit;
223226
} else if (_account) {
224-
useUploadLimit = -2;
227+
// Legacy global. See Account::AccountNetworkTransferLimitSetting::LegacyGlobalLimit
228+
useUploadLimit = NetworkTransferLimitSetting::NoLimit;
225229
}
226230

227231
if (_account) {
228-
_account->setDownloadLimitSetting(static_cast<Account::AccountNetworkTransferLimitSetting>(useDownloadLimit));
232+
_account->setDownloadLimitSetting(useDownloadLimit);
229233
_account->setDownloadLimit(downloadLimit);
230-
_account->setUploadLimitSetting(static_cast<Account::AccountNetworkTransferLimitSetting>(useUploadLimit));
234+
_account->setUploadLimitSetting(useUploadLimit);
231235
_account->setUploadLimit(uploadLimit);
232236
AccountManager::instance()->saveAccount(_account);
233237
}

0 commit comments

Comments
 (0)