This repository has been archived by the owner on Sep 24, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 69
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Sync with 38cec09f314c93ffd4beab27c3dac70bfcebcd50 from master (post 0.4.0) Change-Id: Ibe66b3330cb4e077be4eb613c36c188cb8b0042d Reviewed-on: https://codereview.kdab.com/19039 Reviewed-by: Continuous Integration <[email protected]> Reviewed-by: Guillermo Amaral <[email protected]>
- Loading branch information
1 parent
4eb0b70
commit defc495
Showing
9 changed files
with
344 additions
and
184 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include "gnomekeyring_p.h" | ||
|
||
const char* GnomeKeyring::GNOME_KEYRING_DEFAULT = NULL; | ||
|
||
bool GnomeKeyring::isAvailable() | ||
{ | ||
const GnomeKeyring& keyring = instance(); | ||
return keyring.isLoaded() && | ||
keyring.NETWORK_PASSWORD && | ||
keyring.is_available && | ||
keyring.find_password && | ||
keyring.store_password && | ||
keyring.delete_password && | ||
keyring.is_available(); | ||
} | ||
|
||
GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyring, const gchar* display_name, | ||
const gchar* user, const gchar* server, const gchar* password, | ||
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ) | ||
{ | ||
if ( !isAvailable() ) | ||
return 0; | ||
return instance().store_password( instance().NETWORK_PASSWORD, | ||
keyring, display_name, password, callback, data, destroy_data, | ||
"user", user, "server", server, static_cast<char*>(0) ); | ||
} | ||
|
||
GnomeKeyring::gpointer GnomeKeyring::find_network_password( const gchar* user, const gchar* server, | ||
OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ) | ||
{ | ||
if ( !isAvailable() ) | ||
return 0; | ||
return instance().find_password( instance().NETWORK_PASSWORD, | ||
callback, data, destroy_data, | ||
"user", user, "server", server, static_cast<char*>(0) ); | ||
} | ||
|
||
GnomeKeyring::gpointer GnomeKeyring::delete_network_password( const gchar* user, | ||
const gchar* server, | ||
OperationDoneCallback callback, | ||
gpointer data, | ||
GDestroyNotify destroy_data ) | ||
{ | ||
if ( !isAvailable() ) | ||
return 0; | ||
return instance().delete_password( instance().NETWORK_PASSWORD, | ||
callback, data, destroy_data, | ||
"user", user, "server", server, static_cast<char*>(0) ); | ||
} | ||
|
||
GnomeKeyring::GnomeKeyring() | ||
: QLibrary("gnome-keyring", 0) | ||
{ | ||
static const PasswordSchema schema = { | ||
ITEM_NETWORK_PASSWORD, | ||
{{ "user", ATTRIBUTE_TYPE_STRING }, | ||
{ "server", ATTRIBUTE_TYPE_STRING }, | ||
{ 0, static_cast<AttributeType>( 0 ) }} | ||
}; | ||
|
||
NETWORK_PASSWORD = &schema; | ||
is_available = reinterpret_cast<is_available_fn*>( resolve( "gnome_keyring_is_available" ) ); | ||
find_password = reinterpret_cast<find_password_fn*>( resolve( "gnome_keyring_find_password" ) ); | ||
store_password = reinterpret_cast<store_password_fn*>( resolve( "gnome_keyring_store_password" ) ); | ||
delete_password = reinterpret_cast<delete_password_fn*>( resolve( "gnome_keyring_delete_password" ) ); | ||
} | ||
|
||
GnomeKeyring& GnomeKeyring::instance() { | ||
static GnomeKeyring keyring; | ||
return keyring; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
#ifndef QTKEYCHAIN_GNOME_P_H | ||
#define QTKEYCHAIN_GNOME_P_H | ||
|
||
#include <QLibrary> | ||
|
||
class GnomeKeyring : private QLibrary { | ||
public: | ||
enum Result { | ||
RESULT_OK, | ||
RESULT_DENIED, | ||
RESULT_NO_KEYRING_DAEMON, | ||
RESULT_ALREADY_UNLOCKED, | ||
RESULT_NO_SUCH_KEYRING, | ||
RESULT_BAD_ARGUMENTS, | ||
RESULT_IO_ERROR, | ||
RESULT_CANCELLED, | ||
RESULT_KEYRING_ALREADY_EXISTS, | ||
RESULT_NO_MATCH | ||
}; | ||
|
||
enum ItemType { | ||
ITEM_GENERIC_SECRET = 0, | ||
ITEM_NETWORK_PASSWORD, | ||
ITEM_NOTE, | ||
ITEM_CHAINED_KEYRING_PASSWORD, | ||
ITEM_ENCRYPTION_KEY_PASSWORD, | ||
ITEM_PK_STORAGE = 0x100 | ||
}; | ||
|
||
enum AttributeType { | ||
ATTRIBUTE_TYPE_STRING, | ||
ATTRIBUTE_TYPE_UINT32 | ||
}; | ||
|
||
typedef char gchar; | ||
typedef void* gpointer; | ||
typedef bool gboolean; | ||
typedef struct { | ||
ItemType item_type; | ||
struct { | ||
const gchar* name; | ||
AttributeType type; | ||
} attributes[32]; | ||
} PasswordSchema; | ||
|
||
typedef void ( *OperationGetStringCallback )( Result result, const char* string, gpointer data ); | ||
typedef void ( *OperationDoneCallback )( Result result, gpointer data ); | ||
typedef void ( *GDestroyNotify )( gpointer data ); | ||
|
||
static const char* GNOME_KEYRING_DEFAULT; | ||
|
||
static bool isAvailable(); | ||
|
||
static gpointer store_network_password( const gchar* keyring, const gchar* display_name, | ||
const gchar* user, const gchar* server, const gchar* password, | ||
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||
|
||
static gpointer find_network_password( const gchar* user, const gchar* server, | ||
OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||
|
||
static gpointer delete_network_password( const gchar* user, const gchar* server, | ||
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ); | ||
private: | ||
GnomeKeyring(); | ||
|
||
static GnomeKeyring& instance(); | ||
|
||
const PasswordSchema* NETWORK_PASSWORD; | ||
typedef gboolean ( is_available_fn )( void ); | ||
typedef gpointer ( store_password_fn )( const PasswordSchema* schema, const gchar* keyring, | ||
const gchar* display_name, const gchar* password, | ||
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data, | ||
... ); | ||
typedef gpointer ( find_password_fn )( const PasswordSchema* schema, | ||
OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data, | ||
... ); | ||
typedef gpointer ( delete_password_fn )( const PasswordSchema* schema, | ||
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data, | ||
... ); | ||
|
||
is_available_fn* is_available; | ||
find_password_fn* find_password; | ||
store_password_fn* store_password; | ||
delete_password_fn* delete_password; | ||
}; | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2011-2013 Frank Osterfeld <[email protected]> * | ||
* Copyright (C) 2011-2014 Frank Osterfeld <[email protected]> * | ||
* * | ||
* This program is distributed in the hope that it will be useful, but * | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||
|
@@ -154,8 +154,10 @@ void DeletePasswordJob::doStart() { | |
//In all current implementations, this deletes the entry so this is sufficient | ||
WritePasswordJob* job = new WritePasswordJob( service(), this ); | ||
connect( job, SIGNAL(finished(QKeychain::Job*)), d, SLOT(jobFinished(QKeychain::Job*)) ); | ||
job->setInsecureFallback(true); | ||
job->setSettings(settings()); | ||
job->setKey( d->key ); | ||
job->start(); | ||
job->doStart(); | ||
} | ||
|
||
QString DeletePasswordJob::key() const { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2011-2013 Frank Osterfeld <[email protected]> * | ||
* Copyright (C) 2011-2014 Frank Osterfeld <[email protected]> * | ||
* * | ||
* This program is distributed in the hope that it will be useful, but * | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||
|
@@ -115,6 +115,7 @@ class WritePasswordJob : public Job { | |
private: | ||
friend class QKeychain::JobExecutor; | ||
friend class QKeychain::WritePasswordJobPrivate; | ||
friend class DeletePasswordJob; | ||
WritePasswordJobPrivate* const d; | ||
}; | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2011-2013 Frank Osterfeld <[email protected]> * | ||
* Copyright (C) 2011-2014 Frank Osterfeld <[email protected]> * | ||
* * | ||
* This program is distributed in the hope that it will be useful, but * | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||
|
@@ -28,8 +28,10 @@ static QString strForStatus( OSStatus os ) { | |
const Releaser<CFStringRef> str( SecCopyErrorMessageString( os, 0 ) ); | ||
const char * const buf = CFStringGetCStringPtr( str.value, kCFStringEncodingUTF8 ); | ||
if ( !buf ) | ||
return QString(); | ||
return QString::fromUtf8( buf, strlen( buf ) ); | ||
return QObject::tr( "%1 (OSStatus %2)" ) | ||
.arg( "OSX Keychain Error" ).arg( os ); | ||
return QObject::tr( "%1 (OSStatus %2)" ) | ||
.arg( QString::fromUtf8( buf, strlen( buf ) ) ).arg( os ); | ||
} | ||
|
||
static OSStatus readPw( QByteArray* pw, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/****************************************************************************** | ||
* Copyright (C) 2011-2013 Frank Osterfeld <[email protected]> * | ||
* Copyright (C) 2011-2014 Frank Osterfeld <[email protected]> * | ||
* * | ||
* This program is distributed in the hope that it will be useful, but * | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * | ||
|
@@ -15,7 +15,7 @@ | |
#include <QSettings> | ||
#include <QVector> | ||
|
||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) | ||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||
|
||
#include <QDBusPendingCallWatcher> | ||
|
||
|
@@ -35,7 +35,7 @@ class JobExecutor; | |
class JobPrivate : public QObject { | ||
Q_OBJECT | ||
public: | ||
explicit JobPrivate( const QString& service_ ) | ||
JobPrivate( const QString& service_ ) | ||
: error( NoError ) | ||
, service( service_ ) | ||
, autoDelete( true ) | ||
|
@@ -52,15 +52,7 @@ class JobPrivate : public QObject { | |
class ReadPasswordJobPrivate : public QObject { | ||
Q_OBJECT | ||
public: | ||
explicit ReadPasswordJobPrivate( ReadPasswordJob* qq ) | ||
: q( qq ) | ||
, walletHandle( 0 ) | ||
, dataType( Text ) | ||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) | ||
, iface( 0 ) | ||
#endif | ||
{ | ||
} | ||
explicit ReadPasswordJobPrivate( ReadPasswordJob* qq ) : q( qq ), walletHandle( 0 ), dataType( Text ) {} | ||
void scheduledStart(); | ||
|
||
ReadPasswordJob* const q; | ||
|
@@ -73,7 +65,7 @@ class ReadPasswordJobPrivate : public QObject { | |
}; | ||
DataType dataType; | ||
|
||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) | ||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||
org::kde::KWallet* iface; | ||
static void gnomeKeyring_cb( int result, const char* string, ReadPasswordJobPrivate* data ); | ||
friend class QKeychain::JobExecutor; | ||
|
@@ -97,38 +89,37 @@ private Q_SLOTS: | |
class WritePasswordJobPrivate : public QObject { | ||
Q_OBJECT | ||
public: | ||
explicit WritePasswordJobPrivate( WritePasswordJob* qq ) | ||
: q( qq ) | ||
, mode( Delete ) | ||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) | ||
, iface( 0 ) | ||
#endif | ||
{ | ||
} | ||
explicit WritePasswordJobPrivate( WritePasswordJob* qq ) : q( qq ), mode( Delete ) {} | ||
void scheduledStart(); | ||
|
||
enum Mode { | ||
Delete, | ||
Text, | ||
Binary | ||
}; | ||
|
||
static QString modeToString(Mode m); | ||
static Mode stringToMode(const QString& s); | ||
|
||
WritePasswordJob* const q; | ||
Mode mode; | ||
QString key; | ||
QByteArray binaryData; | ||
QString textData; | ||
|
||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) | ||
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) | ||
org::kde::KWallet* iface; | ||
static void gnomeKeyring_cb( int result, WritePasswordJobPrivate* self ); | ||
friend class QKeychain::JobExecutor; | ||
void fallbackOnError(const QDBusError& err); | ||
|
||
private Q_SLOTS: | ||
void kwalletWalletFound( QDBusPendingCallWatcher* watcher ); | ||
void kwalletOpenFinished( QDBusPendingCallWatcher* watcher ); | ||
void kwalletWriteFinished( QDBusPendingCallWatcher* watcher ); | ||
#else | ||
private Q_SLOTS: | ||
void kwalletWalletFound( QDBusPendingCallWatcher* ) {} | ||
void kwalletOpenFinished( QDBusPendingCallWatcher* ) {} | ||
void kwalletWriteFinished( QDBusPendingCallWatcher* ) {} | ||
#endif | ||
|
Oops, something went wrong.