Compile time option USE_CREDENTIAL_STORE
This option enables windows credential store support.
This commit is contained in:
parent
e6e828c33b
commit
c2b5cde569
|
@ -13,6 +13,13 @@ include(GNUInstallDirs)
|
||||||
|
|
||||||
option(BUILD_WITH_QT4 "Build qtkeychain with Qt4 no matter if Qt5 was found" OFF)
|
option(BUILD_WITH_QT4 "Build qtkeychain with Qt4 no matter if Qt5 was found" OFF)
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
option(USE_CREDENTIAL_STORE "Build with windows CredentialStore support" ON)
|
||||||
|
|
||||||
|
if (USE_CREDENTIAL_STORE)
|
||||||
|
add_definitions(-DUSE_CREDENTIAL_STORE=1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if( NOT BUILD_WITH_QT4 )
|
if( NOT BUILD_WITH_QT4 )
|
||||||
# try Qt5 first, and prefer that if found
|
# try Qt5 first, and prefer that if found
|
||||||
|
|
|
@ -17,6 +17,82 @@
|
||||||
|
|
||||||
using namespace QKeychain;
|
using namespace QKeychain;
|
||||||
|
|
||||||
|
#if defined(USE_CREDENTIAL_STORE)
|
||||||
|
#include <wincred.h>
|
||||||
|
|
||||||
|
void ReadPasswordJobPrivate::scheduledStart() {
|
||||||
|
std::wstring name = key.toStdWString();
|
||||||
|
//Use settings member if there, create local settings object if not
|
||||||
|
std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
|
||||||
|
PCREDENTIALW cred;
|
||||||
|
|
||||||
|
if (!CredReadW(name.c_str(), CRED_TYPE_GENERIC, 0, &cred)) {
|
||||||
|
Error error;
|
||||||
|
QString msg;
|
||||||
|
switch(GetLastError()) {
|
||||||
|
case ERROR_NOT_FOUND:
|
||||||
|
error = EntryNotFound;
|
||||||
|
msg = tr("Password entry not found");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error = OtherError;
|
||||||
|
msg = tr("Could not decrypt data");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->emitFinishedWithError( error, msg );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = QByteArray((char*)cred->CredentialBlob, cred->CredentialBlobSize);
|
||||||
|
CredFree(cred);
|
||||||
|
|
||||||
|
q->emitFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WritePasswordJobPrivate::scheduledStart() {
|
||||||
|
CREDENTIALW cred;
|
||||||
|
char *pwd = data.data();
|
||||||
|
std::wstring name = key.toStdWString();
|
||||||
|
|
||||||
|
memset(&cred, 0, sizeof(cred));
|
||||||
|
cred.Comment = L"QtKeychain";
|
||||||
|
cred.Type = CRED_TYPE_GENERIC;
|
||||||
|
cred.TargetName = (LPWSTR)name.c_str();
|
||||||
|
cred.CredentialBlobSize = data.size();
|
||||||
|
cred.CredentialBlob = (LPBYTE)pwd;
|
||||||
|
cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
|
||||||
|
|
||||||
|
if (!CredWriteW(&cred, 0)) {
|
||||||
|
q->emitFinishedWithError( OtherError, tr("Encryption failed") ); //TODO more details available?
|
||||||
|
} else {
|
||||||
|
q->emitFinished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeletePasswordJobPrivate::scheduledStart() {
|
||||||
|
std::wstring name = key.toStdWString();
|
||||||
|
|
||||||
|
if (!CredDeleteW(name.c_str(), CRED_TYPE_GENERIC, 0)) {
|
||||||
|
Error error;
|
||||||
|
QString msg;
|
||||||
|
switch(GetLastError()) {
|
||||||
|
case ERROR_NOT_FOUND:
|
||||||
|
error = EntryNotFound;
|
||||||
|
msg = tr("Password entry not found");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error = OtherError;
|
||||||
|
msg = tr("Could not decrypt data");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->emitFinishedWithError( error, msg );
|
||||||
|
} else {
|
||||||
|
q->emitFinished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
void ReadPasswordJobPrivate::scheduledStart() {
|
void ReadPasswordJobPrivate::scheduledStart() {
|
||||||
//Use settings member if there, create local settings object if not
|
//Use settings member if there, create local settings object if not
|
||||||
std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
|
std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
|
||||||
|
@ -103,3 +179,4 @@ void DeletePasswordJobPrivate::scheduledStart() {
|
||||||
q->emitFinished();
|
q->emitFinished();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue