[gnome-keyring] Fix storage and testing problems.



commit 849983f51c916c940aa8e78fbffaaa4defa4741f
Author: Stef Walter <stef memberwebs com>
Date:   Tue Feb 9 03:30:55 2010 +0000

    Fix storage and testing problems.
    
     * Add object store before trying to set attributes.
     * Return correct code when non-key is passed to
       C_XxxxInit

 pkcs11/gck/gck-module.c             |   24 +++++++++++++++++++++---
 pkcs11/gck/gck-module.h             |   10 ++++++++--
 pkcs11/gck/gck-session.c            |   24 +++++++++++++++++-------
 pkcs11/user-store/gck-user-module.c |   20 +++++++++-----------
 4 files changed, 55 insertions(+), 23 deletions(-)
---
diff --git a/pkcs11/gck/gck-module.c b/pkcs11/gck/gck-module.c
index 3d68e4f..4fe9eb0 100644
--- a/pkcs11/gck/gck-module.c
+++ b/pkcs11/gck/gck-module.c
@@ -496,6 +496,12 @@ gck_module_real_refresh_token (GckModule *self)
 }
 
 static void
+gck_module_real_add_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
+{
+	/* Derived class should override, default does nothing */
+}
+
+static void
 gck_module_real_store_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
 {
 	/* Derived classes should do something interesting */
@@ -707,6 +713,7 @@ gck_module_class_init (GckModuleClass *klass)
 	klass->get_token_info = gck_module_real_get_token_info;
 	klass->parse_argument = gck_module_real_parse_argument;
 	klass->refresh_token = gck_module_real_refresh_token;
+	klass->add_token_object = gck_module_real_add_token_object;
 	klass->store_token_object = gck_module_real_store_token_object;
 	klass->remove_token_object = gck_module_real_remove_token_object;
 	klass->login_change = gck_module_real_login_change;
@@ -834,21 +841,32 @@ gck_module_refresh_token (GckModule *self)
 }
 
 void
-gck_module_store_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
+gck_module_add_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
 {
 	g_return_if_fail (GCK_IS_MODULE (self));
 	g_return_if_fail (GCK_IS_OBJECT (object));
-	g_assert (GCK_MODULE_GET_CLASS (self)->store_token_object);
+	g_assert (GCK_MODULE_GET_CLASS (self)->add_token_object);
 
 	if (gck_object_is_transient (object)) {
 		if (g_hash_table_lookup (self->pv->transient_objects, object) == NULL)
 			add_transient_object (self, transaction, object);
 	} else {
-		GCK_MODULE_GET_CLASS (self)->store_token_object (self, transaction, object);
+		GCK_MODULE_GET_CLASS (self)->add_token_object (self, transaction, object);
 	}
 }
 
 void
