From 8da567d9faa31731c78b33cfbd72480be0c605b2 Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Sat, 24 Aug 2024 11:21:20 +0200 Subject: [PATCH] Don't run QtKeychain job in a nested event loop Doing that causes deadlocks and there's no need for it here --- src/controller.cpp | 26 +++++++++++--------------- src/controller.h | 2 +- src/login.cpp | 4 +--- src/registration.cpp | 4 +--- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/controller.cpp b/src/controller.cpp index b235c205c..5171f0b10 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -271,23 +271,19 @@ QKeychain::ReadPasswordJob *Controller::loadAccessTokenFromKeyChain(const QStrin return job; } -bool Controller::saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken) +void Controller::saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken) { qDebug() << "Save the access token to the keychain for " << userId; - QKeychain::WritePasswordJob job(qAppName()); - job.setAutoDelete(false); - job.setKey(userId); - job.setBinaryData(accessToken); - QEventLoop loop; - QKeychain::WritePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); - job.start(); - loop.exec(); - - if (job.error()) { - qWarning() << "Could not save access token to the keychain: " << qPrintable(job.errorString()); - return false; - } - return true; + auto job = new QKeychain::WritePasswordJob(qAppName()); + job->setAutoDelete(true); + job->setKey(userId); + job->setBinaryData(accessToken); + connect(job, &QKeychain::WritePasswordJob::finished, this, [job]() { + if (job->error()) { + qWarning() << "Could not save access token to the keychain: " << qPrintable(job->errorString()); + } + }); + job->start(); } bool Controller::supportSystemTray() const diff --git a/src/controller.h b/src/controller.h index 6687c6913..f6027aac5 100644 --- a/src/controller.h +++ b/src/controller.h @@ -86,7 +86,7 @@ public: /** * @brief Save an access token to the keychain for the given account. */ - bool saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken); + void saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken); [[nodiscard]] bool supportSystemTray() const; diff --git a/src/login.cpp b/src/login.cpp index 334ef95eb..afe7ee5fa 100644 --- a/src/login.cpp +++ b/src/login.cpp @@ -78,9 +78,7 @@ void LoginHelper::init() account.setHomeserver(m_connection->homeserver()); account.setDeviceId(m_connection->deviceId()); account.setDeviceName(m_deviceName); - if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken())) { - qWarning() << "Couldn't save access token"; - } + Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken()); account.sync(); Controller::instance().addConnection(m_connection); Controller::instance().setActiveConnection(m_connection); diff --git a/src/registration.cpp b/src/registration.cpp index 759387fff..232af4693 100644 --- a/src/registration.cpp +++ b/src/registration.cpp @@ -105,9 +105,7 @@ void Registration::registerAccount() account.setHomeserver(connection->homeserver()); account.setDeviceId(connection->deviceId()); account.setDeviceName(displayName); - if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken())) { - qWarning() << "Couldn't save access token"; - } + Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken()); account.sync(); Controller::instance().addConnection(connection); Controller::instance().setActiveConnection(connection);