Don't run QtKeychain job in a nested event loop

Doing that causes deadlocks and there's no need for it here
This commit is contained in:
Tobias Fella
2024-08-24 11:21:20 +02:00
parent d99f69cc24
commit 8da567d9fa
4 changed files with 14 additions and 22 deletions

View File

@@ -271,23 +271,19 @@ QKeychain::ReadPasswordJob *Controller::loadAccessTokenFromKeyChain(const QStrin
return job; 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; qDebug() << "Save the access token to the keychain for " << userId;
QKeychain::WritePasswordJob job(qAppName()); auto job = new QKeychain::WritePasswordJob(qAppName());
job.setAutoDelete(false); job->setAutoDelete(true);
job.setKey(userId); job->setKey(userId);
job.setBinaryData(accessToken); job->setBinaryData(accessToken);
QEventLoop loop; connect(job, &QKeychain::WritePasswordJob::finished, this, [job]() {
QKeychain::WritePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); if (job->error()) {
job.start(); qWarning() << "Could not save access token to the keychain: " << qPrintable(job->errorString());
loop.exec(); }
});
if (job.error()) { job->start();
qWarning() << "Could not save access token to the keychain: " << qPrintable(job.errorString());
return false;
}
return true;
} }
bool Controller::supportSystemTray() const bool Controller::supportSystemTray() const

View File

@@ -86,7 +86,7 @@ public:
/** /**
* @brief Save an access token to the keychain for the given account. * @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; [[nodiscard]] bool supportSystemTray() const;

View File

@@ -78,9 +78,7 @@ void LoginHelper::init()
account.setHomeserver(m_connection->homeserver()); account.setHomeserver(m_connection->homeserver());
account.setDeviceId(m_connection->deviceId()); account.setDeviceId(m_connection->deviceId());
account.setDeviceName(m_deviceName); account.setDeviceName(m_deviceName);
if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken())) { Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken());
qWarning() << "Couldn't save access token";
}
account.sync(); account.sync();
Controller::instance().addConnection(m_connection); Controller::instance().addConnection(m_connection);
Controller::instance().setActiveConnection(m_connection); Controller::instance().setActiveConnection(m_connection);

View File

@@ -105,9 +105,7 @@ void Registration::registerAccount()
account.setHomeserver(connection->homeserver()); account.setHomeserver(connection->homeserver());
account.setDeviceId(connection->deviceId()); account.setDeviceId(connection->deviceId());
account.setDeviceName(displayName); account.setDeviceName(displayName);
if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken())) { Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken());
qWarning() << "Couldn't save access token";
}
account.sync(); account.sync();
Controller::instance().addConnection(connection); Controller::instance().addConnection(connection);
Controller::instance().setActiveConnection(connection); Controller::instance().setActiveConnection(connection);