[Pkg-owncloud-commits] [qtkeychain] 16/115: Allow the user to pass a custom QSettings object in case the default-constructed QSettings is not sufficient. (Only used on Windows)
Sandro Knauß
hefee-guest at moszumanska.debian.org
Sat Mar 15 19:25:43 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository qtkeychain.
commit 24d261235f859f6ed0855bd82ff4ac40b505b6c8
Author: Frank Osterfeld <frank.osterfeld at kdab.com>
Date: Fri Dec 9 20:47:11 2011 +0100
Allow the user to pass a custom QSettings object in case the default-constructed QSettings is not sufficient.
(Only used on Windows)
---
keychain.cpp | 5 +++--
keychain.h | 8 +++++++-
keychain_p.h | 5 ++++-
keychain_win.cpp | 41 +++++++++++++++++++++++++----------------
4 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/keychain.cpp b/keychain.cpp
index 2026470..b4455b1 100644
--- a/keychain.cpp
+++ b/keychain.cpp
@@ -11,9 +11,10 @@
using namespace QKeychain;
-Keychain::Keychain( const QString& service )
- : d( new Private( service ) )
+Keychain::Keychain( const QString& service, QSettings* settings )
+ : d( new Private( service, settings ) )
{
+ Q_ASSERT( !service.isEmpty() );
}
Keychain::~Keychain() {
diff --git a/keychain.h b/keychain.h
index 03895b5..13cc052 100644
--- a/keychain.h
+++ b/keychain.h
@@ -13,6 +13,8 @@
#include <QtCore/QString>
+class QSettings;
+
namespace QKeychain {
/**
* Provides access to platform-specific key stores for secure persistence of
@@ -31,8 +33,12 @@ public:
*
* @param service The service name of your service/application. Used as identifier,
* to disambiguate keys and avoid clashes with other applications.
+ * Must not be empty.
+ * @param settings An optional settings object that is used to store the encrypted data
+ * if no keychain is available on the platform. Currently only used on Windows.
+ * If 0, a default-constructed QSettings object will be used.
*/
- explicit Keychain( const QString& service );
+ explicit Keychain( const QString& service, QSettings* settings=0 );
/**
* Destructor
diff --git a/keychain_p.h b/keychain_p.h
index a130b19..316388b 100644
--- a/keychain_p.h
+++ b/keychain_p.h
@@ -10,6 +10,8 @@
#define KEYCHAIN_P_H
#include <QCoreApplication>
+#include <QPointer>
+#include <QSettings>
#include "keychain.h"
@@ -17,7 +19,7 @@ namespace QKeychain {
class Keychain::Private {
Q_DECLARE_TR_FUNCTIONS(Keychain::Private)
public:
- explicit Private( const QString& s ) : service( s ), error( NoError ) {}
+ explicit Private( const QString& service_, QSettings* settings_ ) : service( service_ ), settings( settings_ ), error( NoError ) {}
Keychain::Error writeEntryImpl( const QString& account,
const QByteArray& data,
@@ -31,6 +33,7 @@ public:
const QString& key,
QString* errorString );
const QString service;
+ QPointer<QSettings> settings;
Keychain::Error error;
QString errorString;
};
diff --git a/keychain_win.cpp b/keychain_win.cpp
index 102427d..ce341ba 100644
--- a/keychain_win.cpp
+++ b/keychain_win.cpp
@@ -13,6 +13,8 @@
#include <Windows.h>
#include <WinCrypt.h>
+#include <memory>
+
using namespace QKeychain;
Keychain::Error Keychain::Private::readEntryImpl( QByteArray* pw,
@@ -22,8 +24,11 @@ Keychain::Error Keychain::Private::readEntryImpl( QByteArray* pw,
Q_ASSERT( err );
err->clear();
- QSettings settings( service );
- QByteArray encrypted = settings.value( key ).toByteArray();
+ //Use settings member if there, create local settings object if not
+ std::auto_ptr<QSettings> local( !settings ? new QSettings( service ) : 0 );
+ QSettings* actual = settings ? settings.data() : local.get();
+
+ QByteArray encrypted = actual->value( key ).toByteArray();
if ( encrypted.isNull() ) {
*err = tr("Entry not found");
return EntryNotFound;
@@ -75,11 +80,13 @@ Keychain::Error Keychain::Private::writeEntryImpl( const QString& key,
const QByteArray encrypted( reinterpret_cast<char*>( blob_out.pbData ), blob_out.cbData );
LocalFree( blob_out.pbData );
- QSettings settings( service );
- settings.setValue( key, encrypted );
- settings.sync();
- if ( settings.status() != QSettings::NoError ) {
- *err = settings.status() == QSettings::AccessError
+ //Use settings member if there, create local settings object if not
+ std::auto_ptr<QSettings> local( !settings ? new QSettings( service ) : 0 );
+ QSettings* actual = settings ? settings.data() : local.get();
+ actual->setValue( key, encrypted );
+ actual->sync();
+ if ( actual->status() != QSettings::NoError ) {
+ *err = actual->status() == QSettings::AccessError
? tr("Could not store encrypted data in settings: access error")
: tr("Could not store encrypted data in settings: format error");
return OtherError;
@@ -92,11 +99,12 @@ Keychain::Error Keychain::Private::deleteEntryImpl( const QString& key,
QString* err ) {
Q_ASSERT( err );
err->clear();
- QSettings settings( service );
- settings.remove( key );
- settings.sync();
- if ( settings.status() != QSettings::NoError ) {
- *err = settings.status() == QSettings::AccessError
+ std::auto_ptr<QSettings> local( !settings ? new QSettings( service ) : 0 );
+ QSettings* actual = settings ? settings.data() : local.get();
+ actual->remove( key );
+ actual->sync();
+ if ( actual->status() != QSettings::NoError ) {
+ *err = actual->status() == QSettings::AccessError
? tr("Could not delete encrypted data from settings: access error")
: tr("Could not delete encrypted data from settings: format error");
return OtherError;
@@ -113,10 +121,11 @@ Keychain::Error Keychain::Private::entryExistsImpl( bool* exists,
Q_ASSERT( err );
err->clear();
*exists = false;
- QSettings settings( service );
- const bool ex = settings.contains( key );
- if ( settings.status() != QSettings::NoError ) {
- *err = settings.status() == QSettings::AccessError
+ std::auto_ptr<QSettings> local( !settings ? new QSettings( service ) : 0 );
+ QSettings* actual = settings ? settings.data() : local.get();
+ const bool ex = actual->contains( key );
+ if ( actual->status() != QSettings::NoError ) {
+ *err = actual->status() == QSettings::AccessError
? tr("Could not read settings: access error")
: tr("Could not read settings: format error");
return OtherError;
--
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