diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index a975a86ada..ffc73f0701 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -93,6 +93,13 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) : const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner"; +AccountManager::~AccountManager() { + QMutexLocker lock(&_rsaKeygenLock); + while (_rsaKeygenThread) { + _rsaKeygenWait.wait(&_rsaKeygenLock); + } +} + void AccountManager::logout() { // a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file _accountInfo = DataServerAccountInfo(); @@ -761,8 +768,9 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI this, &AccountManager::handleKeypairGenerationError); connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit); - connect(this, &QObject::destroyed, generateThread, &QThread::quit); + connect(generateThread, &QThread::finished, this, &AccountManager::rsaKeygenThreadFinished); connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); + _rsaKeygenThread = generateThread; keypairGenerator->moveToThread(generateThread); @@ -870,3 +878,9 @@ void AccountManager::handleKeypairGenerationError() { sender()->deleteLater(); } + +void AccountManager::rsaKeygenThreadFinished() { + QMutexLocker lock(&_rsaKeygenLock); + _rsaKeygenThread = nullptr; + _rsaKeygenWait.wakeAll(); +} diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 87b17d00d5..af89b67bdc 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -15,6 +15,8 @@ #include <QtCore/QByteArray> #include <QtCore/QObject> #include <QtCore/QUrl> +#include <QtCore/QMutex> +#include <QtCore/QWaitCondition> #include <QtNetwork/QNetworkReply> #include <QUrlQuery> @@ -63,6 +65,7 @@ class AccountManager : public QObject, public Dependency { Q_OBJECT public: AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER); + ~AccountManager(); Q_INVOKABLE void sendRequest(const QString& path, AccountManagerAuth::Type authType, @@ -131,6 +134,7 @@ private slots: void publicKeyUploadSucceeded(QNetworkReply& reply); void publicKeyUploadFailed(QNetworkReply& reply); void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid()); + void rsaKeygenThreadFinished(); private: AccountManager(AccountManager const& other) = delete; @@ -156,6 +160,9 @@ private: QByteArray _pendingPrivateKey; QUuid _sessionID { QUuid::createUuid() }; + QMutex _rsaKeygenLock; + QWaitCondition _rsaKeygenWait; + QThread* _rsaKeygenThread { nullptr }; }; #endif // hifi_AccountManager_h