Forget key + cert + mnemonic on account removal

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2017-12-20 15:35:23 +01:00
parent a48a3e0acc
commit 4551bbe0e0
No known key found for this signature in database
GPG key ID: F941078878347C0C
4 changed files with 38 additions and 7 deletions

View file

@ -312,6 +312,9 @@ void AccountManager::deleteAccount(AccountState *account)
auto settings = ConfigFile::settingsWithGroup(QLatin1String(accountsC));
settings->remove(account->account()->id());
// Forget E2E keys
account->account()->e2e()->forgetSensitiveData();
emit accountRemoved(account);
}

View file

@ -234,7 +234,7 @@ public:
/// Called by network jobs on credential errors, emits invalidCredentials()
void handleInvalidCredentials();
ClientSideEncryption* e2e();
ClientSideEncryption* e2e();
public slots:
/// Used when forgetting credentials

View file

@ -51,6 +51,12 @@ QString baseUrl(){
return QStringLiteral("ocs/v2.php/apps/end_to_end_encryption/api/v1/");
}
namespace {
const char e2e_cert[] = "_e2e-certificate";
const char e2e_private[] = "_e2e-private";
const char e2e_mnemonic[] = "_e2e-mnemonic";
} // ns
namespace {
void handleErrors(void)
{
@ -629,7 +635,7 @@ void ClientSideEncryption::initialize()
void ClientSideEncryption::fetchFromKeyChain() {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-certificate",
_account->credentials()->user() + e2e_cert,
_account->id()
);
@ -662,7 +668,7 @@ void ClientSideEncryption::publicKeyFetched(Job *incoming) {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-private",
_account->credentials()->user() + e2e_private,
_account->id()
);
@ -701,7 +707,7 @@ void ClientSideEncryption::privateKeyFetched(Job *incoming) {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-mnemonic",
_account->credentials()->user() + e2e_mnemonic,
_account->id()
);
@ -734,7 +740,7 @@ void ClientSideEncryption::mnemonicKeyFetched(QKeychain::Job *incoming) {
void ClientSideEncryption::writePrivateKey() {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-private",
_account->credentials()->user() + e2e_private,
_account->id()
);
@ -752,7 +758,7 @@ void ClientSideEncryption::writePrivateKey() {
void ClientSideEncryption::writeCertificate() {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-certificate",
_account->credentials()->user() + e2e_cert,
_account->id()
);
@ -770,7 +776,7 @@ void ClientSideEncryption::writeCertificate() {
void ClientSideEncryption::writeMnemonic() {
const QString kck = AbstractCredentials::keychainKey(
_account->url().toString(),
_account->credentials()->user() + "_e2e-mnemonic",
_account->credentials()->user() + e2e_mnemonic,
_account->id()
);
@ -785,6 +791,26 @@ void ClientSideEncryption::writeMnemonic() {
job->start();
}
void ClientSideEncryption::forgetSensitiveData()
{
_privateKey = QSslKey();
_certificate = QSslCertificate();
_publicKey = QSslKey();
_mnemonic = QString();
auto startDeleteJob = [this](QString user) {
DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
job->setInsecureFallback(false);
job->setKey(AbstractCredentials::keychainKey(_account->url().toString(), user, _account->id()));
job->start();
};
auto user = _account->credentials()->user();
startDeleteJob(user + e2e_private);
startDeleteJob(user + e2e_cert);
startDeleteJob(user + e2e_mnemonic);
}
bool ClientSideEncryption::hasPrivateKey() const
{
return !_privateKey.isNull();

View file

@ -43,6 +43,8 @@ public:
bool isFolderEncrypted(const QString& path);
void setFolderEncryptedStatus(const QString& path, bool status);
void forgetSensitiveData();
private slots:
void folderEncryptedStatusFetched(const QMap<QString, bool> &values);
void folderEncryptedStatusError(int error);