+gck_module_store_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
+{
+	g_return_if_fail (GCK_IS_MODULE (self));
+	g_return_if_fail (GCK_IS_OBJECT (object));
+	g_assert (GCK_MODULE_GET_CLASS (self)->store_token_object);
+
+	if (!gck_object_is_transient (object))
+		GCK_MODULE_GET_CLASS (self)->store_token_object (self, transaction, object);
+}
+
+void
 gck_module_remove_token_object (GckModule *self, GckTransaction *transaction, GckObject *object)
 {
 	g_return_if_fail (GCK_IS_MODULE (self));
diff --git a/pkcs11/gck/gck-module.h b/pkcs11/gck/gck-module.h
index 0923671..a6f4304 100644
--- a/pkcs11/gck/gck-module.h
+++ b/pkcs11/gck/gck-module.h
@@ -57,9 +57,11 @@ struct _GckModuleClass {
 	const CK_TOKEN_INFO* (*get_token_info) (GckModule *self);
 
 	CK_RV (*refresh_token) (GckModule *self);
-	
+
+	void (*add_token_object) (GckModule *self, GckTransaction *transaction, GckObject *object);
+
 	void (*store_token_object) (GckModule *self, GckTransaction *transaction, GckObject *object);
-	
+
 	void (*remove_token_object) (GckModule *self, GckTransaction *transaction, GckObject *object);
 
 	CK_RV (*login_change) (GckModule *self, CK_SLOT_ID slot_id, 
@@ -134,6 +136,10 @@ CK_RV                  gck_module_logout_so                       (GckModule *se
 
 CK_RV                  gck_module_refresh_token                   (GckModule *self);
 
+void                   gck_module_add_token_object                (GckModule *self,
+                                                                   GckTransaction *transaction,
+                                                                   GckObject *object);
+
 void                   gck_module_store_token_object              (GckModule *self,
                                                                    GckTransaction *transaction,
                                                                    GckObject *object);
diff --git a/pkcs11/gck/gck-session.c b/pkcs11/gck/gck-session.c
index 7b19f67..1389d7d 100644
--- a/pkcs11/gck/gck-session.c
+++ b/pkcs11/gck/gck-session.c
@@ -125,8 +125,9 @@ prepare_crypto (GckSession *self, CK_MECHANISM_PTR mech,
 	CK_ULONG n_mechanisms, i;
 	gsize n_data;
 	gboolean have;
+	gulong key_type;
 	CK_RV rv;
-	
+
 	g_assert (GCK_IS_SESSION (self));
 
 	/* Cancel any current operation */
@@ -142,7 +143,8 @@ prepare_crypto (GckSession *self, CK_MECHANISM_PTR mech,
 	if (rv != CKR_OK)
 		return rv;
 
-	if (!GCK_IS_OBJECT (object))
+	/* Make sure it's a key */
+	if (!gck_object_get_attribute_ulong (object, self, CKA_KEY_TYPE, &key_type))
 		return CKR_KEY_HANDLE_INVALID;
 
 	/* Lookup the mechanisms this object can do */
@@ -870,6 +872,14 @@ gck_session_complete_object_creation (GckSession *self, GckTransaction *transact
 		return;
 	}
 
+	/* Add the object to session or token */
+	if (!gck_transaction_get_failed (transaction)) {
+		if (gck_object_is_token (object))
+			gck_module_add_token_object (self->pv->module, transaction, object);
+		else
+			add_object (self, transaction, object);
+	}
+
 	/* Next go through and set all attributes that weren't used initially */
 	gck_attributes_consume (attrs, n_attrs, CKA_TOKEN, G_MAXULONG);
 	for (i = 0; i < n_attrs && !gck_transaction_get_failed (transaction); ++i) {
@@ -877,11 +887,11 @@ gck_session_complete_object_creation (GckSession *self, GckTransaction *transact
 			gck_object_set_attribute (object, self, transaction, &attrs[i]);
 	}
 
-	/* Find somewhere to store the object */
-	if (gck_object_is_token (object))
-		gck_module_store_token_object (self->pv->module, transaction, object);
-	else
-		add_object (self, transaction, object);
+	/* Store the object */
+	if (!gck_transaction_get_failed (transaction)) {
+		if (gck_object_is_token (object))
+			gck_module_store_token_object (self->pv->module, transaction, object);
+	}
 }
 
 /* -----------------------------------------------------------------------------
diff --git a/pkcs11/user-store/gck-user-module.c b/pkcs11/user-store/gck-user-module.c
index 4915070..88e9442 100644
--- a/pkcs11/user-store/gck-user-module.c
+++ b/pkcs11/user-store/gck-user-module.c
@@ -128,23 +128,20 @@ gck_user_module_real_refresh_token (GckModule *base)
 	return CKR_OK;
 }
 
-static void 
-gck_user_module_real_store_token_object (GckModule *base, GckTransaction *transaction, GckObject *object)
+static void
+gck_user_module_real_add_token_object (GckModule *base, GckTransaction *transaction, GckObject *object)
 {
 	GckUserModule *self = GCK_USER_MODULE (base);
-	GckStore *store = NULL;
-
-	/* TODO: Need to support storing changes better */
-	g_object_get (object, "store", &store, NULL);
-	if (store != NULL) {
-		g_object_unref (store);
-		return;
-	}
-
 	gck_user_storage_create (self->storage, transaction, object);
 }
 
 static void 
+gck_user_module_real_store_token_object (GckModule *base, GckTransaction *transaction, GckObject *object)
+{
+	/* Not necessary */
+}
+
+static void
 gck_user_module_real_remove_token_object (GckModule *base, GckTransaction *transaction, GckObject *object)
 {
 	GckUserModule *self = GCK_USER_MODULE (base);
@@ -332,6 +329,7 @@ gck_user_module_class_init (GckUserModuleClass *klass)
 	module_class->get_token_info = gck_user_module_real_get_token_info;
 	module_class->parse_argument = gck_user_module_real_parse_argument;
 	module_class->refresh_token = gck_user_module_real_refresh_token;
+	module_class->add_token_object = gck_user_module_real_add_token_object;
 	module_class->store_token_object = gck_user_module_real_store_token_object;
 	module_class->remove_token_object = gck_user_module_real_remove_token_object;
 	module_class->login_user = gck_user_module_real_login_user;



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