You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.8 KiB
153 lines
4.8 KiB
commit 33a17ba0104cd94f2e33a3ac007b300553cdb417
|
|
Author: Valentin Rusu <kde@rusu.info>
|
|
Date: Mon Feb 16 22:44:07 2015 +0100
|
|
|
|
Fix for the random wallet open failure when updating
|
|
|
|
The problem seems to be caused by the use of BackendPersistHandler
|
|
singleton when the user has several wallets on his system and not
|
|
all of them have been updated to the new schema.
|
|
|
|
BUG: 343718
|
|
|
|
diff --git a/kwalletd/backend/backendpersisthandler.cpp b/kwalletd/backend/backendpersisthandler.cpp
|
|
index 5c321c9..b7f63f8 100644
|
|
--- a/kwalletd/backend/backendpersisthandler.cpp
|
|
+++ b/kwalletd/backend/backendpersisthandler.cpp
|
|
@@ -140,25 +140,14 @@ static int getRandomBlock(QByteArray& randBlock) {
|
|
#endif
|
|
}
|
|
|
|
-
|
|
-
|
|
-static BlowfishPersistHandler *blowfishHandler =0;
|
|
-#ifdef HAVE_QGPGME
|
|
-static GpgPersistHandler *gpgHandler =0;
|
|
-#endif // HAVE_QGPGME
|
|
-
|
|
BackendPersistHandler *BackendPersistHandler::getPersistHandler(BackendCipherType cipherType)
|
|
{
|
|
switch (cipherType){
|
|
case BACKEND_CIPHER_BLOWFISH:
|
|
- if (0 == blowfishHandler)
|
|
- blowfishHandler = new BlowfishPersistHandler;
|
|
- return blowfishHandler;
|
|
+ return new BlowfishPersistHandler;
|
|
#ifdef HAVE_QGPGME
|
|
case BACKEND_CIPHER_GPG:
|
|
- if (0 == gpgHandler)
|
|
- gpgHandler = new GpgPersistHandler;
|
|
- return gpgHandler;
|
|
+ return new GpgPersistHandler;
|
|
#endif // HAVE_QGPGME
|
|
default:
|
|
Q_ASSERT(0);
|
|
@@ -170,21 +159,16 @@ BackendPersistHandler *BackendPersistHandler::getPersistHandler(char magicBuf[12
|
|
{
|
|
if ((magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB || magicBuf[2] == KWALLET_CIPHER_BLOWFISH_CBC) &&
|
|
(magicBuf[3] == KWALLET_HASH_SHA1 || magicBuf[3] == KWALLET_HASH_PBKDF2_SHA512)) {
|
|
- if (0 == blowfishHandler) {
|
|
- bool useECBforReading = magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB;
|
|
- if (useECBforReading) {
|
|
- qDebug() << "this wallet uses ECB encryption. It'll be converted to CBC on next save.";
|
|
- }
|
|
- blowfishHandler = new BlowfishPersistHandler(useECBforReading);
|
|
+ bool useECBforReading = magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB;
|
|
+ if (useECBforReading) {
|
|
+ qDebug() << "this wallet uses ECB encryption. It'll be converted to CBC on next save.";
|
|
}
|
|
- return blowfishHandler;
|
|
+ return new BlowfishPersistHandler(useECBforReading);
|
|
}
|
|
#ifdef HAVE_QGPGME
|
|
if (magicBuf[2] == KWALLET_CIPHER_GPG &&
|
|
magicBuf[3] == 0) {
|
|
- if (0 == gpgHandler)
|
|
- gpgHandler = new GpgPersistHandler;
|
|
- return gpgHandler;
|
|
+ return new GpgPersistHandler;
|
|
}
|
|
#endif // HAVE_QGPGME
|
|
return 0; // unknown cipher or hash
|
|
diff --git a/kwalletd/backend/kwalletbackend.cc b/kwalletd/backend/kwalletbackend.cc
|
|
index 7d439e3..9240103 100644
|
|
--- a/kwalletd/backend/kwalletbackend.cc
|
|
+++ b/kwalletd/backend/kwalletbackend.cc
|
|
@@ -266,7 +266,7 @@ int Backend::open(const QByteArray& password, WId w) {
|
|
if (_open) {
|
|
return -255; // already open
|
|
}
|
|
-
|
|
+
|
|
setPassword(password);
|
|
return openInternal(w);
|
|
}
|
|
@@ -287,20 +287,20 @@ int Backend::openPreHashed(const QByteArray &passwordHash)
|
|
if (_open) {
|
|
return -255; // already open
|
|
}
|
|
-
|
|
+
|
|
// check the password hash for correct size (currently fixed)
|
|
if (passwordHash.size() != 20 && passwordHash.size() != 40 &&
|
|
passwordHash.size() != 56) {
|
|
return -42; // unsupported encryption scheme
|
|
}
|
|
-
|
|
+
|
|
_passhash = passwordHash;
|
|
_newPassHash = passwordHash;
|
|
_useNewHash = true;//Only new hash is supported
|
|
|
|
return openInternal();
|
|
}
|
|
-
|
|
+
|
|
int Backend::openInternal(WId w)
|
|
{
|
|
// No wallet existed. Let's create it.
|
|
@@ -350,7 +350,9 @@ int Backend::openInternal(WId w)
|
|
if (0 == phandler){
|
|
return 42; // unknown cipher or hash
|
|
}
|
|
- return phandler->read(this, db, w);
|
|
+ int result = phandler->read(this, db, w);
|
|
+ delete phandler;
|
|
+ return result;
|
|
}
|
|
|
|
void Backend::swapToNewHash()
|
|
@@ -427,6 +429,7 @@ int Backend::sync(WId w) {
|
|
notification->setText( i18n("Failed to sync wallet <b>%1</b> to disk. Error codes are:\nRC <b>%2</b>\nSF <b>%3</b>. Please file a BUG report using this information to bugs.kde.org").arg(_name).arg(rc).arg(sf.errorString()) );
|
|
notification->sendEvent();
|
|
}
|
|
+ delete phandler;
|
|
return rc;
|
|
}
|
|
|
|
@@ -439,7 +442,7 @@ int Backend::close(bool save) {
|
|
return rc;
|
|
}
|
|
}
|
|
-
|
|
+
|
|
// do the actual close
|
|
for (FolderMap::ConstIterator i = _entries.constBegin(); i != _entries.constEnd(); ++i) {
|
|
for (EntryMap::ConstIterator j = i.value().constBegin(); j != i.value().constEnd(); ++j) {
|
|
@@ -447,13 +450,13 @@ int Backend::close(bool save) {
|
|
}
|
|
}
|
|
_entries.clear();
|
|
-
|
|
+
|
|
// empty the password hash
|
|
_passhash.fill(0);
|
|
_newPassHash.fill(0);
|
|
|
|
_open = false;
|
|
-
|
|
+
|
|
return 0;
|
|
}
|
|
|