From 17541ba318389a78ef87a662396c99107b744842 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 22 Mar 2023 14:50:48 +0100 Subject: [PATCH 1/6] Use AccountPtr in pushNotificationsReady signal in Account rather than raw pointer Signed-off-by: Claudio Cambra --- src/gui/folderman.cpp | 10 +++++----- src/gui/folderman.h | 4 ++-- src/libsync/account.cpp | 2 +- src/libsync/account.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 2f08c40a2f29c..48d35ff0025a1 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -933,7 +933,7 @@ void FolderMan::slotStartScheduledFolderSync() } } -bool FolderMan::pushNotificationsFilesReady(Account *account) +bool FolderMan::pushNotificationsFilesReady(const AccountPtr &account) { const auto pushNotifications = account->pushNotifications(); const auto pushFilesAvailable = account->capabilities().availablePushNotifications() & PushNotificationType::Files; @@ -967,7 +967,7 @@ void FolderMan::slotEtagPollTimerTimeout() // Some folders need not to be checked because they use the push notifications std::copy_if(folderMapValues.begin(), folderMapValues.end(), std::back_inserter(foldersToRun), [this](Folder *folder) -> bool { const auto account = folder->accountState()->account(); - return !pushNotificationsFilesReady(account.data()); + return !pushNotificationsFilesReady(account); }); qCInfo(lcFolderMan) << "Number of folders that don't use push notifications:" << foldersToRun.size(); @@ -1009,7 +1009,7 @@ void FolderMan::runEtagJobIfPossible(Folder *folder) return; } // When not using push notifications, make sure polltime is reached - if (!pushNotificationsFilesReady(folder->accountState()->account().data())) { + if (!pushNotificationsFilesReady(folder->accountState()->account())) { if (folder->msecSinceLastSync() < polltime) { qCInfo(lcFolderMan) << "Can not run etag job: Polltime not reached"; return; @@ -1997,7 +1997,7 @@ void FolderMan::slotSetupPushNotifications(const Folder::Map &folderMap) // See if the account already provides the PushNotifications object and if yes connect to it. // If we can't connect at this point, the signals will be connected in slotPushNotificationsReady() // after the PushNotification object emitted the ready signal - slotConnectToPushNotifications(account.data()); + slotConnectToPushNotifications(account); connect(account.data(), &Account::pushNotificationsReady, this, &FolderMan::slotConnectToPushNotifications, Qt::UniqueConnection); } } @@ -2017,7 +2017,7 @@ void FolderMan::slotProcessFilesPushNotification(Account *account) } } -void FolderMan::slotConnectToPushNotifications(Account *account) +void FolderMan::slotConnectToPushNotifications(const AccountPtr &account) { const auto pushNotifications = account->pushNotifications(); diff --git a/src/gui/folderman.h b/src/gui/folderman.h index ef892a57473e5..4668a27f8f4a4 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -326,7 +326,7 @@ private slots: void slotSetupPushNotifications(const OCC::Folder::Map &); void slotProcessFilesPushNotification(OCC::Account *account); - void slotConnectToPushNotifications(OCC::Account *account); + void slotConnectToPushNotifications(const OCC::AccountPtr &account); void slotLeaveShare(const QString &localFile, const QByteArray &folderToken = {}); @@ -358,7 +358,7 @@ private slots: void runEtagJobsIfPossible(const QList &folderMap); void runEtagJobIfPossible(Folder *folder); - bool pushNotificationsFilesReady(Account *account); + bool pushNotificationsFilesReady(const OCC::AccountPtr &account); [[nodiscard]] bool isSwitchToVfsNeeded(const FolderDefinition &folderDefinition) const; diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index df4030de8c64d..ba7b9ea7c95ff 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -318,7 +318,7 @@ void Account::trySetupPushNotifications() connect(_pushNotifications, &PushNotifications::ready, this, [this]() { _pushNotificationsReconnectTimer.stop(); - emit pushNotificationsReady(this); + emit pushNotificationsReady(sharedFromThis()); }); const auto disablePushNotifications = [this]() { diff --git a/src/libsync/account.h b/src/libsync/account.h index 6333164add153..9f94d23931e9c 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -444,7 +444,7 @@ public slots: /// Used in RemoteWipe void appPasswordRetrieved(QString); - void pushNotificationsReady(OCC::Account *account); + void pushNotificationsReady(const OCC::AccountPtr &account); void pushNotificationsDisabled(OCC::Account *account); void userStatusChanged(); From 6cd7434829c050615a9a6a2fa230bcab14bc3ce6 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 22 Mar 2023 14:53:06 +0100 Subject: [PATCH 2/6] Emit AccountPtr from pushNotificationsDisabled in Account rather than raw pointer Signed-off-by: Claudio Cambra --- src/libsync/account.cpp | 2 +- src/libsync/account.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index ba7b9ea7c95ff..b3468f191b9e2 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -327,7 +327,7 @@ void Account::trySetupPushNotifications() return; } if (!_pushNotifications->isReady()) { - emit pushNotificationsDisabled(this); + emit pushNotificationsDisabled(sharedFromThis()); } if (!_pushNotificationsReconnectTimer.isActive()) { _pushNotificationsReconnectTimer.start(); diff --git a/src/libsync/account.h b/src/libsync/account.h index 9f94d23931e9c..ea224746c2d88 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -445,7 +445,7 @@ public slots: void appPasswordRetrieved(QString); void pushNotificationsReady(const OCC::AccountPtr &account); - void pushNotificationsDisabled(OCC::Account *account); + void pushNotificationsDisabled(const OCC::AccountPtr &account); void userStatusChanged(); From 351701f3d1c3486fcd37086efe5183504740c3e9 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 22 Mar 2023 15:26:18 +0100 Subject: [PATCH 3/6] Replace use of raw pointer in wantsAccountSaved signal with AccountPtr Signed-off-by: Claudio Cambra --- src/gui/accountmanager.cpp | 12 ++++++------ src/gui/accountmanager.h | 4 ++-- src/gui/connectionvalidator.cpp | 2 +- src/gui/creds/webflowcredentials.cpp | 2 +- src/libsync/account.cpp | 6 +++--- src/libsync/account.h | 2 +- src/libsync/creds/httpcredentials.cpp | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/gui/accountmanager.cpp b/src/gui/accountmanager.cpp index 0c86f16a05fc3..b8c0ffc17956e 100644 --- a/src/gui/accountmanager.cpp +++ b/src/gui/accountmanager.cpp @@ -297,7 +297,7 @@ void AccountManager::save(bool saveCredentials) settings->setValue(QLatin1String(versionC), maxAccountsVersion); for (const auto &acc : qAsConst(_accounts)) { settings->beginGroup(acc->account()->id()); - saveAccountHelper(acc->account().data(), *settings, saveCredentials); + saveAccountHelper(acc->account(), *settings, saveCredentials); settings->endGroup(); } @@ -305,12 +305,12 @@ void AccountManager::save(bool saveCredentials) qCInfo(lcAccountManager) << "Saved all account settings, status:" << settings->status(); } -void AccountManager::saveAccount(Account *a) +void AccountManager::saveAccount(const AccountPtr &account) { - qCDebug(lcAccountManager) << "Saving account" << a->url().toString(); + qCDebug(lcAccountManager) << "Saving account" << account->url().toString(); const auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC)); - settings->beginGroup(a->id()); - saveAccountHelper(a, *settings, false); // don't save credentials they might not have been loaded yet + settings->beginGroup(account->id()); + saveAccountHelper(account, *settings, false); // don't save credentials they might not have been loaded yet settings->endGroup(); settings->sync(); @@ -328,7 +328,7 @@ void AccountManager::saveAccountState(AccountState *a) qCDebug(lcAccountManager) << "Saved account state settings, status:" << settings->status(); } -void AccountManager::saveAccountHelper(Account *acc, QSettings &settings, bool saveCredentials) +void AccountManager::saveAccountHelper(const AccountPtr &acc, QSettings &settings, bool saveCredentials) { qCDebug(lcAccountManager) << "Saving settings to" << settings.fileName(); settings.setValue(QLatin1String(versionC), maxAccountVersion); diff --git a/src/gui/accountmanager.h b/src/gui/accountmanager.h index 85a244ced4fb5..e9426de74f608 100644 --- a/src/gui/accountmanager.h +++ b/src/gui/accountmanager.h @@ -92,7 +92,7 @@ class AccountManager : public QObject public slots: /// Saves account data, not including the credentials - void saveAccount(OCC::Account *a); + void saveAccount(const OCC::AccountPtr &account); /// Saves account state data, not including the account void saveAccountState(OCC::AccountState *a); @@ -118,7 +118,7 @@ public slots: private: // saving and loading Account to settings - void saveAccountHelper(Account *account, QSettings &settings, bool saveCredentials = true); + void saveAccountHelper(const AccountPtr &account, QSettings &settings, bool saveCredentials = true); AccountPtr loadAccountHelper(QSettings &settings); bool restoreFromLegacySettings(); diff --git a/src/gui/connectionvalidator.cpp b/src/gui/connectionvalidator.cpp index 75cb21762fcb0..2668b6f8d32e7 100644 --- a/src/gui/connectionvalidator.cpp +++ b/src/gui/connectionvalidator.cpp @@ -138,7 +138,7 @@ void ConnectionValidator::slotStatusFound(const QUrl &url, const QJsonObject &in if (_account->url() != url) { qCInfo(lcConnectionValidator()) << "status.php was redirected to" << url.toString(); _account->setUrl(url); - emit _account->wantsAccountSaved(_account.data()); + emit _account->wantsAccountSaved(_account); } if (!serverVersion.isEmpty() && !setAndCheckServerVersion(serverVersion)) { diff --git a/src/gui/creds/webflowcredentials.cpp b/src/gui/creds/webflowcredentials.cpp index 0495d3b888a2e..432f297ae04ac 100644 --- a/src/gui/creds/webflowcredentials.cpp +++ b/src/gui/creds/webflowcredentials.cpp @@ -217,7 +217,7 @@ void WebFlowCredentials::persist() { } _account->setCredentialSetting(userC, _user); - emit _account->wantsAccountSaved(_account); + emit _account->wantsAccountSaved(_account->sharedFromThis()); // write cert if there is one if (!_clientSslCertificate.isNull()) { diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index b3468f191b9e2..78b26f1a42d79 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -138,7 +138,7 @@ void Account::setDavUser(const QString &newDavUser) if (_davUser == newDavUser) return; _davUser = newDavUser; - emit wantsAccountSaved(this); + emit wantsAccountSaved(sharedFromThis()); emit prettyNameChanged(); } @@ -595,7 +595,7 @@ void Account::slotHandleSslErrors(QNetworkReply *reply, QList errors) if (!approvedCerts.isEmpty()) { QSslConfiguration::defaultConfiguration().addCaCertificates(approvedCerts); addApprovedCerts(approvedCerts); - emit wantsAccountSaved(this); + emit wantsAccountSaved(sharedFromThis()); // all ssl certs are known and accepted. We can ignore the problems right away. qCInfo(lcAccount) << out << "Certs are known and trusted! This is not an actual error."; @@ -723,7 +723,7 @@ bool Account::shouldSkipE2eeMetadataChecksumValidation() const void Account::resetShouldSkipE2eeMetadataChecksumValidation() { _skipE2eeMetadataChecksumValidation = false; - emit wantsAccountSaved(this); + emit wantsAccountSaved(sharedFromThis()); } int Account::serverVersionInt() const diff --git a/src/libsync/account.h b/src/libsync/account.h index ea224746c2d88..d43e380916376 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -432,7 +432,7 @@ public slots: void proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *); // e.g. when the approved SSL certificates changed - void wantsAccountSaved(OCC::Account *acc); + void wantsAccountSaved(const OCC::AccountPtr &acc); void serverVersionChanged(OCC::Account *account, const QString &newVersion, const QString &oldVersion); diff --git a/src/libsync/creds/httpcredentials.cpp b/src/libsync/creds/httpcredentials.cpp index ef1c4c5e8f7a8..2480cb9236f06 100644 --- a/src/libsync/creds/httpcredentials.cpp +++ b/src/libsync/creds/httpcredentials.cpp @@ -434,7 +434,7 @@ void HttpCredentials::persist() // it's just written if it gets passed into the constructor. _account->setCredentialSetting(QLatin1String(clientCertBundleC), _clientCertBundle); } - emit _account->wantsAccountSaved(_account); + emit _account->wantsAccountSaved(_account->sharedFromThis()); // write secrets to the keychain if (!_clientCertBundle.isEmpty()) { From e4efc6bbb1d5b98860afa1c7beb6c663dd833e29 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 22 Mar 2023 15:27:17 +0100 Subject: [PATCH 4/6] Use AccountPtr in serverVersionChanged signal instead of raw pointer Signed-off-by: Claudio Cambra --- src/gui/application.cpp | 2 +- src/gui/folderman.cpp | 2 +- src/gui/folderman.h | 2 +- src/gui/owncloudgui.cpp | 6 +++--- src/gui/owncloudgui.h | 6 +++--- src/libsync/account.cpp | 2 +- src/libsync/account.h | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/gui/application.cpp b/src/gui/application.cpp index fb34647618350..1b52387ffa670 100644 --- a/src/gui/application.cpp +++ b/src/gui/application.cpp @@ -621,7 +621,7 @@ void Application::slotAccountStateAdded(AccountState *accountState) connect(accountState->account().data(), &Account::serverVersionChanged, _folderManager.data(), &FolderMan::slotServerVersionChanged); - _gui->slotTrayMessageIfServerUnsupported(accountState->account().data()); + _gui->slotTrayMessageIfServerUnsupported(accountState->account()); } void Application::slotCleanup() diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 48d35ff0025a1..a46e4d688223f 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -1057,7 +1057,7 @@ void FolderMan::slotForwardFolderSyncStateChange() } } -void FolderMan::slotServerVersionChanged(Account *account) +void FolderMan::slotServerVersionChanged(const OCC::AccountPtr &account) { // Pause folders if the server version is unsupported if (account->serverVersionUnsupported()) { diff --git a/src/gui/folderman.h b/src/gui/folderman.h index 4668a27f8f4a4..203c393efea20 100644 --- a/src/gui/folderman.h +++ b/src/gui/folderman.h @@ -306,7 +306,7 @@ private slots: // FolderMan::folderSyncStateChange(Folder*) signal. void slotForwardFolderSyncStateChange(); - void slotServerVersionChanged(OCC::Account *account); + void slotServerVersionChanged(const OCC::AccountPtr &account); /** * A file whose locks were being monitored has become unlocked. diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 52536d77add50..94555253b0531 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -273,7 +273,7 @@ void ownCloudGui::slotAccountStateChanged() slotComputeOverallSyncStatus(); } -void ownCloudGui::slotTrayMessageIfServerUnsupported(Account *account) +void ownCloudGui::slotTrayMessageIfServerUnsupported(const AccountPtr &account) { if (account->serverVersionUnsupported()) { slotShowTrayMessage( @@ -285,8 +285,8 @@ void ownCloudGui::slotTrayMessageIfServerUnsupported(Account *account) } } -void ownCloudGui::slotNeedToAcceptTermsOfService(OCC::AccountPtr account, - AccountState::State state) +void ownCloudGui::slotNeedToAcceptTermsOfService(const OCC::AccountPtr &account, + const OCC::AccountState::State state) { if (state == AccountState::NeedToSignTermsOfService) { slotShowTrayMessage( diff --git a/src/gui/owncloudgui.h b/src/gui/owncloudgui.h index 2370d9d3f5614..abcb139fcc323 100644 --- a/src/gui/owncloudgui.h +++ b/src/gui/owncloudgui.h @@ -93,9 +93,9 @@ public slots: void slotHelp(); void slotOpenPath(const QString &path); void slotAccountStateChanged(); - void slotTrayMessageIfServerUnsupported(OCC::Account *account); - void slotNeedToAcceptTermsOfService(OCC::AccountPtr account, - OCC::AccountState::State state); + void slotTrayMessageIfServerUnsupported(const OCC::AccountPtr &account); + void slotNeedToAcceptTermsOfService(const OCC::AccountPtr &account, + const OCC::AccountState::State state); /** * Open a share dialog for a file or folder. diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 78b26f1a42d79..46bd539a99730 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -790,7 +790,7 @@ void Account::setServerVersion(const QString &version) auto oldServerVersion = _serverVersion; _serverVersion = version; - emit serverVersionChanged(this, oldServerVersion, version); + emit serverVersionChanged(sharedFromThis(), oldServerVersion, version); } void Account::writeAppPasswordOnce(QString appPassword){ diff --git a/src/libsync/account.h b/src/libsync/account.h index d43e380916376..cc34279d7859a 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -434,7 +434,7 @@ public slots: // e.g. when the approved SSL certificates changed void wantsAccountSaved(const OCC::AccountPtr &acc); - void serverVersionChanged(OCC::Account *account, const QString &newVersion, const QString &oldVersion); + void serverVersionChanged(const OCC::AccountPtr &account, const QString &newVersion, const QString &oldVersion); void accountChangedAvatar(); void accountChangedDisplayName(); From 26dbe9b0fadcb191d9c2ccdbaa638971bd9e1808 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 23 Mar 2023 17:47:41 +0100 Subject: [PATCH 5/6] Use AccountPtr in testpushnotifications Signed-off-by: Claudio Cambra --- test/testpushnotifications.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/testpushnotifications.cpp b/test/testpushnotifications.cpp index ee7e0c4fcc56f..e8a2ab08cf120 100644 --- a/test/testpushnotifications.cpp +++ b/test/testpushnotifications.cpp @@ -257,8 +257,8 @@ private slots: QCOMPARE(connectionLostSpy.count(), 1); - auto accountSent = pushNotificationsDisabledSpy.at(0).at(0).value(); - QCOMPARE(accountSent, account.data()); + const auto accountSent = pushNotificationsDisabledSpy.at(0).at(0).value(); + QCOMPARE(accountSent.data(), account.data()); } void testAccount_web_socket_authenticationFailed_emitNotificationsDisabled() @@ -272,8 +272,8 @@ private slots: // Now the pushNotificationsDisabled Signal should be emitted QCOMPARE(pushNotificationsDisabledSpy.count(), 1); - auto accountSent = pushNotificationsDisabledSpy.at(0).at(0).value(); - QCOMPARE(accountSent, account.data()); + const auto accountSent = pushNotificationsDisabledSpy.at(0).at(0).value(); + QCOMPARE(accountSent.data(), account.data()); } void testPingTimeout_pingTimedOut_reconnect() From 7bdd45314d7c866bee49e0f5969afe926d7eb0d7 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 17 Oct 2024 11:32:35 +0800 Subject: [PATCH 6/6] Fix use of saveAccount in networksettings Signed-off-by: Claudio Cambra --- src/gui/networksettings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/networksettings.cpp b/src/gui/networksettings.cpp index c0f60b7bb1f37..60eacf479f37e 100644 --- a/src/gui/networksettings.cpp +++ b/src/gui/networksettings.cpp @@ -222,7 +222,7 @@ void NetworkSettings::saveProxySettings() _account->setProxySettings(proxySetting, proxyType, host, port, needsAuth, user, password); const auto accountState = AccountManager::instance()->accountFromUserId(_account->userIdAtHostWithPort()); accountState->freshConnectionAttempt(); - AccountManager::instance()->saveAccount(_account.data()); + AccountManager::instance()->saveAccount(_account); } else { ConfigFile().setProxyType(proxyType, host, port, needsAuth, user, password); ClientProxy proxy; @@ -275,7 +275,7 @@ void NetworkSettings::saveBWLimitSettings() _account->setDownloadLimit(downloadLimit); _account->setUploadLimitSetting(static_cast(useUploadLimit)); _account->setUploadLimit(uploadLimit); - AccountManager::instance()->saveAccount(_account.data()); + AccountManager::instance()->saveAccount(_account); } else { ConfigFile cfg; cfg.setUseDownloadLimit(useDownloadLimit);