[gnome-keyring] More robust error display and handling.



commit 9225955b8374d0d301e0a251410ae347a3bd884b
Author: Stef Walter <stef memberwebs com>
Date:   Fri Mar 19 23:03:33 2010 +0000

    More robust error display and handling.
    
    Handle all cases where a function may return a failure
    with a NULL GError, such as preconditions and warnings.
    
    Also use proper function for checking error codes.

 daemon/dbus/gkd-dbus-util.c                 |    4 ++-
 daemon/dbus/gkd-secret-change.c             |    7 ++--
 daemon/dbus/gkd-secret-create.c             |    5 ++-
 daemon/dbus/gkd-secret-lock.c               |    6 ++-
 daemon/dbus/gkd-secret-objects.c            |   48 +++++++++++++------------
 daemon/dbus/gkd-secret-service.c            |   11 +++---
 daemon/dbus/gkd-secret-session.c            |   37 ++++++++++---------
 daemon/dbus/gkd-secret-unlock.c             |   17 +++++----
 daemon/gkd-main.c                           |    3 +-
 daemon/login/gkd-login.c                    |   51 +++++++++++++++-----------
 daemon/prompt/gkd-prompt-tool.c             |    8 ++--
 daemon/prompt/gkd-prompt.c                  |   10 ++---
 daemon/ssh-agent/gkd-ssh-agent-ops.c        |   46 ++++++++++++-----------
 daemon/ssh-agent/gkd-ssh-agent-standalone.c |    3 +-
 daemon/ssh-agent/gkd-ssh-agent.c            |    5 ++-
 egg/egg-error.h                             |   34 ++++++++++++++++++
 gcr/gcr-library.c                           |    3 +-
 gcr/tests/unit-test-parser.c                |    3 +-
 gp11/gp11-module.c                          |    2 +-
 pkcs11/gck/gck-file-tracker.c               |    6 ++-
 pkcs11/gck/gck-timer.c                      |    4 ++-
 pkcs11/roots-store/gck-roots-module.c       |    3 +-
 pkcs11/rpc-layer/gck-rpc-dispatch.c         |    3 +-
 pkcs11/secret-store/gck-secret-collection.c |    4 ++-
 pkcs11/secret-store/gck-secret-textual.c    |    5 ++-
 pkcs11/ssh-store/gck-ssh-module.c           |    5 ++-
 pkcs11/user-store/gck-user-storage.c        |    5 ++-
 tests/gtest-helpers.c                       |    3 +-
 28 files changed, 205 insertions(+), 136 deletions(-)
---
diff --git a/daemon/dbus/gkd-dbus-util.c b/daemon/dbus/gkd-dbus-util.c
index 1b094ea..33b303b 100644
--- a/daemon/dbus/gkd-dbus-util.c
+++ b/daemon/dbus/gkd-dbus-util.c
@@ -26,6 +26,8 @@
 #include "gkd-dbus-util.h"
 #include "gkd-secret-types.h"
 
+#include "egg/egg-error.h"
+
 #include <string.h>
 
 GType
@@ -71,7 +73,7 @@ gkd_dbus_introspect_handle (DBusMessage *message, const gchar *type)
 
 		if (error != NULL) {
 			g_warning ("couldn't load introspect data file: %s: %s",
-			           filename, error->message ? error->message : "");
+			           filename, egg_error_message (error));
 			g_clear_error (&error);
 			return NULL;
 		}
diff --git a/daemon/dbus/gkd-secret-change.c b/daemon/dbus/gkd-secret-change.c
index 3dee7a7..0fba515 100644
--- a/daemon/dbus/gkd-secret-change.c
+++ b/daemon/dbus/gkd-secret-change.c
@@ -29,6 +29,7 @@
 #include "gkd-secret-types.h"
 #include "gkd-secret-util.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "pkcs11/pkcs11i.h"
