if(_wroteAppPassword)
return;
+ // Fix: Password got written from Account Wizard, before finish.
+ // Only write the app password for a connected account, else
+ // there'll be a zombie keychain slot forever, never used again ;p
+ //
+ // Also don't write empty passwords (Log out -> Relaunch)
+ if(id().isEmpty() || appPassword.isEmpty())
+ return;
+
const QString kck = AbstractCredentials::keychainKey(
url().toString(),
davUser() + app_password,
job->setInsecureFallback(false);
job->setKey(kck);
job->setBinaryData(appPassword.toLatin1());
- connect(job, &WritePasswordJob::finished, [this](Job *) {
- qCInfo(lcAccount) << "appPassword stored in keychain";
-
+ connect(job, &WritePasswordJob::finished, [this](Job *incoming) {
+ WritePasswordJob *writeJob = static_cast<WritePasswordJob *>(incoming);
+ if (writeJob->error() == NoError)
+ qCInfo(lcAccount) << "appPassword stored in keychain";
+ else
+ qCWarning(lcAccount) << "Unable to store appPassword in keychain" << writeJob->errorString();
+
+ // We don't try this again on error, to not raise CPU consumption
_wroteAppPassword = true;
});
job->start();
DeletePasswordJob *job = new DeletePasswordJob(Theme::instance()->appName());
job->setInsecureFallback(false);
job->setKey(kck);
+ connect(job, &DeletePasswordJob::finished, [this](Job *incoming) {
+ DeletePasswordJob *deleteJob = static_cast<DeletePasswordJob *>(incoming);
+ if (deleteJob->error() == NoError)
+ qCInfo(lcAccount) << "appPassword deleted from keychain";
+ else
+ qCWarning(lcAccount) << "Unable to delete appPassword from keychain" << deleteJob->errorString();
+
+ // Allow storing a new app password on re-login
+ _wroteAppPassword = false;
+ });
job->start();
}