Merge pull request #36 from danimo/improve_gnome_keyring_detection

Detect GNOME keychain daemons presence using official API
This commit is contained in:
Frank Osterfeld 2014-04-01 10:24:05 +02:00
commit dafdd924f1
3 changed files with 15 additions and 8 deletions

View File

@ -2,21 +2,23 @@
const char* GnomeKeyring::GNOME_KEYRING_DEFAULT = NULL; const char* GnomeKeyring::GNOME_KEYRING_DEFAULT = NULL;
bool GnomeKeyring::isSupported() bool GnomeKeyring::isAvailable()
{ {
const GnomeKeyring& keyring = instance(); const GnomeKeyring& keyring = instance();
return keyring.isLoaded() && return keyring.isLoaded() &&
keyring.NETWORK_PASSWORD && keyring.NETWORK_PASSWORD &&
keyring.is_available &&
keyring.find_password && keyring.find_password &&
keyring.store_password && keyring.store_password &&
keyring.delete_password; keyring.delete_password &&
keyring.is_available();
} }
GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyring, const gchar* display_name, GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyring, const gchar* display_name,
const gchar* user, const gchar* server, const gchar* password, const gchar* user, const gchar* server, const gchar* password,
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data ) OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data )
{ {
if ( !isSupported() ) if ( !isAvailable() )
return 0; return 0;
return instance().store_password( instance().NETWORK_PASSWORD, return instance().store_password( instance().NETWORK_PASSWORD,
keyring, display_name, password, callback, data, destroy_data, keyring, display_name, password, callback, data, destroy_data,
@ -26,7 +28,7 @@ GnomeKeyring::gpointer GnomeKeyring::store_network_password( const gchar* keyrin
GnomeKeyring::gpointer GnomeKeyring::find_network_password( const gchar* user, const gchar* server, GnomeKeyring::gpointer GnomeKeyring::find_network_password( const gchar* user, const gchar* server,
OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data ) OperationGetStringCallback callback, gpointer data, GDestroyNotify destroy_data )
{ {
if ( !isSupported() ) if ( !isAvailable() )
return 0; return 0;
return instance().find_password( instance().NETWORK_PASSWORD, return instance().find_password( instance().NETWORK_PASSWORD,
callback, data, destroy_data, callback, data, destroy_data,
@ -39,7 +41,7 @@ GnomeKeyring::gpointer GnomeKeyring::delete_network_password( const gchar* user,
gpointer data, gpointer data,
GDestroyNotify destroy_data ) GDestroyNotify destroy_data )
{ {
if ( !isSupported() ) if ( !isAvailable() )
return 0; return 0;
return instance().delete_password( instance().NETWORK_PASSWORD, return instance().delete_password( instance().NETWORK_PASSWORD,
callback, data, destroy_data, callback, data, destroy_data,
@ -57,7 +59,8 @@ GnomeKeyring::GnomeKeyring()
}; };
NETWORK_PASSWORD = &schema; NETWORK_PASSWORD = &schema;
find_password = reinterpret_cast<find_password_fn*>( resolve( "gnome_keyring_find_password" ) ); 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" ) ); store_password = reinterpret_cast<store_password_fn*>( resolve( "gnome_keyring_store_password" ) );
delete_password = reinterpret_cast<delete_password_fn*>( resolve( "gnome_keyring_delete_password" ) ); delete_password = reinterpret_cast<delete_password_fn*>( resolve( "gnome_keyring_delete_password" ) );
} }

View File

@ -34,6 +34,7 @@ public:
typedef char gchar; typedef char gchar;
typedef void* gpointer; typedef void* gpointer;
typedef bool gboolean;
typedef struct { typedef struct {
ItemType item_type; ItemType item_type;
struct { struct {
@ -48,7 +49,7 @@ public:
static const char* GNOME_KEYRING_DEFAULT; static const char* GNOME_KEYRING_DEFAULT;
static bool isSupported(); static bool isAvailable();
static gpointer store_network_password( const gchar* keyring, const gchar* display_name, static gpointer store_network_password( const gchar* keyring, const gchar* display_name,
const gchar* user, const gchar* server, const gchar* password, const gchar* user, const gchar* server, const gchar* password,
@ -65,6 +66,7 @@ private:
static GnomeKeyring& instance(); static GnomeKeyring& instance();
const PasswordSchema* NETWORK_PASSWORD; const PasswordSchema* NETWORK_PASSWORD;
typedef gboolean ( is_available_fn )( void );
typedef gpointer ( store_password_fn )( const PasswordSchema* schema, const gchar* keyring, typedef gpointer ( store_password_fn )( const PasswordSchema* schema, const gchar* keyring,
const gchar* display_name, const gchar* password, const gchar* display_name, const gchar* password,
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data, OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data,
@ -75,6 +77,8 @@ private:
typedef gpointer ( delete_password_fn )( const PasswordSchema* schema, typedef gpointer ( delete_password_fn )( const PasswordSchema* schema,
OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data, OperationDoneCallback callback, gpointer data, GDestroyNotify destroy_data,
... ); ... );
is_available_fn* is_available;
find_password_fn* find_password; find_password_fn* find_password;
store_password_fn* store_password; store_password_fn* store_password;
delete_password_fn* delete_password; delete_password_fn* delete_password;

View File

@ -32,7 +32,7 @@ enum KeyringBackend {
static KeyringBackend detectKeyringBackend() static KeyringBackend detectKeyringBackend()
{ {
if ( !( qgetenv( "GNOME_KEYRING_CONTROL" ).isNull() && qgetenv("GNOME_KEYRING_SOCKET").isNull() ) && GnomeKeyring::isSupported() ) if ( GnomeKeyring::isAvailable() )
return Backend_GnomeKeyring; return Backend_GnomeKeyring;
else else
return Backend_Kwallet; return Backend_Kwallet;