@@ -69,7 +70,7 @@ prepare_change_prompt (GkdSecretChange *self, GP11Object *collection, gboolean f
 
 	data = gp11_object_get_data (collection, CKA_LABEL, &n_data, &error);
 	if (!data) {
-		g_warning ("couldn't get label for collection: %s", error->message);
+		g_warning ("couldn't get label for collection: %s", egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -304,10 +305,10 @@ cleanup:
 		gp11_attributes_unref (attrs);
 
 	if (!result && error) {
-		if (error->code == CKR_USER_NOT_LOGGED_IN)
+		if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN))
 			dbus_set_error (derr, INTERNAL_ERROR_DENIED, "The original password was invalid");
 		else
-			g_warning ("failure occurred while changing password: %s", error->message);
+			g_warning ("failure occurred while changing password: %s", egg_error_message (error));
 	}
 
 	if (!result && !dbus_error_is_set (derr))
diff --git a/daemon/dbus/gkd-secret-create.c b/daemon/dbus/gkd-secret-create.c
index d56cf92..5f61af1 100644
--- a/daemon/dbus/gkd-secret-create.c
+++ b/daemon/dbus/gkd-secret-create.c
@@ -30,6 +30,7 @@
 #include "gkd-secret-types.h"
 #include "gkd-secret-util.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "pkcs11/pkcs11i.h"
@@ -303,7 +304,7 @@ gkd_secret_create_with_secret (GP11Attributes *attrs, GkdSecretSecret *master,
 	g_object_unref (cred);
 
 	if (collection == NULL) {
-		g_warning ("couldn't create collection: %s", error->message);
+		g_warning ("couldn't create collection: %s", egg_error_message (error));
 		g_clear_error (&error);
 		dbus_set_error (derr, DBUS_ERROR_FAILED, "Couldn't create new collection");
 		return FALSE;
@@ -314,7 +315,7 @@ gkd_secret_create_with_secret (GP11Attributes *attrs, GkdSecretSecret *master,
 	g_object_unref (collection);
 
 	if (!identifier) {
-		g_warning ("couldn't lookup new collection identifier: %s", error->message);
+		g_warning ("couldn't lookup new collection identifier: %s", egg_error_message (error));
 		g_clear_error (&error);
 		dbus_set_error (derr, DBUS_ERROR_FAILED, "Couldn't find new collection just created");
 		return FALSE;
diff --git a/daemon/dbus/gkd-secret-lock.c b/daemon/dbus/gkd-secret-lock.c
index abecf63..c348d78 100644
--- a/daemon/dbus/gkd-secret-lock.c
+++ b/daemon/dbus/gkd-secret-lock.c
@@ -24,6 +24,8 @@
 #include "gkd-secret-lock.h"
 #include "gkd-secret-service.h"
 
+#include "egg/egg-error.h"
+
 #include "pkcs11/pkcs11i.h"
 
 #include <gp11/gp11.h>
@@ -46,7 +48,7 @@ gkd_secret_lock (GP11Object *collection, DBusError *derr)
 
 	if (error != NULL) {
 		g_object_unref (session);
-		g_warning ("couldn't search for credential objects: %s", error->message);
+		g_warning ("couldn't search for credential objects: %s", egg_error_message (error));
 		dbus_set_error (derr, DBUS_ERROR_FAILED, "Couldn't lock collection");
 		g_clear_error (&error);
 		return FALSE;
@@ -56,7 +58,7 @@ gkd_secret_lock (GP11Object *collection, DBusError *derr)
 		cred = GP11_OBJECT (l->data);
 		gp11_object_set_session (cred, session);
 		if (!gp11_object_destroy (cred, &error)) {
-			g_warning ("couldn't destroy credential object: %s", error->message);
+			g_warning ("couldn't destroy credential object: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
diff --git a/daemon/dbus/gkd-secret-objects.c b/daemon/dbus/gkd-secret-objects.c
index 55b1f2d..6af6a91 100644
--- a/daemon/dbus/gkd-secret-objects.c
+++ b/daemon/dbus/gkd-secret-objects.c
@@ -32,6 +32,8 @@
 #include "gkd-secret-types.h"
 #include "gkd-secret-util.h"
 
+#include "egg/egg-error.h"
+
 #include "pkcs11/pkcs11i.h"
 
 #include <string.h>
@@ -110,7 +112,7 @@ iter_append_item_path (const gchar *base, GP11Object *object, DBusMessageIter *i
 	if (base == NULL) {
 		identifier = gp11_object_get_data (object, CKA_G_COLLECTION, &n_identifier, &error);
 		if (!identifier) {
-			g_warning ("couldn't get item collection identifier: %s", error->message);
+			g_warning ("couldn't get item collection identifier: %s", egg_error_message (error));
 			g_clear_error (&error);
 			return;
 		}
@@ -121,7 +123,7 @@ iter_append_item_path (const gchar *base, GP11Object *object, DBusMessageIter *i
 
 	identifier = gp11_object_get_data (object, CKA_ID, &n_identifier, &error);
 	if (identifier == NULL) {
-		g_warning ("couldn't get item identifier: %s", error->message);
+		g_warning ("couldn't get item identifier: %s", egg_error_message (error));
 		g_clear_error (&error);
 	} else {
 		path = gkd_secret_util_build_path (base, identifier, n_identifier);
@@ -163,7 +165,7 @@ iter_append_collection_paths (GList *collections, DBusMessageIter *iter)
 
 		identifier = gp11_object_get_data (l->data, CKA_ID, &n_identifier, &error);
 		if (identifier == NULL) {
-			g_warning ("couldn't get collection identifier: %s", error->message);
+			g_warning ("couldn't get collection identifier: %s", egg_error_message (error));
 			g_clear_error (&error);
 			continue;
 		}
@@ -198,7 +200,7 @@ object_property_get (GP11Object *object, DBusMessage *message,
 	if (error != NULL) {
 		reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                       "Couldn't retrieve '%s' property: %s",
-		                                       prop_name, error->message);
+		                                       prop_name, egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
@@ -244,13 +246,13 @@ object_property_set (GP11Object *object, DBusMessage *message,
 	gp11_attributes_unref (attrs);
 
 	if (error != NULL) {
-		if (error->code == CKR_USER_NOT_LOGGED_IN)
+		if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN))
 			reply = dbus_message_new_error (message, SECRET_ERROR_IS_LOCKED,
 			                                "Cannot set property on a locked object");
 		else
 			reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 			                                       "Couldn't set '%s' property: %s",
-			                                       prop_name, error->message);
+			                                       prop_name, egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
@@ -330,7 +332,7 @@ item_property_getall (GP11Object *object, DBusMessage *message)
 	if (error != NULL)
 		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                      "Couldn't retrieve properties: %s",
-		                                      error->message);
+		                                      egg_error_message (error));
 
 	reply = dbus_message_new_method_return (message);
 
@@ -352,13 +354,13 @@ item_method_delete (GkdSecretObjects *self, GP11Object *object, DBusMessage *mes
 		return NULL;
 
 	if (!gp11_object_destroy (object, &error)) {
-		if (error->code == CKR_USER_NOT_LOGGED_IN)
+		if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN))
 			reply = dbus_message_new_error_printf (message, SECRET_ERROR_IS_LOCKED,
 			                                       "Cannot delete a locked item");
 		else
 			reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 			                                       "Couldn't delete collection: %s",
-			                                       error->message);
+			                                       egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
@@ -474,8 +476,8 @@ item_cleanup_search_results (GP11Session *session, GList *items,
 		gp11_object_set_session (l->data, session);
 		value = gp11_object_get_data (l->data, CKA_G_LOCKED, &n_value, &error);
 		if (value == NULL) {
-			if (error->code != CKR_OBJECT_HANDLE_INVALID)
-				g_warning ("couldn't check if item is locked: %s", error->message);
+			if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
+				g_warning ("couldn't check if item is locked: %s", egg_error_message (error));
 			g_clear_error (&error);
 
 		/* Is not locked */
@@ -573,7 +575,7 @@ collection_property_getall (GkdSecretObjects *self, GP11Object *object, DBusMess
 	if (error != NULL)
 		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                      "Couldn't retrieve properties: %s",
-		                                      error->message);
+		                                      egg_error_message (error));
 
 	reply = dbus_message_new_method_return (message);
 
@@ -623,7 +625,7 @@ collection_find_matching_item (GkdSecretObjects *self, GP11Session *session,
 	gp11_attributes_unref (attrs);
 
 	if (error != NULL) {
-		g_warning ("couldn't search for matching item: %s", error->message);
+		g_warning ("couldn't search for matching item: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -731,12 +733,12 @@ collection_method_create_item (GkdSecretObjects *self, GP11Object *object, DBusM
 cleanup:
 	if (error) {
 		if (!reply) {
-			if (error->code == CKR_USER_NOT_LOGGED_IN)
+			if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN))
 				reply = dbus_message_new_error_printf (message, SECRET_ERROR_IS_LOCKED,
 				                                       "Cannot create an item in a locked collection");
 			else
 				reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
-				                                       "Couldn't create item: %s", error->message);
+				                                       "Couldn't create item: %s", egg_error_message (error));
 		}
 		g_clear_error (&error);
 	}
@@ -771,7 +773,7 @@ collection_method_delete (GkdSecretObjects *self, GP11Object *object, DBusMessag
 	if (!gp11_object_destroy (object, &error)) {
 		reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                       "Couldn't delete collection: %s",
-		                                       error->message);
+		                                       egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
@@ -987,7 +989,7 @@ gkd_secret_objects_dispatch (GkdSecretObjects *self, DBusMessage *message)
 	g_free (i_ident);
 
 	if (error != NULL) {
-		g_warning ("couldn't lookup object: %s: %s", path, error->message);
+		g_warning ("couldn't lookup object: %s: %s", path, egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -1033,7 +1035,7 @@ gkd_secret_objects_lookup_collection (GkdSecretObjects *self, const gchar *calle
 	g_free (identifier);
 
 	if (error != NULL) {
-		g_warning ("couldn't lookup collection: %s: %s", path, error->message);
+		g_warning ("couldn't lookup collection: %s: %s", path, egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -1078,7 +1080,7 @@ gkd_secret_objects_lookup_item (GkdSecretObjects *self, const gchar *caller,
 	g_free (collection);
 
 	if (error != NULL) {
-		g_warning ("couldn't lookup item: %s: %s", path, error->message);
+		g_warning ("couldn't lookup item: %s: %s", path, egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -1123,7 +1125,7 @@ gkd_secret_objects_append_item_paths (GkdSecretObjects *self, const gchar *base,
 		iter_append_item_paths (base, items, &variant);
 		dbus_message_iter_close_container (iter, &variant);
 	} else {
-		g_warning ("couldn't lookup items in '%s' collection: %s", identifier, error->message);
+		g_warning ("couldn't lookup items in '%s' collection: %s", identifier, egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -1152,7 +1154,7 @@ gkd_secret_objects_append_collection_paths (GkdSecretObjects *self, DBusMessageI
 	                                   GP11_INVALID);
 
 	if (error != NULL) {
-		g_warning ("couldn't lookup collections: %s", error->message);
+		g_warning ("couldn't lookup collections: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return;
 	}
@@ -1217,7 +1219,7 @@ gkd_secret_objects_handle_search_items (GkdSecretObjects *self, DBusMessage *mes
 	if (error != NULL) {
 		reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                       "Couldn't search for items: %s",
-		                                       error->message);
+		                                       egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
@@ -1231,7 +1233,7 @@ gkd_secret_objects_handle_search_items (GkdSecretObjects *self, DBusMessage *mes
 	if (error != NULL) {
 		reply = dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                       "Couldn't retrieve matched items: %s",
-		                                       error->message);
+		                                       egg_error_message (error));
 		g_clear_error (&error);
 		return reply;
 	}
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index 6c282de..8d51f3a 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -36,6 +36,7 @@
 #include "gkd-secret-unlock.h"
 #include "gkd-secret-util.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-unix-credentials.h"
 
 #include "gp11/gp11.h"
@@ -120,10 +121,8 @@ store_default (GkdSecretService *self)
 		return;
 
 	path = default_path ();
-	if (!g_file_set_contents (path, identifier, -1, &error)) {
-		g_message ("couldn't store default keyring: %s",
-		           error->message ? error->message : "");
-	}
+	if (!g_file_set_contents (path, identifier, -1, &error))
+		g_message ("couldn't store default keyring: %s", egg_error_message (error));
 	g_free (path);
 }
 
@@ -1224,7 +1223,7 @@ gkd_secret_service_get_pkcs11_session (GkdSecretService *self, const gchar *call
 		                                                      NULL, NULL, &error);
 		if (!client->pkcs11_session) {
 			g_warning ("couldn't open pkcs11 session for secret service: %s",
-			           error->message);
+			           egg_error_message (error));
 			g_clear_error (&error);
 			return NULL;
 		}
@@ -1235,7 +1234,7 @@ gkd_secret_service_get_pkcs11_session (GkdSecretService *self, const gchar *call
 		gp11_token_info_free (info);
 		if (login && !gp11_session_login (client->pkcs11_session, CKU_USER, NULL, 0, &error)) {
 			g_warning ("couldn't log in to pkcs11 session for secret service: %s",
-			           error->message);
+			           egg_error_message (error));
 			g_clear_error (&error);
 			g_object_unref (client->pkcs11_session);
 			client->pkcs11_session = NULL;
diff --git a/daemon/dbus/gkd-secret-session.c b/daemon/dbus/gkd-secret-session.c
index 7d6efb6..80cd054 100644
--- a/daemon/dbus/gkd-secret-session.c
+++ b/daemon/dbus/gkd-secret-session.c
@@ -29,6 +29,7 @@
 #include "gkd-dbus-util.h"
 
 #include "egg/egg-dh.h"
+#include "egg/egg-error.h"
 
 #include "pkcs11/pkcs11i.h"
 
@@ -105,7 +106,7 @@ aes_create_dh_keys (GP11Session *session, const gchar *group,
 	gp11_attributes_unref (attrs);
 
 	if (ret == FALSE) {
-		g_warning ("couldn't generate dh key pair: %s", error->message);
+		g_warning ("couldn't generate dh key pair: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return FALSE;
 	}
@@ -135,7 +136,7 @@ aes_derive_key (GP11Session *session, GP11Object *priv_key,
 	gp11_attributes_unref (attrs);
 
 	if (!*aes_key) {
-		g_warning ("couldn't derive aes key from dh key pair: %s", error->message);
+		g_warning ("couldn't derive aes key from dh key pair: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return FALSE;
 	}
@@ -169,7 +170,7 @@ aes_negotiate (GkdSecretSession *self, DBusMessage *message, gconstpointer input
 	g_object_unref (pub);
 
 	if (output == NULL) {
-		g_warning ("couldn't get public key DH value: %s", error->message);
+		g_warning ("couldn't get public key DH value: %s", egg_error_message (error));
 		g_clear_error (&error);
 		g_object_unref (priv);
 		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
@@ -221,7 +222,7 @@ plain_negotiate (GkdSecretSession *self, DBusMessage *message)
 	                                  GP11_INVALID);
 
 	if (key == NULL) {
-		g_warning ("couldn't create null key: %s", error->message);
+		g_warning ("couldn't create null key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED,
 		                                      "Failed to create necessary plain keys.");
@@ -444,7 +445,7 @@ gkd_secret_session_begin (GkdSecretSession *self, const gchar *group,
 	g_object_unref (public);
 
 	if (output == NULL) {
-		g_warning ("couldn't get public key DH value: %s", error->message);
+		g_warning ("couldn't get public key DH value: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -597,11 +598,11 @@ gkd_secret_session_get_item_secret (GkdSecretSession *self, GP11Object *item,
 	gp11_mechanism_unref (mech);
 
 	if (value == NULL) {
-		if (error->code == CKR_USER_NOT_LOGGED_IN) {
+		if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN)) {
 			dbus_set_error_const (derr, SECRET_ERROR_IS_LOCKED,
 			                      "Cannot get secret of a locked object");
 		} else {
-			g_message ("couldn't wrap item secret: %s", error->message);
+			g_message ("couldn't wrap item secret: %s", egg_error_message (error));
 			dbus_set_error_const (derr, DBUS_ERROR_FAILED,
 			                      "Couldn't get item secret");
 		}
@@ -636,7 +637,7 @@ gkd_secret_session_set_item_secret (GkdSecretSession *self, GP11Object *item,
 
 	attrs = gp11_object_get (item, &error, CKA_ID, CKA_G_COLLECTION, GP11_INVALID);
 	if (attrs == NULL) {
-		g_message ("couldn't get item attributes: %s", error->message);
+		g_message ("couldn't get item attributes: %s", egg_error_message (error));
 		dbus_set_error_const (derr, DBUS_ERROR_FAILED, "Couldn't set item secret");
 		g_clear_error (&error);
 		return FALSE;
@@ -656,16 +657,16 @@ gkd_secret_session_set_item_secret (GkdSecretSession *self, GP11Object *item,
 	gp11_attributes_unref (attrs);
 
 	if (object == NULL) {
-		if (error->code == CKR_USER_NOT_LOGGED_IN) {
+		if (g_error_matches (error, GP11_ERROR, CKR_USER_NOT_LOGGED_IN)) {
 			dbus_set_error_const (derr, SECRET_ERROR_IS_LOCKED,
 			                      "Cannot set secret of a locked item");
-		} else if (error->code == CKR_WRAPPED_KEY_INVALID ||
-		           error->code == CKR_WRAPPED_KEY_LEN_RANGE ||
-		           error->code == CKR_MECHANISM_PARAM_INVALID) {
+		} else if (g_error_matches (error, GP11_ERROR, CKR_WRAPPED_KEY_INVALID) ||
+		           g_error_matches (error, GP11_ERROR, CKR_WRAPPED_KEY_LEN_RANGE) ||
+		           g_error_matches (error, GP11_ERROR, CKR_MECHANISM_PARAM_INVALID)) {
 			dbus_set_error_const (derr, DBUS_ERROR_INVALID_ARGS,
 			                      "The secret was transferred or encrypted in an invalid way.");
 		} else {
-			g_message ("couldn't unwrap item secret: %s", error->message);
+			g_message ("couldn't unwrap item secret: %s", egg_error_message (error));
 			dbus_set_error_const (derr, DBUS_ERROR_FAILED, "Couldn't set item secret");
 		}
 		g_clear_error (&error);
@@ -716,15 +717,15 @@ gkd_secret_session_create_credential (GkdSecretSession *self, GP11Session *sessi
 		gp11_attributes_unref (alloc);
 
 	if (object == NULL) {
-		if (error->code == CKR_PIN_INCORRECT) {
+		if (g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT)) {
 			dbus_set_error_const (derr, INTERNAL_ERROR_DENIED, "The password was incorrect.");
-		} else if (error->code == CKR_WRAPPED_KEY_INVALID ||
-		    error->code == CKR_WRAPPED_KEY_LEN_RANGE ||
-		    error->code == CKR_MECHANISM_PARAM_INVALID) {
+		} else if (g_error_matches (error, GP11_ERROR, CKR_WRAPPED_KEY_INVALID) ||
+		           g_error_matches (error, GP11_ERROR, CKR_WRAPPED_KEY_LEN_RANGE) ||
+		           g_error_matches (error, GP11_ERROR, CKR_MECHANISM_PARAM_INVALID)) {
 			dbus_set_error_const (derr, DBUS_ERROR_INVALID_ARGS,
 			                      "The secret was transferred or encrypted in an invalid way.");
 		} else {
-			g_message ("couldn't unwrap credential: %s", error->message);
+			g_message ("couldn't unwrap credential: %s", egg_error_message (error));
 			dbus_set_error_const (derr, DBUS_ERROR_FAILED, "Couldn't use credentials");
 		}
 		g_clear_error (&error);
diff --git a/daemon/dbus/gkd-secret-unlock.c b/daemon/dbus/gkd-secret-unlock.c
index 6f182a9..ee17fd1 100644
--- a/daemon/dbus/gkd-secret-unlock.c
+++ b/daemon/dbus/gkd-secret-unlock.c
@@ -30,6 +30,7 @@
 #include "gkd-secret-unlock.h"
 #include "gkd-secret-util.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "login/gkd-login.h"
@@ -63,7 +64,7 @@ attributes_for_collection (GP11Object *collection)
 
 	attrs = gp11_object_get (collection, &error, CKA_LABEL, CKA_ID, GP11_INVALID);
 	if (attrs == NULL) {
-		g_warning ("couldn't get attributes for collection: %s", error->message);
+		g_warning ("couldn't get attributes for collection: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -206,7 +207,8 @@ prepare_unlock_prompt (GkdSecretUnlock *self, GP11Object *coll, gboolean first)
 			gkd_prompt_set_unlock_options (prompt, template);
 			gp11_attributes_unref (template);
 		} else {
-			g_warning ("couldn't get credential template for collection: %s", error->message);
+			g_warning ("couldn't get credential template for collection: %s",
+			           egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
@@ -228,9 +230,9 @@ check_locked_collection (GP11Object *collection, gboolean *locked)
 
 	value = gp11_object_get_data (collection, CKA_G_LOCKED, &n_value, &error);
 	if (value == NULL) {
-		if (error->code != CKR_OBJECT_HANDLE_INVALID)
+		if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
 			g_warning ("couldn't check locked status of collection: %s",
-			           error->message);
+			           egg_error_message (error));
 		return FALSE;
 	}
 
@@ -269,7 +271,8 @@ attach_credential_to_login (GP11Object *collection, GP11Object *cred)
 		egg_secure_free (value);
 
 	} else {
-		g_warning ("couldn't read unlock credentials to save in login keyring: %s", error->message);
+		g_warning ("couldn't read unlock credentials to save in login keyring: %s",
+		           egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -634,10 +637,10 @@ gkd_secret_unlock_with_password (GP11Object *collection, const guchar *password,
 
 	cred = gp11_session_create_object_full (session, attrs, NULL, &error);
 	if (cred == NULL) {
-		if (error->code == CKR_PIN_INCORRECT) {
+		if (g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT)) {
 			dbus_set_error_const (derr, INTERNAL_ERROR_DENIED, "The password was incorrect.");
 		} else {
-			g_message ("couldn't create credential: %s", error->message);
+			g_message ("couldn't create credential: %s", egg_error_message (error));
 			dbus_set_error_const (derr, DBUS_ERROR_FAILED, "Couldn't use credentials");
 		}
 		g_clear_error (&error);
diff --git a/daemon/gkd-main.c b/daemon/gkd-main.c
index dab83cc..6ac0b65 100644
--- a/daemon/gkd-main.c
+++ b/daemon/gkd-main.c
@@ -31,6 +31,7 @@
 #include "dbus/gkd-dbus.h"
 
 #include "egg/egg-cleanup.h"
+#include "egg/egg-error.h"
 #include "egg/egg-libgcrypt.h"
 #include "egg/egg-secure-memory.h"
 #include "egg/egg-unix-credentials.h"
@@ -122,7 +123,7 @@ parse_arguments (int *argc, char** argv[])
 	g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE);
 
 	if (!g_option_context_parse (context, argc, argv, &err)) {
-		g_printerr ("gnome-keyring-daemon: %s", err && err->message ? err->message : "");
+		g_printerr ("gnome-keyring-daemon: %s", egg_error_message (err));
 		g_clear_error (&err);
 	}
 
diff --git a/daemon/login/gkd-login.c b/daemon/login/gkd-login.c
index 9d38125..bdef57d 100644
--- a/daemon/login/gkd-login.c
+++ b/daemon/login/gkd-login.c
@@ -23,6 +23,7 @@
 
 #include "gkd-login.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "pkcs11/gkd-pkcs11.h"
@@ -117,8 +118,8 @@ lookup_login_session (GP11Module *module)
 	g_return_val_if_fail (slot, NULL);
 
 	session = open_and_login_session (slot, CKU_USER, &error);
-	if (session == NULL) {
-		g_warning ("couldn't open pkcs11 session for login: %s", error->message);
+	if (error) {
+		g_warning ("couldn't open pkcs11 session for login: %s", egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -144,7 +145,7 @@ lookup_login_keyring (GP11Session *session)
 	                                     GP11_INVALID);
 
 	if (error) {
-		g_warning ("couldn't search for login keyring: %s", error->message);
+		g_warning ("couldn't search for login keyring: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -238,17 +239,17 @@ unlock_or_create_login (GP11Module *module, const gchar *master)
 
 	/* Failure, bad password? */
 	if (cred == NULL) {
-		if (login && error->code == CKR_PIN_INCORRECT)
+		if (login && g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT))
 			note_that_unlock_failed ();
 		else
-			g_warning ("couldn't create login credential: %s", error->message);
+			g_warning ("couldn't create login credential: %s", egg_error_message (error));
 		g_clear_error (&error);
 
 	/* Non login keyring, create it */
 	} else if (!login) {
 		login = create_login_keyring (session, cred, &error);
-		if (login == NULL) {
-			g_warning ("couldn't create login keyring: %s", error->message);
+		if (login == NULL && error) {
+			g_warning ("couldn't create login keyring: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 
@@ -293,8 +294,9 @@ init_pin_for_uninitialized_slots (GP11Module *module, const gchar *master)
 					                         "serial-number", info->serial_number,
 					                         NULL);
 				} else {
-					if (error->code != CKR_FUNCTION_NOT_SUPPORTED)
-						g_warning ("couldn't initialize slot with master password: %s", error->message);
+					if (!g_error_matches (error, GP11_ERROR, CKR_FUNCTION_NOT_SUPPORTED))
+						g_warning ("couldn't initialize slot with master password: %s",
+						           egg_error_message (error));
 					g_clear_error (&error);
 				}
 				g_object_unref (session);
@@ -348,19 +350,21 @@ change_or_create_login (GP11Module *module, const gchar *original, const gchar *
 	/* Create the new credential we'll be changing to */
 	mcred = create_credential (session, NULL, master, &error);
 	if (mcred == NULL) {
-		g_warning ("couldn't create new login credential: %s", error->message);
+		g_warning ("couldn't create new login credential: %s", egg_error_message (error));
 		g_clear_error (&error);
 
 	/* Create original credentials */
 	} else if (login) {
 		ocred = create_credential (session, login, original, &error);
 		if (ocred == NULL) {
-			if (error->code == CKR_PIN_INCORRECT) {
+			if (g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT)) {
 				g_message ("couldn't change login master password, "
-				           "original password was wrong: %s", error->message);
+				           "original password was wrong: %s",
+				           egg_error_message (error));
 				note_that_unlock_failed ();
 			} else {
-				g_warning ("couldn't create original login credential: %s", error->message);
+				g_warning ("couldn't create original login credential: %s",
+				           egg_error_message (error));
 			}
 			g_clear_error (&error);
 		}
@@ -370,7 +374,7 @@ change_or_create_login (GP11Module *module, const gchar *original, const gchar *
 	if (!login && mcred) {
 		login = create_login_keyring (session, mcred, &error);
 		if (login == NULL) {
-			g_warning ("couldn't create login keyring: %s", error->message);
+			g_warning ("couldn't create login keyring: %s", egg_error_message (error));
 			g_clear_error (&error);
 		} else {
 			success = TRUE;
@@ -381,7 +385,7 @@ change_or_create_login (GP11Module *module, const gchar *original, const gchar *
 		if (!gp11_object_set (login, &error,
 		                      CKA_G_CREDENTIAL, GP11_ULONG, gp11_object_get_handle (mcred),
 		                      GP11_INVALID)) {
-			g_warning ("couldn't change login master password: %s", error->message);
+			g_warning ("couldn't change login master password: %s", egg_error_message (error));
 			g_clear_error (&error);
 		} else {
 			success = TRUE;
@@ -432,8 +436,10 @@ set_pin_for_any_slots (GP11Module *module, const gchar *original, const gchar *m
 					                         "serial-number", info->serial_number,
 					                         NULL);
 				} else {
-					if (error->code != CKR_PIN_INCORRECT && error->code != CKR_FUNCTION_NOT_SUPPORTED)
-						g_warning ("couldn't change slot master password: %s", error->message);
+					if (!g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT) &&
+					    !g_error_matches (error, GP11_ERROR, CKR_FUNCTION_NOT_SUPPORTED))
+						g_warning ("couldn't change slot master password: %s",
+						           egg_error_message (error));
 					g_clear_error (&error);
 				}
 				g_object_unref (session);
@@ -537,7 +543,7 @@ find_login_keyring_item (GP11Session *session, GP11Attribute *fields)
 	                                     GP11_INVALID);
 
 	if (!search) {
-		g_warning ("couldn't create search for login keyring: %s", error->message);
+		g_warning ("couldn't create search for login keyring: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -549,7 +555,7 @@ find_login_keyring_item (GP11Session *session, GP11Attribute *fields)
 	g_object_unref (search);
 
 	if (data == NULL) {
-		g_warning ("couldn't read search in login keyring: %s", error->message);
+		g_warning ("couldn't read search in login keyring: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -613,7 +619,7 @@ gkd_login_attach_secret (const gchar *label, const gchar *secret,
 	}
 
 	if (error != NULL) {
-		g_warning ("couldn't store secret in login keyring: %s", error->message);
+		g_warning ("couldn't store secret in login keyring: %s", egg_error_message (error));
 		g_clear_error (&error);
 	}
 
@@ -684,8 +690,9 @@ gkd_login_remove_secret (const gchar *first, ...)
 	item = find_login_keyring_item (session, &fields);
 	if (item != NULL) {
 		if (!gp11_object_destroy (item, &error)) {
-			if (error->code != CKR_OBJECT_HANDLE_INVALID)
-				g_warning ("couldn't remove stored secret from login keyring: %s", error->message);
+			if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
+				g_warning ("couldn't remove stored secret from login keyring: %s",
+				           egg_error_message (error));
 			g_clear_error (&error);
 		}
 		g_object_unref (item);
diff --git a/daemon/prompt/gkd-prompt-tool.c b/daemon/prompt/gkd-prompt-tool.c
index 19257f2..ab03fdb 100644
--- a/daemon/prompt/gkd-prompt-tool.c
+++ b/daemon/prompt/gkd-prompt-tool.c
@@ -26,6 +26,7 @@
 
 #include "egg/egg-dh.h"
 #include "egg/egg-entry-buffer.h"
+#include "egg/egg-error.h"
 #include "egg/egg-libgcrypt.h"
 #include "egg/egg-secure-memory.h"
 
@@ -359,8 +360,7 @@ prepare_dialog (GtkBuilder *builder)
 	GtkDialog *dialog;
 
 	if (!gtk_builder_add_from_file (builder, UIDIR "gkd-prompt.ui", &error)) {
-		g_warning ("couldn't load prompt ui file: %s",
-		           error && error->message ? error->message : "");
+		g_warning ("couldn't load prompt ui file: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return NULL;
 	}
@@ -889,7 +889,7 @@ main (int argc, char *argv[])
 	g_free (data);
 
 	if (!ret)
-		fatal ("couldn't parse auth dialog instructions", err ? err->message : "");
+		fatal ("couldn't parse auth dialog instructions", egg_error_message (err));
 
 	run_dialog ();
 
@@ -906,7 +906,7 @@ main (int argc, char *argv[])
 	g_key_file_free (output_data);
 
 	if (!data)
-		fatal ("couldn't format auth dialog response: %s", err ? err->message : "");
+		fatal ("couldn't format auth dialog response: %s", egg_error_message (err));
 
 	write_all_output (data, length);
 	g_free (data);
diff --git a/daemon/prompt/gkd-prompt.c b/daemon/prompt/gkd-prompt.c
index 104db8f..a4ea7fc 100644
--- a/daemon/prompt/gkd-prompt.c
+++ b/daemon/prompt/gkd-prompt.c
@@ -27,6 +27,7 @@
 
 #include "egg/egg-cleanup.h"
 #include "egg/egg-dh.h"
+#include "egg/egg-error.h"
 #include "egg/egg-hex.h"
 #include "egg/egg-secure-memory.h"
 #include "egg/egg-spawn.h"
@@ -256,8 +257,7 @@ on_io_completed (gpointer user_data)
 		if (!g_key_file_load_from_data (self->pv->output, self->pv->out_data->str,
 						self->pv->out_data->len, G_KEY_FILE_NONE, &error)) {
 			g_key_file_free (self->pv->output);
-			g_warning ("couldn't parse output from prompt: %s",
-				   error && error->message ? error->message : "");
+			g_warning ("couldn't parse output from prompt: %s", egg_error_message (error));
 			g_clear_error (&error);
 			mark_failed (self);
 		} else {
@@ -372,8 +372,7 @@ prepare_input_data (GkdPrompt *self)
 
 	self->pv->in_data = g_key_file_to_data (self->pv->input, &self->pv->in_length, &error);
 	if (!self->pv->in_data) {
-		g_warning ("couldn't encode data for prompt: %s",
-		           error && error->message ? error->message : "");
+		g_warning ("couldn't encode data for prompt: %s", egg_error_message (error));
 		g_clear_error (&error);
 		mark_failed (self);
 		return FALSE;
@@ -434,8 +433,7 @@ display_async_prompt (GkdPrompt *self)
 	                                                   &self->pv->pid, &callbacks, g_object_ref (self),
 	                                                   NULL, &error);
 	if (!self->pv->io_tag) {
-		g_warning ("couldn't spawn prompt tool: %s",
-		           error && error->message ? error->message : "");
+		g_warning ("couldn't spawn prompt tool: %s", egg_error_message (error));
 		g_clear_error (&error);
 		self->pv->pid = 0;
 		mark_failed (self);
diff --git a/daemon/ssh-agent/gkd-ssh-agent-ops.c b/daemon/ssh-agent/gkd-ssh-agent-ops.c
index a8d2da7..759a06a 100644
--- a/daemon/ssh-agent/gkd-ssh-agent-ops.c
+++ b/daemon/ssh-agent/gkd-ssh-agent-ops.c
@@ -30,6 +30,7 @@
 #include "pkcs11/pkcs11g.h"
 #include "pkcs11/pkcs11i.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include <glib.h>
@@ -72,7 +73,7 @@ login_session (GP11Session *session)
 	/* Log in the session if necessary */
 	if (info->state == CKS_RO_PUBLIC_SESSION || info->state == CKS_RW_PUBLIC_SESSION) {
 		if (!gp11_session_login (session, CKU_USER, NULL, 0, &error)) {
-			g_message ("couldn't log in to session: %s", error->message);
+			g_message ("couldn't log in to session: %s", egg_error_message (error));
 			ret = FALSE;
 		}
 	}
@@ -134,7 +135,7 @@ search_keys_like_attributes (gpointer session_or_module, GP11Attributes *attrs,
 	if (GP11_IS_MODULE (session_or_module)) {
 		if (!gp11_module_enumerate_objects_full (session_or_module, search, NULL,
 		                                         func, user_data, &error)) {
-			g_warning ("couldn't enumerate matching keys: %s", error->message);
+			g_warning ("couldn't enumerate matching keys: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 
@@ -143,7 +144,7 @@ search_keys_like_attributes (gpointer session_or_module, GP11Attributes *attrs,
 		keys = gp11_session_find_objects_full (session_or_module, search, NULL, &error);
 
 		if (error) {
-			g_warning ("couldn't find matching keys: %s", error->message);
+			g_warning ("couldn't find matching keys: %s", egg_error_message (error));
 			g_clear_error (&error);
 
 		} else {
@@ -206,7 +207,7 @@ return_private_matching (GP11Object *object, gpointer user_data)
 	/* Get the key identifier and token */
 	attrs = gp11_object_get (object, &error, CKA_ID, CKA_TOKEN, GP11_INVALID);
 	if (error) {
-		g_warning ("error retrieving attributes for public key: %s", error->message);
+		g_warning ("error retrieving attributes for public key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return TRUE;
 	}
@@ -264,7 +265,7 @@ load_identity_v1_attributes (GP11Object *object, gpointer user_data)
 	attrs = gp11_object_get (object, &error, CKA_ID, CKA_LABEL, CKA_KEY_TYPE, CKA_MODULUS,
 	                         CKA_PUBLIC_EXPONENT, CKA_CLASS, CKA_MODULUS_BITS, GP11_INVALID);
 	if (error) {
-		g_warning ("error retrieving attributes for public key: %s", error->message);
+		g_warning ("error retrieving attributes for public key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return TRUE;
 	}
@@ -295,7 +296,7 @@ load_identity_v2_attributes (GP11Object *object, gpointer user_data)
 	                         CKA_PUBLIC_EXPONENT, CKA_PRIME, CKA_SUBPRIME, CKA_BASE,
 	                         CKA_VALUE, CKA_CLASS, CKA_MODULUS_BITS, CKA_TOKEN, GP11_INVALID);
 	if (error) {
-		g_warning ("error retrieving attributes for public key: %s", error->message);
+		g_warning ("error retrieving attributes for public key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return TRUE;
 	}
@@ -339,8 +340,8 @@ remove_key_pair (GP11Session *session, GP11Object *priv, GP11Object *pub)
 		gp11_object_destroy (priv, &error);
 
 		if (error) {
-			if (error->code != CKR_OBJECT_HANDLE_INVALID)
-				g_warning ("couldn't remove ssh private key: %s", error->message);
+			if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
+				g_warning ("couldn't remove ssh private key: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
@@ -350,8 +351,8 @@ remove_key_pair (GP11Session *session, GP11Object *priv, GP11Object *pub)
 		gp11_object_destroy (pub, &error);
 
 		if (error) {
-			if (error->code != CKR_OBJECT_HANDLE_INVALID)
-				g_warning ("couldn't remove ssh public key: %s", error->message);
+			if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
+				g_warning ("couldn't remove ssh public key: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
@@ -377,7 +378,7 @@ lock_key_pair (GP11Session *session, GP11Object *priv, GP11Object *pub)
 	                                     GP11_INVALID);
 
 	if (error) {
-		g_warning ("couldn't search for authenticator objects: %s", error->message);
+		g_warning ("couldn't search for authenticator objects: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return;
 	}
@@ -386,7 +387,7 @@ lock_key_pair (GP11Session *session, GP11Object *priv, GP11Object *pub)
 	for (l = objects; l; l = g_list_next (l)) {
 		gp11_object_destroy (l->data, &error);
 		if (error) {
-			g_warning ("couldn't delete authenticator object: %s", error->message);
+			g_warning ("couldn't delete authenticator object: %s", egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
@@ -412,7 +413,7 @@ remove_by_public_key (GP11Session *session, GP11Object *pub, gboolean exclude_v1
 	                         CKA_LABEL, CKA_ID, CKA_TOKEN,
 	                         GP11_INVALID);
 	if (error) {
-		g_warning ("couldn't lookup attributes for key: %s", error->message);
+		g_warning ("couldn't lookup attributes for key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return;
 	}
@@ -436,7 +437,7 @@ remove_by_public_key (GP11Session *session, GP11Object *pub, gboolean exclude_v1
 	gp11_attributes_unref (attrs);
 
 	if (error) {
-		g_warning ("couldn't search for related key: %s", error->message);
+		g_warning ("couldn't search for related key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return;
 	}
@@ -466,14 +467,14 @@ create_key_pair (GP11Session *session, GP11Attributes *priv, GP11Attributes *pub
 
 	priv_key = gp11_session_create_object_full (session, priv, NULL, &error);
 	if (error) {
-		g_warning ("couldn't create session private key: %s", error->message);
+		g_warning ("couldn't create session private key: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return FALSE;
 	}
 
 	pub_key = gp11_session_create_object_full (session, pub, NULL, &error);
 	if (error) {
-		g_warning ("couldn't create session public key: %s", error->message);
+		g_warning ("couldn't create session public key: %s", egg_error_message (error));
 		g_clear_error (&error);
 
 		/* Failed, so remove private as well */
@@ -501,8 +502,9 @@ destroy_replaced_keys (GP11Session *session, GList *keys)
 	for (l = keys; l; l = g_list_next (l)) {
 		gp11_object_set_session (l->data, session);
 		if (!gp11_object_destroy (l->data, &error)) {
-			if (error->code != CKR_OBJECT_HANDLE_INVALID)
-				g_warning ("couldn't delete a SSH key we replaced: %s", error->message);
+			if (!g_error_matches (error, GP11_ERROR, CKR_OBJECT_HANDLE_INVALID))
+				g_warning ("couldn't delete a SSH key we replaced: %s",
+				           egg_error_message (error));
 			g_clear_error (&error);
 		}
 	}
@@ -967,8 +969,8 @@ op_sign_request (GkdSshAgentCall *call)
 	g_free (hash);
 
 	if (error) {
-		if (error->code != CKR_FUNCTION_CANCELED)
-			g_message ("signing of the data failed: %s", error->message);
+		if (!g_error_matches (error, GP11_ERROR, CKR_FUNCTION_CANCELED))
+			g_message ("signing of the data failed: %s", egg_error_message (error));
 		g_clear_error (&error);
 		egg_buffer_add_byte (call->resp, GKD_SSH_RES_FAILURE);
 		return TRUE;
@@ -1084,8 +1086,8 @@ op_v1_challenge (GkdSshAgentCall *call)
 	g_object_unref (key);
 
 	if (error) {
-		if (error->code != CKR_FUNCTION_CANCELED)
-			g_message ("decryption of the data failed: %s", error->message);
+		if (!g_error_matches (error, GP11_ERROR, CKR_FUNCTION_CANCELED))
+			g_message ("decryption of the data failed: %s", egg_error_message (error));
 		g_clear_error (&error);
 		egg_buffer_add_byte (call->resp, GKD_SSH_RES_FAILURE);
 		return TRUE;
diff --git a/daemon/ssh-agent/gkd-ssh-agent-standalone.c b/daemon/ssh-agent/gkd-ssh-agent-standalone.c
index acfe3c9..349f86d 100644
--- a/daemon/ssh-agent/gkd-ssh-agent-standalone.c
+++ b/daemon/ssh-agent/gkd-ssh-agent-standalone.c
@@ -25,6 +25,7 @@
 #include "gkd-ssh-agent.h"
 #include "gkd-ssh-agent-private.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "gp11/gp11.h"
@@ -98,7 +99,7 @@ main(int argc, char *argv[])
 
 	module = gp11_module_initialize (argv[1], argc > 2 ? argv[2] : NULL, &error);
 	if (!module) {
-		g_message ("couldn't load pkcs11 module: %s", error->message);
+		g_message ("couldn't load pkcs11 module: %s", egg_error_message (error));
 		g_clear_error (&error);
 		return 1;
 	}
diff --git a/daemon/ssh-agent/gkd-ssh-agent.c b/daemon/ssh-agent/gkd-ssh-agent.c
index 50a1b79..be2f89e 100644
--- a/daemon/ssh-agent/gkd-ssh-agent.c
+++ b/daemon/ssh-agent/gkd-ssh-agent.c
@@ -37,6 +37,7 @@
 #include "gkd-ssh-agent-private.h"
 
 #include "egg/egg-buffer.h"
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #ifndef HAVE_SOCKLEN_T
@@ -285,7 +286,7 @@ gkd_ssh_agent_accept (void)
 	client->thread = g_thread_create (run_client_thread, &client->sock, TRUE, &error);
 	if (!client->thread) {
 		g_warning ("couldn't create thread SSH agent connection: %s",
-		           error && error->message ? error->message : "");
+		           egg_error_message (error));
 		g_slice_free (Client, client);
 		return;
 	}
@@ -382,7 +383,7 @@ gkd_ssh_agent_initialize_with_module (GP11Module *module)
 			/* Try and open a session */
 			session = gp11_slot_open_session (l->data, CKF_SERIAL_SESSION, &error);
 			if (!session) {
-				g_warning ("couldn't create pkcs#11 session: %s", error->message);
+				g_warning ("couldn't create pkcs#11 session: %s", egg_error_message (error));
 				g_clear_error (&error);
 			}
 		}
diff --git a/egg/egg-error.h b/egg/egg-error.h
new file mode 100644
index 0000000..50f459c
--- /dev/null
+++ b/egg/egg-error.h
@@ -0,0 +1,34 @@
+/*
+ * gnome-keyring
+ *
+ * Copyright (C) 2010 Stefan Walter
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General  License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General  License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef EGG_ERROR_H_
+#define EGG_ERROR_H_
+
+#include <glib.h>
+
+static inline const gchar*
+egg_error_message (GError *error)
+{
+	g_return_val_if_fail (error, "(unknown)");
+	return error->message ? error->message : "(null)";
+}
+
+#endif /* EGG_ERROR_H_ */
diff --git a/gcr/gcr-library.c b/gcr/gcr-library.c
index 6f91ae2..cf08716 100644
--- a/gcr/gcr-library.c
+++ b/gcr/gcr-library.c
@@ -25,6 +25,7 @@
 #include "gcr-types.h"
 #include "gcr-internal.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-libgcrypt.h"
 #include "egg/egg-secure-memory.h"
 
@@ -127,7 +128,7 @@ _gcr_initialize (void)
 			all_modules = g_list_prepend (all_modules, module);
 		} else { 
 			g_message ("couldn't initialize PKCS#11 module: %s",
-			           error && error->message ? error->message : "");
+			           egg_error_message (error));
 		}
 
 		g_once_init_leave (&gcr_initialized, 1);
diff --git a/gcr/tests/unit-test-parser.c b/gcr/tests/unit-test-parser.c
index 252d1db..cf0108e 100644
--- a/gcr/tests/unit-test-parser.c
+++ b/gcr/tests/unit-test-parser.c
@@ -25,6 +25,7 @@
 
 #include "run-auto-test.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "gcr/gcr-parser.h"
@@ -129,7 +130,7 @@ DEFINE_TEST(parse_all)
 		result = gcr_parser_parse_data (parser, contents, len, &err);
 		if (!result) { 
 			g_warning ("couldn't parse file data: %s: %s", 
-			           filename, err && err->message ? err->message : "");
+			           filename, egg_error_message (err));
 			g_error_free (err);
 			g_assert (FALSE);
 		}
diff --git a/gp11/gp11-module.c b/gp11/gp11-module.c
index 3fb3faa..8537a2d 100644
--- a/gp11/gp11-module.c
+++ b/gp11/gp11-module.c
@@ -1172,7 +1172,7 @@ gp11_module_enumerate_objects_full (GP11Module *self, GP11Attributes *attrs,
 			g_return_val_if_fail (error != NULL, FALSE);
 			
 			/* Ignore these errors when enumerating */
-			if (error->code == CKR_USER_PIN_NOT_INITIALIZED) {
+			if (g_error_matches (error, GP11_ERROR, CKR_USER_PIN_NOT_INITIALIZED)) {
 				g_clear_error (&error);
 				
 			} else {
diff --git a/pkcs11/gck/gck-file-tracker.c b/pkcs11/gck/gck-file-tracker.c
index c21de4a..517677d 100644
--- a/pkcs11/gck/gck-file-tracker.c
+++ b/pkcs11/gck/gck-file-tracker.c
@@ -25,6 +25,8 @@
 
 #include "gck-file-tracker.h"
 
+#include "egg/egg-error.h"
+
 #include <glib.h>
 #include <glib/gstdio.h>
 
@@ -155,8 +157,8 @@ update_directory (GckFileTracker *self, gboolean force_all, GHashTable *checks)
 	dir = g_dir_open (self->directory_path, 0, &err);
 	if (dir == NULL) {
 		if (errno != ENOENT && errno != ENOTDIR && errno != EPERM)
-			g_message ("couldn't list keyrings at: %s: %s", self->directory_path, 
-		        	   err && err->message ? err->message : "");
+			g_message ("couldn't list keyrings at: %s: %s", self->directory_path,
+			           egg_error_message (err));
 		g_error_free (err);  
 		return;
 	}
diff --git a/pkcs11/gck/gck-timer.c b/pkcs11/gck/gck-timer.c
index 999670b..70b653d 100644
--- a/pkcs11/gck/gck-timer.c
+++ b/pkcs11/gck/gck-timer.c
@@ -23,6 +23,8 @@
 
 #include "gck-timer.h"
 
+#include "egg/egg-error.h"
+
 #include <glib.h>
 
 struct _GckTimer {
@@ -116,7 +118,7 @@ gck_timer_initialize (void)
 				timer_cond = g_cond_new ();
 			} else {
 				g_warning ("could not create timer thread: %s", 
-				           error && error->message ? error->message : "");
+				           egg_error_message (error));
 			}
 		}
 
diff --git a/pkcs11/roots-store/gck-roots-module.c b/pkcs11/roots-store/gck-roots-module.c
index 5d391de..f6418e8 100644
--- a/pkcs11/roots-store/gck-roots-module.c
+++ b/pkcs11/roots-store/gck-roots-module.c
@@ -28,6 +28,7 @@
 #include "gck/gck-file-tracker.h"
 #include "gck/gck-serializable.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-openssl.h"
 
 #include <string.h>
@@ -187,7 +188,7 @@ file_load (GckFileTracker *tracker, const gchar *path, GckRootsModule *self)
 	/* Read in the public key */
 	if (!g_file_get_contents (path, (gchar**)&data, &n_data, &error)) {
 		g_warning ("couldn't load root certificates: %s: %s",
-		           path, error && error->message ? error->message : "");
+		           path, egg_error_message (error));
 		return;
 	}
 	
diff --git a/pkcs11/rpc-layer/gck-rpc-dispatch.c b/pkcs11/rpc-layer/gck-rpc-dispatch.c
index 73839ff..f2961d0 100644
--- a/pkcs11/rpc-layer/gck-rpc-dispatch.c
+++ b/pkcs11/rpc-layer/gck-rpc-dispatch.c
@@ -30,6 +30,7 @@
 #include "pkcs11/pkcs11g.h"
 #include "pkcs11/pkcs11i.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-unix-credentials.h"
 
 #include <sys/types.h>
@@ -2223,7 +2224,7 @@ gck_rpc_layer_accept (void)
 	
 	ds->thread = g_thread_create (run_dispatch_thread, &(ds->socket), TRUE, &error);
 	if (!ds->thread) {
-		gck_rpc_warn ("couldn't start thread: %s", error && error->message ? error->message : "");
+		gck_rpc_warn ("couldn't start thread: %s", egg_error_message (error));
 		close (new_fd);
 		free (ds);
 		return;
diff --git a/pkcs11/secret-store/gck-secret-collection.c b/pkcs11/secret-store/gck-secret-collection.c
index aceb3be..e27d1ef 100644
--- a/pkcs11/secret-store/gck-secret-collection.c
+++ b/pkcs11/secret-store/gck-secret-collection.c
@@ -27,6 +27,8 @@
 #include "gck-secret-item.h"
 #include "gck-secret-textual.h"
 
+#include "egg/egg-error.h"
+
 #include "gck/gck-attributes.h"
 #include "gck/gck-credential.h"
 #include "gck/gck-secret.h"
@@ -73,7 +75,7 @@ load_collection_and_secret_data (GckSecretCollection *self, GckSecretData *sdata
 	/* Read in the keyring */
 	if (!g_file_get_contents (path, (gchar**)&data, &n_data, &error)) {
 		g_message ("problem reading keyring: %s: %s",
-		           path, error && error->message ? error->message : "");
+		           path, egg_error_message (error));
 		g_clear_error (&error);
 		return GCK_DATA_FAILURE;
 	}
diff --git a/pkcs11/secret-store/gck-secret-textual.c b/pkcs11/secret-store/gck-secret-textual.c
index 2eaddd9..1627ac9 100644
--- a/pkcs11/secret-store/gck-secret-textual.c
+++ b/pkcs11/secret-store/gck-secret-textual.c
@@ -30,8 +30,9 @@
 #include "gck-secret-item.h"
 #include "gck-secret-textual.h"
 
-#include "egg/egg-secure-memory.h"
+#include "egg/egg-error.h"
 #include "egg/egg-hex.h"
+#include "egg/egg-secure-memory.h"
 
 #include "gck/gck-secret.h"
 
@@ -424,7 +425,7 @@ gck_secret_textual_write (GckSecretCollection *collection, GckSecretData *sdata,
 	g_key_file_free (file);
 
 	if (!*data) {
-		g_warning ("couldn't generate textual keyring file: %s", err->message);
+		g_warning ("couldn't generate textual keyring file: %s", egg_error_message (err));
 		return GCK_DATA_FAILURE;
 	}
 
diff --git a/pkcs11/ssh-store/gck-ssh-module.c b/pkcs11/ssh-store/gck-ssh-module.c
index b9fa2cf..1f851a3 100644
--- a/pkcs11/ssh-store/gck-ssh-module.c
+++ b/pkcs11/ssh-store/gck-ssh-module.c
@@ -25,6 +25,8 @@
 #include "gck-ssh-private-key.h"
 #include "gck-ssh-public-key.h"
 
+#include "egg/egg-error.h"
+
 #include "gck/gck-file-tracker.h"
 
 #include <string.h>
@@ -130,8 +132,7 @@ file_load (GckFileTracker *tracker, const gchar *path, GckSshModule *self)
 	/* Parse the data into the key */
 	if (!gck_ssh_private_key_parse (key, path, private_path, &error)) {
 		if (error) {
-			g_message ("couldn't parse data: %s: %s", path,
-			           error->message ? error->message : "");
+			g_message ("couldn't parse data: %s: %s", path, egg_error_message (error));
 			g_clear_error (&error);
 		}
 		gck_object_expose (GCK_OBJECT (key), FALSE);
diff --git a/pkcs11/user-store/gck-user-storage.c b/pkcs11/user-store/gck-user-storage.c
index 5b002e6..3d46e6f 100644
--- a/pkcs11/user-store/gck-user-storage.c
+++ b/pkcs11/user-store/gck-user-storage.c
@@ -34,6 +34,7 @@
 #include "gck/gck-serializable.h"
 #include "gck/gck-util.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-hex.h"
 
 #include "pkcs11/pkcs11i.h"
@@ -530,7 +531,7 @@ data_file_entry_added (GckDataFile *store, const gchar *identifier, GckUserStora
 	
 	if (ret == FALSE) {
 		g_warning ("couldn't read file in user store: %s: %s", identifier, 
-		           error && error->message ? error->message : "");
+		           egg_error_message (error));
 		g_clear_error (&error);
 		return;
 	}
@@ -624,7 +625,7 @@ relock_object (GckUserStorage *self, GckTransaction *transaction, const gchar *p
 	/* Read in the data for the object */
 	if (!g_file_get_contents (path, (gchar**)&data, &n_data, &error)) {
 		g_message ("couldn't load file in user store in order to relock: %s: %s", identifier,
-		           error && error->message ? error->message : "");
+		           egg_error_message (error));
 		g_clear_error (&error);
 		g_object_unref (object);
 		gck_transaction_fail (transaction, CKR_GENERAL_ERROR);
diff --git a/tests/gtest-helpers.c b/tests/gtest-helpers.c
index d8164fb..bf976ea 100644
--- a/tests/gtest-helpers.c
+++ b/tests/gtest-helpers.c
@@ -35,6 +35,7 @@
 
 #include "gtest-helpers.h"
 
+#include "egg/egg-error.h"
 #include "egg/egg-secure-memory.h"
 
 #include "pkcs11/pkcs11.h"
@@ -150,7 +151,7 @@ test_data_read (const gchar *basename, gsize *n_result)
 	file = test_data_filename (basename);
 	if (!g_file_get_contents (file, &result, n_result, &error)) {
 		g_warning ("could not read test data file: %s: %s", file,
-		           error && error->message ? error->message : "");
+		           egg_error_message (error));
 		g_assert_not_reached ();
 	}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]