[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