[gnome-keyring] Fix storage and testing problems.
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-keyring] Fix storage and testing problems.
- Date: Tue, 9 Feb 2010 04:08:33 +0000 (UTC)
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]