@@ -72,10 +72,6 @@ constexpr auto legacyCfgFileNameC = "owncloud.cfg";
7272constexpr auto unbrandedRelativeConfigLocationC = " /Nextcloud/nextcloud.cfg" ;
7373constexpr 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-
7975constexpr auto serverHasValidSubscriptionC = " serverHasValidSubscription" ;
8076
8177constexpr auto generalC = " General" ;
@@ -84,6 +80,17 @@ constexpr auto generalC = "General";
8480
8581namespace 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+
8794Q_LOGGING_CATEGORY (lcAccountManager, " nextcloud.gui.account.manager" , QtInfoMsg)
8895
8996AccountManager *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
157164void 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
182204bool 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()
339361void 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)
376400void 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}
0 commit comments