From dcc84d35085d790a53b472d1edba663832af238a Mon Sep 17 00:00:00 2001 From: Michael Schuster Date: Fri, 29 Nov 2019 04:28:50 +0100 Subject: [PATCH] Fix remote wipe keychain storage (issue #1592) The app password for the remote wipe was constantly being written in WebFlowCredentials::slotFinished to the keychain, leading to unnecessary write and log overhead on the system. This fix introduces a check to only store the app password once in a lifetime of the Account class. Also the method used to store the password will be renamed from setAppPassword to writeAppPasswordOnce to be more expressive. Signed-off-by: Michael Schuster --- src/gui/creds/webflowcredentials.cpp | 2 +- src/libsync/account.cpp | 9 +++++++-- src/libsync/account.h | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gui/creds/webflowcredentials.cpp b/src/gui/creds/webflowcredentials.cpp index 49c80e1ff..e2dc10b35 100644 --- a/src/gui/creds/webflowcredentials.cpp +++ b/src/gui/creds/webflowcredentials.cpp @@ -420,7 +420,7 @@ void WebFlowCredentials::slotFinished(QNetworkReply *reply) { _credentialsValid = true; /// Used later for remote wipe - _account->setAppPassword(_password); + _account->writeAppPasswordOnce(_password); } } diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 32e58b2e4..33032e3f8 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -513,7 +513,10 @@ void Account::setNonShib(bool nonShib) } } -void Account::setAppPassword(QString appPassword){ +void Account::writeAppPasswordOnce(QString appPassword){ + if(_wroteAppPassword) + return; + const QString kck = AbstractCredentials::keychainKey( url().toString(), davUser() + app_password, @@ -524,8 +527,10 @@ void Account::setAppPassword(QString appPassword){ job->setInsecureFallback(false); job->setKey(kck); job->setBinaryData(appPassword.toLatin1()); - connect(job, &WritePasswordJob::finished, [](Job *) { + connect(job, &WritePasswordJob::finished, [this](Job *) { qCInfo(lcAccount) << "appPassword stored in keychain"; + + _wroteAppPassword = true; }); job->start(); } diff --git a/src/libsync/account.h b/src/libsync/account.h index 1f3e46a96..2b843dca9 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -243,7 +243,7 @@ public: /// Used in RemoteWipe void retrieveAppPassword(); - void setAppPassword(QString appPassword); + void writeAppPasswordOnce(QString appPassword); void deleteAppPassword(); public slots: @@ -319,6 +319,9 @@ private: QString _davPath; // defaults to value from theme, might be overwritten in brandings ClientSideEncryption _e2e; + /// Used in RemoteWipe + bool _wroteAppPassword = false; + friend class AccountManager; }; } -- 2.30.2