Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Vogtinator:boo1204812
libkgapi
0002-Don-t-cache-promises-for-AccountManager-fi...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0002-Don-t-cache-promises-for-AccountManager-findAccount.patch of Package libkgapi
From b9b9ddc850689061b1f88744497621807dff4f43 Mon Sep 17 00:00:00 2001 From: Fabian Vogt <fabian@ritter-vogt.de> Date: Mon, 21 Nov 2022 13:02:27 +0100 Subject: [PATCH 2/2] Don't cache promises for AccountManager::findAccount Unlike AccountManager::getAccount and AccountManager::refreshTokens, this method does not return an authenticated account. However, the promises are cached for all of them in the same store, so it was possible for a call to e.g. refreshTokens to get a promise created by findAccount instead, resulting in an unexpected result. Just don't cache promises created by findAccount. --- src/core/accountmanager.cpp | 38 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/core/accountmanager.cpp b/src/core/accountmanager.cpp index da5c37b..c6b8189 100644 --- a/src/core/accountmanager.cpp +++ b/src/core/accountmanager.cpp @@ -265,30 +265,28 @@ AccountPromise *AccountManager::refreshTokens(const QString &apiKey, const QStri AccountPromise *AccountManager::findAccount(const QString &apiKey, const QString &accountName, const QList<QUrl> &scopes) { - auto promise = d->createPromise(apiKey, accountName); - if (!promise->d->isRunning()) { - QTimer::singleShot(0, this, [=]() { - d->ensureStore([=](bool storeOpened) { - if (!storeOpened) { - promise->d->setError(tr("Failed to open account store")); - return; - } + auto promise = new AccountPromise(this); + QTimer::singleShot(0, this, [=]() { + d->ensureStore([=](bool storeOpened) { + if (!storeOpened) { + promise->d->setError(tr("Failed to open account store")); + return; + } - const auto account = d->mStore->getAccount(apiKey, accountName); - if (!account) { - promise->d->setAccount({}); + const auto account = d->mStore->getAccount(apiKey, accountName); + if (!account) { + promise->d->setAccount({}); + } else { + const auto currentScopes = account->scopes(); + if (scopes.isEmpty() || d->compareScopes(currentScopes, scopes)) { + promise->d->setAccount(account); } else { - const auto currentScopes = account->scopes(); - if (scopes.isEmpty() || d->compareScopes(currentScopes, scopes)) { - promise->d->setAccount(account); - } else { - promise->d->setAccount({}); - } + promise->d->setAccount({}); } - }); + } }); - promise->d->setRunning(); - } + }); + promise->d->setRunning(); return promise; } -- 2.38.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor