[Pkg-owncloud-commits] [qtkeychain] 05/35: Compile time option USE_CREDENTIAL_STORE
Sandro Knauß
hefee-guest at moszumanska.debian.org
Tue May 24 17:39:58 UTC 2016
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository qtkeychain.
commit c2b5cde569644177dbc354e3675a7cc431a76b2a
Author: Armin Novak <armin.novak at thincast.com>
Date: Fri Nov 27 14:42:33 2015 +0100
Compile time option USE_CREDENTIAL_STORE
This option enables windows credential store support.
---
CMakeLists.txt | 7 ++++++
keychain_win.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7736c60..70927e9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,6 +13,13 @@ include(GNUInstallDirs)
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 )
# try Qt5 first, and prefer that if found
diff --git a/keychain_win.cpp b/keychain_win.cpp
index d5f0967..593dfca 100644
--- a/keychain_win.cpp
+++ b/keychain_win.cpp
@@ -17,6 +17,82 @@
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() {
//Use settings member if there, create local settings object if not
std::auto_ptr<QSettings> local( !q->settings() ? new QSettings( q->service() ) : 0 );
@@ -103,3 +179,4 @@ void DeletePasswordJobPrivate::scheduledStart() {
q->emitFinished();
}
}
+#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/qtkeychain.git
More information about the Pkg-owncloud-commits
mailing list