diff options
author | Stef Walter <stef@memberwebs.com> | 2010-08-01 11:34:29 +0200 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2010-08-01 11:34:29 +0200 |
commit | 9c49ed2cb38ee77aa40b95912d9510792e240f89 (patch) | |
tree | 561c6d01c530806af32342240029d1d10176ae19 | |
parent | a6adc688b7be28f487695db35377cd87aabd8948 (diff) | |
download | gnome-keyring-9c49ed2cb38ee77aa40b95912d9510792e240f89.tar.gz |
[gck] Make various objects pretty much immutable.
* Except for certain flags used during destruction, which we
use atomically internally.
-rw-r--r-- | gck/gck-module.c | 221 | ||||
-rw-r--r-- | gck/gck-object.c | 150 | ||||
-rw-r--r-- | gck/gck-session.c | 146 | ||||
-rw-r--r-- | gck/gck-slot.c | 81 | ||||
-rw-r--r-- | gck/gck.h | 23 | ||||
-rw-r--r-- | gck/tests/test-gck-crypto.c | 27 | ||||
-rw-r--r-- | gck/tests/test-gck-module.c | 8 | ||||
-rw-r--r-- | gck/tests/test-gck-object.c | 2 | ||||
-rw-r--r-- | gck/tests/test-gck-session.c | 37 | ||||
-rw-r--r-- | gck/tests/test-gck-slot.c | 4 |
10 files changed, 265 insertions, 434 deletions
diff --git a/gck/gck-module.c b/gck/gck-module.c index ef33b857..7e066837 100644 --- a/gck/gck-module.c +++ b/gck/gck-module.c @@ -86,23 +86,17 @@ enum { LAST_SIGNAL }; -typedef struct _GckModuleData { +struct _GckModulePrivate { GModule *module; gchar *path; gboolean initialized; CK_FUNCTION_LIST_PTR funcs; CK_C_INITIALIZE_ARGS init_args; -} GckModuleData; - -typedef struct _GckModulePrivate { - GckModuleData data; - GStaticMutex mutex; - gboolean finalized; guint options; -} GckModulePrivate; -#define gck_module_GET_DATA(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), GCK_TYPE_MODULE, GckModuleData)) + /* Modified atomically */ + gint finalized; +}; G_DEFINE_TYPE (GckModule, gck_module, G_TYPE_OBJECT); @@ -159,39 +153,6 @@ unlock_mutex (void *mutex) * INTERNAL */ -static GckModulePrivate* -lock_private (gpointer obj) -{ - GckModulePrivate *pv; - GckModule *self; - - g_assert (GCK_IS_MODULE (obj)); - self = GCK_MODULE (obj); - - g_object_ref (self); - - pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_MODULE, GckModulePrivate); - g_static_mutex_lock (&pv->mutex); - - return pv; -} - -static void -unlock_private (gpointer obj, GckModulePrivate *pv) -{ - GckModule *self; - - g_assert (pv); - g_assert (GCK_IS_MODULE (obj)); - - self = GCK_MODULE (obj); - - g_assert (G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_MODULE, GckModulePrivate) == pv); - - g_static_mutex_unlock (&pv->mutex); - g_object_unref (self); -} - gboolean _gck_module_fire_authenticate_slot (GckModule *self, GckSlot *slot, gchar *label, gchar **password) { @@ -277,8 +238,7 @@ gck_module_real_authenticate_object (GckModule *module, GckObject *object, gchar static void gck_module_init (GckModule *self) { - GckModulePrivate *pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_MODULE, GckModulePrivate); - g_static_mutex_init (&pv->mutex); + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_MODULE, GckModulePrivate); } static void @@ -305,20 +265,20 @@ gck_module_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GckModule *self = GCK_MODULE (obj); - GckModuleData *data = gck_module_GET_DATA (obj); /* Only allowed during initialization */ switch (prop_id) { case PROP_PATH: - g_return_if_fail (!data->path); - data->path = g_value_dup_string (value); + g_return_if_fail (!self->pv->path); + self->pv->path = g_value_dup_string (value); break; case PROP_FUNCTIONS: - g_return_if_fail (!data->funcs); - data->funcs = g_value_get_pointer (value); + g_return_if_fail (!self->pv->funcs); + self->pv->funcs = g_value_get_pointer (value); break; case PROP_OPTIONS: - gck_module_set_options (self, g_value_get_uint (value)); + g_return_if_fail (!self->pv->options); + self->pv->options = g_value_get_uint (value); break; } } @@ -326,26 +286,21 @@ gck_module_set_property (GObject *obj, guint prop_id, const GValue *value, static void gck_module_dispose (GObject *obj) { - GckModuleData *data = gck_module_GET_DATA (obj); - GckModulePrivate *pv = lock_private (obj); + GckModule *self = GCK_MODULE (obj); gboolean finalize = FALSE; CK_RV rv; - { - if (!pv->finalized && data->initialized && data->funcs) { + if (self->pv->initialized && self->pv->funcs) { + if (g_atomic_int_compare_and_exchange (&self->pv->finalized, 0, 1)) finalize = TRUE; - pv->finalized = TRUE; - } } - unlock_private (obj, pv); - /* Must be careful when accessing funcs */ if (finalize) { - rv = (data->funcs->C_Finalize) (NULL); + rv = (self->pv->funcs->C_Finalize) (NULL); if (rv != CKR_OK) { g_warning ("C_Finalize on module '%s' failed: %s", - data->path, gck_message_from_rv (rv)); + self->pv->path, gck_message_from_rv (rv)); } } @@ -355,22 +310,19 @@ gck_module_dispose (GObject *obj) static void gck_module_finalize (GObject *obj) { - GckModulePrivate *pv = G_TYPE_INSTANCE_GET_PRIVATE (obj, GCK_TYPE_MODULE, GckModulePrivate); - GckModuleData *data = gck_module_GET_DATA (obj); + GckModule *self = GCK_MODULE (obj); - data->funcs = NULL; + self->pv->funcs = NULL; - if (data->module) { - if (!g_module_close (data->module)) + if (self->pv->module) { + if (!g_module_close (self->pv->module)) g_warning ("failed to close the pkcs11 module: %s", g_module_error ()); - data->module = NULL; + self->pv->module = NULL; } - g_free (data->path); - data->path = NULL; - - g_static_mutex_free (&pv->mutex); + g_free (self->pv->path); + self->pv->path = NULL; G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj); } @@ -423,7 +375,7 @@ gck_module_class_init (GckModuleClass *klass) */ g_object_class_install_property (gobject_class, PROP_OPTIONS, g_param_spec_uint ("options", "Options", "Module options", - 0, G_MAXUINT, 0, G_PARAM_READWRITE)); + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /** * GckModule::authenticate-slot: @@ -488,6 +440,7 @@ gck_module_info_free (GckModuleInfo *module_info) * gck_module_initialize: * @path: The file system path to the PKCS#11 module to load. * @reserved: Extra arguments for the PKCS#11 module, should usually be NULL. + * @options: Options which control the authentication behavior etc. * @err: A location to store an error resulting from a failed load. * * Load and initialize a PKCS#11 module represented by a GckModule object. @@ -495,13 +448,12 @@ gck_module_info_free (GckModuleInfo *module_info) * Return value: The loaded PKCS#11 module or NULL if failed. **/ GckModule* -gck_module_initialize (const gchar *path, gpointer reserved, GError **err) +gck_module_initialize (const gchar *path, gpointer reserved, guint options, GError **err) { CK_C_GetFunctionList get_function_list; CK_FUNCTION_LIST_PTR funcs; - GckModuleData *data; GModule *module; - GckModule *mod; + GckModule *self; CK_RV rv; g_return_val_if_fail (path != NULL, NULL); @@ -532,29 +484,28 @@ gck_module_initialize (const gchar *path, gpointer reserved, GError **err) return NULL; } - mod = g_object_new (GCK_TYPE_MODULE, "functions", funcs, "path", path, NULL); - data = gck_module_GET_DATA (mod); - data->module = module; + self = g_object_new (GCK_TYPE_MODULE, "functions", funcs, "path", path, "options", options, NULL); + self->pv->module = module; - memset (&data->init_args, 0, sizeof (data->init_args)); - data->init_args.flags = CKF_OS_LOCKING_OK; - data->init_args.CreateMutex = create_mutex; - data->init_args.DestroyMutex = destroy_mutex; - data->init_args.LockMutex = lock_mutex; - data->init_args.UnlockMutex = unlock_mutex; - data->init_args.pReserved = reserved; + memset (&self->pv->init_args, 0, sizeof (self->pv->init_args)); + self->pv->init_args.flags = CKF_OS_LOCKING_OK; + self->pv->init_args.CreateMutex = create_mutex; + self->pv->init_args.DestroyMutex = destroy_mutex; + self->pv->init_args.LockMutex = lock_mutex; + self->pv->init_args.UnlockMutex = unlock_mutex; + self->pv->init_args.pReserved = reserved; /* Now initialize the module */ - rv = (data->funcs->C_Initialize) (&data->init_args); + rv = (self->pv->funcs->C_Initialize) (&self->pv->init_args); if (rv != CKR_OK) { g_set_error (err, GCK_ERROR, rv, "Couldn't initialize module: %s", gck_message_from_rv (rv)); - g_object_unref (mod); + g_object_unref (self); return NULL; } - data->initialized = TRUE; - return mod; + self->pv->initialized = TRUE; + return self; } /** @@ -568,10 +519,10 @@ gck_module_initialize (const gchar *path, gpointer reserved, GError **err) * Return value: The new PKCS#11 module. **/ GckModule* -gck_module_new (CK_FUNCTION_LIST_PTR funcs) +gck_module_new (CK_FUNCTION_LIST_PTR funcs, guint options) { g_return_val_if_fail (funcs, NULL); - return g_object_new (GCK_TYPE_MODULE, "functions", funcs, NULL); + return g_object_new (GCK_TYPE_MODULE, "functions", funcs, "options", options, NULL); } /** @@ -587,17 +538,17 @@ gck_module_new (CK_FUNCTION_LIST_PTR funcs) gboolean gck_module_equal (gconstpointer module1, gconstpointer module2) { - GckModuleData *data1, *data2; + GckModule *mod1, *mod2; if (module1 == module2) return TRUE; if (!GCK_IS_MODULE (module1) || !GCK_IS_MODULE (module2)) return FALSE; - data1 = gck_module_GET_DATA (module1); - data2 = gck_module_GET_DATA (module2); + mod1 = GCK_MODULE (module1); + mod2 = GCK_MODULE (module2); - return data1->funcs == data2->funcs; + return mod1->pv->funcs == mod2->pv->funcs; } /** @@ -614,13 +565,11 @@ gck_module_equal (gconstpointer module1, gconstpointer module2) guint gck_module_hash (gconstpointer module) { - GckModuleData *data; + GckModule *self; g_return_val_if_fail (GCK_IS_MODULE (module), 0); - - data = gck_module_GET_DATA (module); - - return g_direct_hash (data->funcs); + self = GCK_MODULE (module); + return g_direct_hash (self->pv->funcs); } /** @@ -634,16 +583,15 @@ gck_module_hash (gconstpointer module) GckModuleInfo* gck_module_get_info (GckModule *self) { - GckModuleData *data = gck_module_GET_DATA (self); GckModuleInfo *modinfo; CK_INFO info; CK_RV rv; g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - g_return_val_if_fail (data->funcs, NULL); + g_return_val_if_fail (self->pv->funcs, NULL); memset (&info, 0, sizeof (info)); - rv = (data->funcs->C_GetInfo (&info)); + rv = (self->pv->funcs->C_GetInfo (&info)); if (rv != CKR_OK) { g_warning ("couldn't get module info: %s", gck_message_from_rv (rv)); return NULL; @@ -675,16 +623,15 @@ gck_module_get_info (GckModule *self) GList* gck_module_get_slots (GckModule *self, gboolean token_present) { - GckModuleData *data = gck_module_GET_DATA (self); CK_SLOT_ID_PTR slot_list; CK_ULONG count, i; GList *result; CK_RV rv; g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - g_return_val_if_fail (data->funcs, NULL); + g_return_val_if_fail (self->pv->funcs, NULL); - rv = (data->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count); + rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count); if (rv != CKR_OK) { g_warning ("couldn't get slot count: %s", gck_message_from_rv (rv)); return NULL; @@ -694,7 +641,7 @@ gck_module_get_slots (GckModule *self, gboolean token_present) return NULL; slot_list = g_new (CK_SLOT_ID, count); - rv = (data->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count); + rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count); if (rv != CKR_OK) { g_warning ("couldn't get slot list: %s", gck_message_from_rv (rv)); g_free (slot_list); @@ -724,9 +671,8 @@ gck_module_get_slots (GckModule *self, gboolean token_present) const gchar* gck_module_get_path (GckModule *self) { - GckModuleData *data = gck_module_GET_DATA (self); g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - return data->path; + return self->pv->path; } /** @@ -740,9 +686,8 @@ gck_module_get_path (GckModule *self) CK_FUNCTION_LIST_PTR gck_module_get_functions (GckModule *self) { - GckModuleData *data = gck_module_GET_DATA (self); g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - return data->funcs; + return self->pv->funcs; } @@ -757,56 +702,6 @@ gck_module_get_functions (GckModule *self) guint gck_module_get_options (GckModule *self) { - GckModulePrivate *pv = lock_private (self); - guint ret; - - g_return_val_if_fail (pv, FALSE); - - { - ret = pv->options; - } - - unlock_private (self, pv); - - return ret; -} - -/** - * gck_module_set_options: - * @self: The module to set the setting on. - * @options: Authentication and other options.. - **/ -void -gck_module_set_options (GckModule *self, guint options) -{ - GckModulePrivate *pv = lock_private (self); - - g_return_if_fail (pv); - - { - pv->options = options; - } - - unlock_private (self, pv); - g_object_notify (G_OBJECT (self), "options"); -} - -/** - * gck_module_add_options: - * @self: The module to add the option on. - * @options: Authentication and other options.. - **/ -void -gck_module_add_options (GckModule *self, guint options) -{ - GckModulePrivate *pv = lock_private (self); - - g_return_if_fail (pv); - - { - pv->options |= options; - } - - unlock_private (self, pv); - g_object_notify (G_OBJECT (self), "options"); + g_return_val_if_fail (GCK_IS_MODULE (self), 0); + return self->pv->options; } diff --git a/gck/gck-object.c b/gck/gck-object.c index ce9cb201..2cea15d4 100644 --- a/gck/gck-object.c +++ b/gck/gck-object.c @@ -56,18 +56,11 @@ enum { PROP_HANDLE }; -typedef struct _GckObjectData { +struct _GckObjectPrivate { GckModule *module; GckSession *session; CK_OBJECT_HANDLE handle; -} GckObjectData; - -typedef struct _GckObjectPrivate { - GckObjectData data; -} GckObjectPrivate; - -#define GCK_OBJECT_GET_DATA(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), GCK_TYPE_OBJECT, GckObjectData)) +}; G_DEFINE_TYPE (GckObject, gck_object, G_TYPE_OBJECT); @@ -78,7 +71,7 @@ G_DEFINE_TYPE (GckObject, gck_object, G_TYPE_OBJECT); static void gck_object_init (GckObject *self) { - + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_OBJECT, GckObjectPrivate); } static void @@ -102,28 +95,28 @@ gck_object_get_property (GObject *obj, guint prop_id, GValue *value, static void gck_object_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) + GParamSpec *pspec) { - GckObjectData *data = GCK_OBJECT_GET_DATA (obj); + GckObject *self = GCK_OBJECT (obj); /* The sets to data below are only allowed during construction */ switch (prop_id) { case PROP_MODULE: - g_return_if_fail (!data->module); - data->module = g_value_get_object (value); - g_return_if_fail (data->module); - g_object_ref (data->module); + g_return_if_fail (!self->pv->module); + self->pv->module = g_value_get_object (value); + g_return_if_fail (self->pv->module); + g_object_ref (self->pv->module); break; case PROP_SESSION: - g_return_if_fail (!data->session); - data->session = g_value_get_object (value); - g_return_if_fail (data->session); - g_object_ref (data->session); + g_return_if_fail (!self->pv->session); + self->pv->session = g_value_get_object (value); + g_return_if_fail (self->pv->session); + g_object_ref (self->pv->session); break; case PROP_HANDLE: - g_return_if_fail (!data->handle); - data->handle = g_value_get_ulong (value); + g_return_if_fail (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); break; } } @@ -131,17 +124,17 @@ gck_object_set_property (GObject *obj, guint prop_id, const GValue *value, static void gck_object_finalize (GObject *obj) { - GckObjectData *data = GCK_OBJECT_GET_DATA (obj); + GckObject *self = GCK_OBJECT (obj); - if (data->session) - g_object_unref (data->session); - data->session = NULL; + if (self->pv->session) + g_object_unref (self->pv->session); + self->pv->session = NULL; - if (data->module) - g_object_unref (data->module); - data->module = NULL; + if (self->pv->module) + g_object_unref (self->pv->module); + self->pv->module = NULL; - data->handle = 0; + self->pv->handle = 0; G_OBJECT_CLASS (gck_object_parent_class)->finalize (obj); } @@ -259,7 +252,7 @@ gck_objects_from_handle_array (GckSession *session, CK_OBJECT_HANDLE_PTR handles gboolean gck_object_equal (gconstpointer object1, gconstpointer object2) { - GckObjectData *data1, *data2; + GckObject *obj1, *obj2; GckSlot *slot1, *slot2; gboolean ret; @@ -268,13 +261,13 @@ gck_object_equal (gconstpointer object1, gconstpointer object2) if (!GCK_IS_OBJECT (object1) || !GCK_IS_OBJECT (object2)) return FALSE; - data1 = GCK_OBJECT_GET_DATA (object1); - data2 = GCK_OBJECT_GET_DATA (object2); + obj1 = GCK_OBJECT (object1); + obj2 = GCK_OBJECT (object2); - slot1 = gck_session_get_slot (data1->session); - slot2 = gck_session_get_slot (data2->session); + slot1 = gck_session_get_slot (obj1->pv->session); + slot2 = gck_session_get_slot (obj2->pv->session); - ret = data1->handle == data2->handle && + ret = obj1->pv->handle == obj2->pv->handle && gck_slot_equal (slot1, slot2); g_object_unref (slot1); @@ -297,16 +290,16 @@ gck_object_equal (gconstpointer object1, gconstpointer object2) guint gck_object_hash (gconstpointer object) { - GckObjectData *data; + GckObject *self; GckSlot *slot; guint hash; g_return_val_if_fail (GCK_IS_OBJECT (object), 0); - data = GCK_OBJECT_GET_DATA (object); - slot = gck_session_get_slot (data->session); + self = GCK_OBJECT (object); + slot = gck_session_get_slot (self->pv->session); - hash = _gck_ulong_hash (&data->handle) ^ + hash = _gck_ulong_hash (&self->pv->handle) ^ gck_slot_hash (slot); g_object_unref (slot); @@ -326,9 +319,8 @@ gck_object_hash (gconstpointer object) CK_OBJECT_HANDLE gck_object_get_handle (GckObject *self) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); g_return_val_if_fail (GCK_IS_OBJECT (self), (CK_OBJECT_HANDLE)-1); - return data->handle; + return self->pv->handle; } /** @@ -342,10 +334,9 @@ gck_object_get_handle (GckObject *self) GckModule* gck_object_get_module (GckObject *self) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (data->module), NULL); - return g_object_ref (data->module); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); + return g_object_ref (self->pv->module); } @@ -365,10 +356,9 @@ gck_object_get_module (GckObject *self) GckSession* gck_object_get_session (GckObject *self) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_SESSION (data->session), NULL); - return g_object_ref (data->session); + g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), NULL); + return g_object_ref (self->pv->session); } /* -------------------------------------------------------------------------------------- @@ -419,15 +409,14 @@ gck_object_destroy (GckObject *self, GError **err) gboolean gck_object_destroy_full (GckObject *self, GCancellable *cancellable, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); Destroy args = { GCK_ARGUMENTS_INIT, 0 }; g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); - g_return_val_if_fail (GCK_IS_SESSION (data->session), FALSE); + g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), FALSE); g_return_val_if_fail (!err || !*err, FALSE); - args.object = data->handle; - return _gck_call_sync (data->session, perform_destroy, NULL, &args, cancellable, err); + args.object = self->pv->handle; + return _gck_call_sync (self->pv->session, perform_destroy, NULL, &args, cancellable, err); } /** @@ -444,14 +433,13 @@ void gck_object_destroy_async (GckObject *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); Destroy* args; g_return_if_fail (GCK_IS_OBJECT (self)); - g_return_if_fail (GCK_IS_SESSION (data->session)); + g_return_if_fail (GCK_IS_SESSION (self->pv->session)); - args = _gck_call_async_prep (data->session, self, perform_destroy, NULL, sizeof (*args), NULL); - args->object = data->handle; + args = _gck_call_async_prep (self->pv->session, self, perform_destroy, NULL, sizeof (*args), NULL); + args->object = self->pv->handle; _gck_call_async_ready_go (args, cancellable, callback, user_data); } @@ -521,7 +509,6 @@ gboolean gck_object_set (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); SetAttributes args; gboolean ret = FALSE; @@ -533,9 +520,9 @@ gck_object_set (GckObject *self, GckAttributes *attrs, memset (&args, 0, sizeof (args)); args.attrs = attrs; - args.object = data->handle; + args.object = self->pv->handle; - ret = _gck_call_sync (data->session, perform_set_attributes, NULL, &args, cancellable, err); + ret = _gck_call_sync (self->pv->session, perform_set_attributes, NULL, &args, cancellable, err); _gck_attributes_unlock (attrs); return ret; @@ -556,18 +543,17 @@ void gck_object_set_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); SetAttributes *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs); - args = _gck_call_async_prep (data->session, self, perform_set_attributes, + args = _gck_call_async_prep (self->pv->session, self, perform_set_attributes, NULL, sizeof (*args), free_set_attributes); _gck_attributes_lock (attrs); args->attrs = gck_attributes_ref (attrs); - args->object = data->handle; + args->object = self->pv->handle; _gck_call_async_ready_go (args, cancellable, callback, user_data); } @@ -730,7 +716,6 @@ GckAttributes* gck_object_get_full (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); GetAttributes args; gboolean ret; @@ -742,9 +727,9 @@ gck_object_get_full (GckObject *self, GckAttributes *attrs, memset (&args, 0, sizeof (args)); args.attrs = attrs; - args.object = data->handle; + args.object = self->pv->handle; - ret = _gck_call_sync (data->session, perform_get_attributes, NULL, &args, cancellable, err); + ret = _gck_call_sync (self->pv->session, perform_get_attributes, NULL, &args, cancellable, err); _gck_attributes_unlock (attrs); return ret ? attrs : NULL; @@ -769,18 +754,17 @@ void gck_object_get_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); GetAttributes *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs); - args = _gck_call_async_prep (data->session, self, perform_get_attributes, + args = _gck_call_async_prep (self->pv->session, self, perform_get_attributes, NULL, sizeof (*args), free_get_attributes); _gck_attributes_lock (attrs); args->attrs = gck_attributes_ref (attrs); - args->object = data->handle; + args->object = self->pv->handle; _gck_call_async_ready_go (args, cancellable, callback, user_data); } @@ -918,7 +902,6 @@ gpointer gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator allocator, GCancellable *cancellable, gsize *n_data, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); GetAttributeData args; gboolean ret; @@ -931,10 +914,10 @@ gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator alloca memset (&args, 0, sizeof (args)); args.allocator = allocator; - args.object = data->handle; + args.object = self->pv->handle; args.type = attr_type; - ret = _gck_call_sync (data->session, perform_get_attribute_data, NULL, &args, cancellable, err); + ret = _gck_call_sync (self->pv->session, perform_get_attribute_data, NULL, &args, cancellable, err); /* Free any value if failed */ if (!ret) { @@ -965,7 +948,6 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); GetAttributeData *args; g_return_if_fail (GCK_IS_OBJECT (self)); @@ -973,11 +955,11 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc if (!allocator) allocator = g_realloc; - args = _gck_call_async_prep (data->session, self, perform_get_attribute_data, + args = _gck_call_async_prep (self->pv->session, self, perform_get_attribute_data, NULL, sizeof (*args), free_get_attribute_data); args->allocator = allocator; - args->object = data->handle; + args->object = self->pv->handle; args->type = attr_type; _gck_call_async_ready_go (args, cancellable, callback, user_data); @@ -1097,7 +1079,6 @@ gboolean gck_object_set_template_full (GckObject *self, gulong attr_type, GckAttributes *attrs, GCancellable *cancellable, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); set_template_args args; gboolean ret = FALSE; @@ -1110,9 +1091,9 @@ gck_object_set_template_full (GckObject *self, gulong attr_type, GckAttributes * memset (&args, 0, sizeof (args)); args.attrs = attrs; args.type = attr_type; - args.object = data->handle; + args.object = self->pv->handle; - ret = _gck_call_sync (data->session, perform_set_template, NULL, &args, cancellable, err); + ret = _gck_call_sync (self->pv->session, perform_set_template, NULL, &args, cancellable, err); _gck_attributes_unlock (attrs); return ret; @@ -1137,19 +1118,18 @@ gck_object_set_template_async (GckObject *self, gulong attr_type, GckAttributes GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); set_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs); - args = _gck_call_async_prep (data->session, self, perform_set_template, + args = _gck_call_async_prep (self->pv->session, self, perform_set_template, NULL, sizeof (*args), free_set_template); _gck_attributes_lock (attrs); args->attrs = gck_attributes_ref (attrs); args->type = attr_type; - args->object = data->handle; + args->object = self->pv->handle; _gck_call_async_ready_go (args, cancellable, callback, user_data); } @@ -1282,7 +1262,6 @@ GckAttributes* gck_object_get_template_full (GckObject *self, gulong attr_type, GCancellable *cancellable, GError **err) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); get_template_args args; gboolean ret; @@ -1290,10 +1269,10 @@ gck_object_get_template_full (GckObject *self, gulong attr_type, g_return_val_if_fail (!err || !*err, NULL); memset (&args, 0, sizeof (args)); - args.object = data->handle; + args.object = self->pv->handle; args.type = attr_type; - ret = _gck_call_sync (data->session, perform_get_template, NULL, &args, cancellable, err); + ret = _gck_call_sync (self->pv->session, perform_get_template, NULL, &args, cancellable, err); _gck_attributes_unlock (args.attrs); @@ -1324,15 +1303,14 @@ gck_object_get_template_async (GckObject *self, gulong attr_type, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectData *data = GCK_OBJECT_GET_DATA (self); get_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); - args = _gck_call_async_prep (data->session, self, perform_get_template, + args = _gck_call_async_prep (self->pv->session, self, perform_get_template, NULL, sizeof (*args), free_get_template); - args->object = data->handle; + args->object = self->pv->handle; args->type = attr_type; _gck_call_async_ready_go (args, cancellable, callback, user_data); diff --git a/gck/gck-session.c b/gck/gck-session.c index 7d331ecd..9813a319 100644 --- a/gck/gck-session.c +++ b/gck/gck-session.c @@ -67,84 +67,35 @@ enum { PROP_SLOT }; -typedef struct _GckSessionData { +struct _GckSessionPrivate { GckSlot *slot; GckModule *module; CK_SESSION_HANDLE handle; -} GckSessionData; - -typedef struct _GckSessionPrivate { - - /* Remain same from init to finalize */ - GckSessionData data; /* Modified atomically */ gint discarded; - gint auto_login; - -} GckSessionPrivate; - -#define GCK_SESSION_GET_DATA(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), GCK_TYPE_SESSION, GckSessionData)) +}; G_DEFINE_TYPE (GckSession, gck_session, G_TYPE_OBJECT); static guint signals[LAST_SIGNAL] = { 0 }; /* ---------------------------------------------------------------------------- - * HELPERS - */ - -static GckSessionPrivate* -lock_private (gpointer obj) -{ - GckSessionPrivate *pv; - GckSession *self; - - g_return_val_if_fail (GCK_IS_SESSION (obj), NULL); - self = GCK_SESSION (obj); - - g_object_ref (self); - - pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SESSION, GckSessionPrivate); - /* g_static_mutex_lock (&pv->mutex); */ - - return pv; -} - -static void -unlock_private (gpointer obj, GckSessionPrivate *pv) -{ - GckSession *self; - - g_assert (pv); - g_assert (GCK_IS_SESSION (obj)); - - self = GCK_SESSION (obj); - - g_assert (G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SESSION, GckSessionPrivate) == pv); - - /* g_static_mutex_unlock (&pv->mutex); */ - g_object_unref (self); -} - -/* ---------------------------------------------------------------------------- * OBJECT */ static gboolean gck_session_real_discard_handle (GckSession *self, CK_OBJECT_HANDLE handle) { - GckSessionData *data = GCK_SESSION_GET_DATA (self); CK_FUNCTION_LIST_PTR funcs; CK_RV rv; /* The default functionality, close the handle */ - g_return_val_if_fail (data->module, FALSE); - g_object_ref (data->module); + g_return_val_if_fail (self->pv->module, FALSE); + g_object_ref (self->pv->module); - funcs = gck_module_get_functions (data->module); + funcs = gck_module_get_functions (self->pv->module); g_return_val_if_fail (funcs, FALSE); rv = (funcs->C_CloseSession) (handle); @@ -153,14 +104,14 @@ gck_session_real_discard_handle (GckSession *self, CK_OBJECT_HANDLE handle) gck_message_from_rv (rv)); } - g_object_unref (data->module); + g_object_unref (self->pv->module); return TRUE; } static void gck_session_init (GckSession *self) { - + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SESSION, GckSessionPrivate); } static void @@ -186,24 +137,24 @@ static void gck_session_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { - GckSessionData *data = GCK_SESSION_GET_DATA (obj); + GckSession *self = GCK_SESSION (obj); /* Only valid calls are from constructor */ switch (prop_id) { case PROP_MODULE: - g_return_if_fail (!data->module); - data->module = g_value_dup_object (value); - g_return_if_fail (data->module); + g_return_if_fail (!self->pv->module); + self->pv->module = g_value_dup_object (value); + g_return_if_fail (self->pv->module); break; case PROP_HANDLE: - g_return_if_fail (!data->handle); - data->handle = g_value_get_ulong (value); + g_return_if_fail (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); break; case PROP_SLOT: - g_return_if_fail (!data->slot); - data->slot = g_value_dup_object (value); - g_return_if_fail (data->slot); + g_return_if_fail (!self->pv->slot); + self->pv->slot = g_value_dup_object (value); + g_return_if_fail (self->pv->slot); break; } } @@ -211,50 +162,39 @@ gck_session_set_property (GObject *obj, guint prop_id, const GValue *value, static void gck_session_dispose (GObject *obj) { - GckSessionPrivate *pv; GckSession *self = GCK_SESSION (obj); gboolean handled; - gint discarded; g_return_if_fail (GCK_IS_SESSION (self)); - pv = lock_private (obj); - - { - discarded = g_atomic_int_get (&pv->discarded); - if (!discarded && g_atomic_int_compare_and_exchange (&pv->discarded, discarded, 1)) { + if (g_atomic_int_compare_and_exchange (&self->pv->discarded, 0, 1)) { - /* - * Let the world know that we're discarding the session - * handle. This allows session reuse to work. - */ - - g_signal_emit_by_name (self, "discard-handle", pv->data.handle, &handled); - g_return_if_fail (handled); - } + /* + * Let the world know that we're discarding the session + * handle. This allows any necessary session reuse to work. + */ + g_signal_emit_by_name (self, "discard-handle", self->pv->handle, &handled); + g_return_if_fail (handled); } - unlock_private (obj, pv); - G_OBJECT_CLASS (gck_session_parent_class)->dispose (obj); } static void gck_session_finalize (GObject *obj) { - GckSessionPrivate *pv = G_TYPE_INSTANCE_GET_PRIVATE (obj, GCK_TYPE_SESSION, GckSessionPrivate); - GckSessionData *data = GCK_SESSION_GET_DATA (obj); + GckSession *self = GCK_SESSION (obj); - g_assert (pv->discarded != 0); + g_assert (g_atomic_int_get (&self->pv->discarded) != 0); - if (data->slot) - g_object_unref (data->slot); - data->slot = NULL; + if (self->pv->slot) + g_object_unref (self->pv->slot); + self->pv->slot = NULL; - if (data->module) - g_object_unref (data->module); - data->module = NULL; + if (self->pv->module) + g_object_unref (self->pv->module); + self->pv->module = NULL; G_OBJECT_CLASS (gck_session_parent_class)->finalize (obj); } @@ -388,9 +328,8 @@ gck_session_from_handle (GckSlot *slot, CK_SESSION_HANDLE handle) CK_SESSION_HANDLE gck_session_get_handle (GckSession *self) { - GckSessionData *data = GCK_SESSION_GET_DATA (self); g_return_val_if_fail (GCK_IS_SESSION (self), (CK_SESSION_HANDLE)-1); - return data->handle; + return self->pv->handle; } /** @@ -404,10 +343,9 @@ gck_session_get_handle (GckSession *self) GckModule* gck_session_get_module (GckSession *self) { - GckSessionData *data = GCK_SESSION_GET_DATA (self); g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (data->module), NULL); - return g_object_ref (data->module); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); + return g_object_ref (self->pv->module); } /** @@ -421,10 +359,9 @@ gck_session_get_module (GckSession *self) GckSlot* gck_session_get_slot (GckSession *self) { - GckSessionData *data = GCK_SESSION_GET_DATA (self); g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - g_return_val_if_fail (GCK_IS_SLOT (data->slot), NULL); - return g_object_ref (data->slot); + g_return_val_if_fail (GCK_IS_SLOT (self->pv->slot), NULL); + return g_object_ref (self->pv->slot); } /** @@ -439,24 +376,23 @@ gck_session_get_slot (GckSession *self) GckSessionInfo* gck_session_get_info (GckSession *self) { - GckSessionData *data = GCK_SESSION_GET_DATA (self); GckSessionInfo *sessioninfo; CK_FUNCTION_LIST_PTR funcs; CK_SESSION_INFO info; CK_RV rv; g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (data->module), NULL); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); - g_object_ref (data->module); + g_object_ref (self->pv->module); - funcs = gck_module_get_functions (data->module); + funcs = gck_module_get_functions (self->pv->module); g_return_val_if_fail (funcs, NULL); memset (&info, 0, sizeof (info)); - rv = (funcs->C_GetSessionInfo) (data->handle, &info); + rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info); - g_object_unref (data->module); + g_object_unref (self->pv->module); if (rv != CKR_OK) { g_warning ("couldn't get session info: %s", gck_message_from_rv (rv)); diff --git a/gck/gck-slot.c b/gck/gck-slot.c index 6afe3f3b..2b0aec93 100644 --- a/gck/gck-slot.c +++ b/gck/gck-slot.c @@ -49,20 +49,13 @@ enum { PROP_HANDLE }; -typedef struct _GckSlotData { +struct _GckSlotPrivate { GckModule *module; CK_SLOT_ID handle; -} GckSlotData; - -typedef struct _GckSlotPrivate { - GckSlotData data; -} GckSlotPrivate; +}; G_DEFINE_TYPE (GckSlot, gck_slot, G_TYPE_OBJECT); -#define GCK_SLOT_GET_DATA(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), GCK_TYPE_SLOT, GckSlotData)) - #ifndef HAVE_TIMEGM time_t @@ -125,12 +118,12 @@ make_session_object (GckSlot *self, gulong flags, CK_SESSION_HANDLE handle) static void gck_slot_init (GckSlot *self) { - + self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SLOT, GckSlotPrivate); } static void gck_slot_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) + GParamSpec *pspec) { GckSlot *self = GCK_SLOT (obj); @@ -148,20 +141,20 @@ static void gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { - GckSlotData *data = GCK_SLOT_GET_DATA (obj); + GckSlot *self = GCK_SLOT (obj); /* All writes to data members below, happen only during construct phase */ switch (prop_id) { case PROP_MODULE: - g_assert (!data->module); - data->module = g_value_get_object (value); - g_assert (data->module); - g_object_ref (data->module); + g_assert (!self->pv->module); + self->pv->module = g_value_get_object (value); + g_assert (self->pv->module); + g_object_ref (self->pv->module); break; case PROP_HANDLE: - g_assert (!data->handle); - data->handle = g_value_get_ulong (value); + g_assert (!self->pv->handle); + self->pv->handle = g_value_get_ulong (value); break; } } @@ -175,13 +168,12 @@ gck_slot_dispose (GObject *obj) static void gck_slot_finalize (GObject *obj) { - GckSlotData *data = GCK_SLOT_GET_DATA (obj); - - data->handle = 0; + GckSlot *self = GCK_SLOT (obj); + self->pv->handle = 0; - if (data->module) - g_object_unref (data->module); - data->module = NULL; + if (self->pv->module) + g_object_unref (self->pv->module); + self->pv->module = NULL; G_OBJECT_CLASS (gck_slot_parent_class)->finalize (obj); } @@ -426,18 +418,18 @@ gck_mechanisms_check (GckMechanisms *mechanisms, ...) gboolean gck_slot_equal (gconstpointer slot1, gconstpointer slot2) { - GckSlotData *data1, *data2; + GckSlot *s1, *s2; if (slot1 == slot2) return TRUE; if (!GCK_IS_SLOT (slot1) || !GCK_IS_SLOT (slot2)) return FALSE; - data1 = GCK_SLOT_GET_DATA (slot1); - data2 = GCK_SLOT_GET_DATA (slot2); + s1 = GCK_SLOT (slot1); + s2 = GCK_SLOT (slot2); - return data1->handle == data2->handle && - gck_module_equal (data1->module, data2->module); + return s1->pv->handle == s2->pv->handle && + gck_module_equal (s1->pv->module, s2->pv->module); } /** @@ -454,14 +446,29 @@ gck_slot_equal (gconstpointer slot1, gconstpointer slot2) guint gck_slot_hash (gconstpointer slot) { - GckSlotData *data; + GckSlot *self; g_return_val_if_fail (GCK_IS_SLOT (slot), 0); - data = GCK_SLOT_GET_DATA (slot); + self = GCK_SLOT (slot); - return _gck_ulong_hash (&data->handle) ^ - gck_module_hash (data->module); + return _gck_ulong_hash (&self->pv->handle) ^ + gck_module_hash (self->pv->module); +} + +/** + * gck_slot_from_handle: + * @module: The module that this slot is on. + * @slot_id: The raw PKCS#11 handle or slot id of this slot. + * + * Create a new GckSlot object for a raw PKCS#11 handle. + * + * Return value: The new GckSlot object. + **/ +GckSlot* +gck_slot_from_handle (GckModule *module, CK_SLOT_ID slot_id) +{ + return g_object_new (GCK_TYPE_SLOT, "module", module, "handle", slot_id, NULL); } /** @@ -475,9 +482,8 @@ gck_slot_hash (gconstpointer slot) CK_SLOT_ID gck_slot_get_handle (GckSlot *self) { - GckSlotData *data = GCK_SLOT_GET_DATA (self); g_return_val_if_fail (GCK_IS_SLOT (self), (CK_SLOT_ID)-1); - return data->handle; + return self->pv->handle; } /** @@ -491,10 +497,9 @@ gck_slot_get_handle (GckSlot *self) GckModule* gck_slot_get_module (GckSlot *self) { - GckSlotData *data = GCK_SLOT_GET_DATA (self); g_return_val_if_fail (GCK_IS_SLOT (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (data->module), NULL); - return g_object_ref (data->module); + g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); + return g_object_ref (self->pv->module); } /** @@ -255,9 +255,11 @@ void gck_module_info_free (GckModuleInfo *modul #define GCK_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_MODULE, GckModuleClass)) typedef struct _GckModuleClass GckModuleClass; +typedef struct _GckModulePrivate GckModulePrivate; struct _GckModule { GObject parent; + GckModulePrivate *pv; gpointer reserved[4]; }; @@ -273,10 +275,12 @@ struct _GckModuleClass { GType gck_module_get_type (void) G_GNUC_CONST; -GckModule* gck_module_new (CK_FUNCTION_LIST_PTR funcs); +GckModule* gck_module_new (CK_FUNCTION_LIST_PTR funcs, + guint options); GckModule* gck_module_initialize (const gchar *path, gpointer reserved, + guint options, GError **err); gboolean gck_module_equal (gconstpointer module1, @@ -295,12 +299,6 @@ GList* gck_module_get_slots (GckModule *self, guint gck_module_get_options (GckModule *self); -void gck_module_set_options (GckModule *self, - guint options); - -void gck_module_add_options (GckModule *self, - guint options); - GList* gck_modules_get_slots (GList *modules, gboolean token_present); @@ -398,9 +396,11 @@ gboolean gck_mechanisms_check (GckMechanisms *mech #define GCK_SLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SLOT, GckSlotClass)) typedef struct _GckSlotClass GckSlotClass; +typedef struct _GckSlotPrivate GckSlotPrivate; struct _GckSlot { GObject parent; + GckSlotPrivate *pv; gpointer reserved[4]; }; @@ -416,13 +416,16 @@ gboolean gck_slot_equal (gconstpointer slot1 guint gck_slot_hash (gconstpointer slot); +GckSlot* gck_slot_from_handle (GckModule *module, + CK_SLOT_ID slot_id); + GckModule* gck_slot_get_module (GckSlot *self); CK_SLOT_ID gck_slot_get_handle (GckSlot *self); GckSlotInfo* gck_slot_get_info (GckSlot *self); -GckTokenInfo* gck_slot_get_token_info (GckSlot *self); +GckTokenInfo* gck_slot_get_token_info (GckSlot *self); GckMechanisms* gck_slot_get_mechanisms (GckSlot *self); @@ -498,9 +501,11 @@ void gck_session_info_free (GckSessionInfo *sess #define GCK_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SESSION, GckSessionClass)) typedef struct _GckSessionClass GckSessionClass; +typedef struct _GckSessionPrivate GckSessionPrivate; struct _GckSession { GObject parent; + GckSessionPrivate *pv; gpointer reserved[4]; }; @@ -1000,9 +1005,11 @@ GckObject* gck_session_derive_key_finish (GckSession *self, #define GCK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_OBJECT, GckObjectClass)) typedef struct _GckObjectClass GckObjectClass; +typedef struct _GckObjectPrivate GckObjectPrivate; struct _GckObject { GObject parent; + GckObjectPrivate *pv; gpointer reserved[4]; }; diff --git a/gck/tests/test-gck-crypto.c b/gck/tests/test-gck-crypto.c index e0232d2b..315f629b 100644 --- a/gck/tests/test-gck-crypto.c +++ b/gck/tests/test-gck-crypto.c @@ -9,33 +9,42 @@ #include "gck-test.h" static GckModule *module = NULL; -static GckSlot *slot = NULL; +static GckModule *module_with_auth = NULL; static GckSession *session = NULL; +static GckSession *session_with_auth = NULL; DEFINE_SETUP(crypto_session) { GError *err = NULL; GList *slots; + GckSlot *slot; /* Successful load */ - module = gck_module_initialize (".libs/libgck-test-module.so", NULL, &err); + module = gck_module_initialize (".libs/libgck-test-module.so", NULL, 0, &err); SUCCESS_RES (module, err); slots = gck_module_get_slots (module, TRUE); g_assert (slots != NULL); - slot = GCK_SLOT (slots->data); - g_object_ref (slot); - gck_list_unref_free (slots); - - session = gck_slot_open_session (slot, 0, &err); + session = gck_slot_open_session (slots->data, 0, &err); SUCCESS_RES(session, err); + + module_with_auth = gck_module_new (gck_module_get_functions (module), GCK_AUTHENTICATE_OBJECTS); + g_assert (module_with_auth); + + slot = gck_slot_from_handle (module_with_auth, gck_slot_get_handle (slots->data)); + g_assert (slot); + + session_with_auth = gck_session_from_handle (slot, gck_session_get_handle (session)); + g_assert (session_with_auth); + + g_object_unref (slot); + gck_list_unref_free (slots); } DEFINE_TEARDOWN(crypto_session) { g_object_unref (session); - g_object_unref (slot); g_object_unref (module); } @@ -261,7 +270,6 @@ DEFINE_TEST(sign) mech = gck_mechanism_new_with_param (CKM_PREFIX, "my-prefix:", 10); /* Enable auto-login on this session, see previous test */ - gck_module_set_options (module, GCK_AUTHENTICATE_OBJECTS); g_signal_connect (module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); /* Find the right key */ @@ -311,7 +319,6 @@ DEFINE_TEST(verify) mech = gck_mechanism_new_with_param (CKM_PREFIX, "my-prefix:", 10); /* Enable auto-login on this session, shouldn't be needed */ - gck_module_set_options (module, GCK_AUTHENTICATE_OBJECTS); g_signal_connect (module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); /* Find the right key */ diff --git a/gck/tests/test-gck-module.c b/gck/tests/test-gck-module.c index 955ae49e..67b2be33 100644 --- a/gck/tests/test-gck-module.c +++ b/gck/tests/test-gck-module.c @@ -12,7 +12,7 @@ DEFINE_SETUP(load_module) GError *err = NULL; /* Successful load */ - module = gck_module_initialize (".libs/libgck-test-module.so", NULL, &err); + module = gck_module_initialize (".libs/libgck-test-module.so", NULL, 0, &err); SUCCESS_RES (module, err); } @@ -27,11 +27,11 @@ DEFINE_TEST(invalid_modules) GError *err = NULL; /* Shouldn't be able to load modules */ - invalid = gck_module_initialize ("blah-blah-non-existant", NULL, &err); + invalid = gck_module_initialize ("blah-blah-non-existant", NULL, 0, &err); FAIL_RES (invalid, err); /* Shouldn't be able to load any file successfully */ - invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, &err); + invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, 0, &err); FAIL_RES (invalid, err); } @@ -46,7 +46,7 @@ DEFINE_TEST(module_equals_hash) g_assert (gck_module_equal (module, module)); - other = gck_module_new (gck_module_get_functions (module)); + other = gck_module_new (gck_module_get_functions (module), 0); obj = g_object_new (G_TYPE_OBJECT, NULL); g_assert (gck_module_equal (module, other)); diff --git a/gck/tests/test-gck-object.c b/gck/tests/test-gck-object.c index c6e5da46..10f4ef02 100644 --- a/gck/tests/test-gck-object.c +++ b/gck/tests/test-gck-object.c @@ -19,7 +19,7 @@ DEFINE_SETUP(prep_object) GList *slots; /* Successful load */ - module = gck_module_initialize (".libs/libgck-test-module.so", NULL, &err); + module = gck_module_initialize (".libs/libgck-test-module.so", NULL, 0, &err); SUCCESS_RES (module, err); slots = gck_module_get_slots (module, TRUE); diff --git a/gck/tests/test-gck-session.c b/gck/tests/test-gck-session.c index d60931d0..3cf535d3 100644 --- a/gck/tests/test-gck-session.c +++ b/gck/tests/test-gck-session.c @@ -18,7 +18,7 @@ DEFINE_SETUP(load_session) GList *slots; /* Successful load */ - module = gck_module_initialize (".libs/libgck-test-module.so", NULL, &err); + module = gck_module_initialize (".libs/libgck-test-module.so", NULL, 0, &err); SUCCESS_RES (module, err); slots = gck_module_get_slots (module, TRUE); @@ -195,6 +195,8 @@ authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **pass DEFINE_TEST(auto_login) { GckObject *object; + GckModule *module_with_auth; + GckSlot *slot_with_auth; GckSession *new_session; GAsyncResult *result = NULL; GError *err = NULL; @@ -208,56 +210,57 @@ DEFINE_TEST(auto_login) gck_attributes_add_boolean (attrs, CKA_PRIVATE, CK_TRUE); /* Try to do something that requires a login */ + g_assert_cmpuint (gck_module_get_options (module), ==, 0); object = gck_session_create_object (session, attrs, NULL, &err); g_assert (!object); g_assert (err && err->code == CKR_USER_NOT_LOGGED_IN); g_clear_error (&err); /* Setup for auto login */ - g_assert (gck_module_get_options (module) == 0); - gck_module_set_options (module, GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS); - g_assert (gck_module_get_options (module) == (GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS)); - g_object_get (module, "options", &value, NULL); - g_assert (value == (GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS)); + module_with_auth = gck_module_new (gck_module_get_functions (module), GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS); + g_assert (gck_module_get_options (module_with_auth) == (GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS)); + g_object_get (module_with_auth, "options", &value, NULL); + g_assert_cmpuint (value, ==, (GCK_AUTHENTICATE_TOKENS | GCK_AUTHENTICATE_OBJECTS)); - g_signal_connect (module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35)); + g_signal_connect (module_with_auth, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35)); /* Create a new session */ - new_session = gck_slot_open_session (slot, CKF_RW_SESSION, &err); + slot_with_auth = g_object_new (GCK_TYPE_SLOT, "module", module_with_auth, "handle", gck_slot_get_handle (slot), NULL); + new_session = gck_slot_open_session (slot_with_auth, CKF_RW_SESSION, &err); SUCCESS_RES (new_session, err); g_object_unref (new_session); /* Try again to do something that requires a login */ - object = gck_session_create_object (session, attrs, NULL, &err); + object = gck_session_create_object (new_session, attrs, NULL, &err); SUCCESS_RES (object, err); g_object_unref (object); /* We should now be logged in, try to log out */ - ret = gck_session_logout (session, &err); + ret = gck_session_logout (new_session, &err); SUCCESS_RES (ret, err); /* Now try the same thing, but asyncronously */ - gck_slot_open_session_async (slot, CKF_RW_SESSION, NULL, NULL, NULL, fetch_async_result, &result); + gck_slot_open_session_async (slot_with_auth, CKF_RW_SESSION, NULL, NULL, NULL, fetch_async_result, &result); testing_wait_until (500); g_assert (result != NULL); - new_session = gck_slot_open_session_finish (slot, result, &err); + new_session = gck_slot_open_session_finish (slot_with_auth, result, &err); SUCCESS_RES (new_session, err); g_object_unref (result); g_object_unref (new_session); result = NULL; - gck_session_create_object_async (session, attrs, NULL, fetch_async_result, &result); + gck_session_create_object_async (new_session, attrs, NULL, fetch_async_result, &result); testing_wait_until (500); g_assert (result != NULL); - object = gck_session_create_object_finish (session, result, &err); + object = gck_session_create_object_finish (new_session, result, &err); SUCCESS_RES (object, err); g_object_unref (result); g_object_unref (object); /* We should now be logged in, try to log out */ - ret = gck_session_logout (session, &err); + ret = gck_session_logout (new_session, &err); SUCCESS_RES (ret, err); - g_object_set (module, "options", 0, NULL); - g_assert_cmpuint (gck_module_get_options (module), ==, 0); + g_object_unref (slot_with_auth); + g_object_unref (module_with_auth); } diff --git a/gck/tests/test-gck-slot.c b/gck/tests/test-gck-slot.c index 6743508a..3e4bd647 100644 --- a/gck/tests/test-gck-slot.c +++ b/gck/tests/test-gck-slot.c @@ -14,7 +14,7 @@ DEFINE_SETUP(load_slots) GList *slots; /* Successful load */ - module = gck_module_initialize (".libs/libgck-test-module.so", NULL, &err); + module = gck_module_initialize (".libs/libgck-test-module.so", NULL, 0, &err); SUCCESS_RES (module, err); slots = gck_module_get_slots (module, TRUE); @@ -111,7 +111,7 @@ DEFINE_TEST(slot_equals_hash) g_assert (gck_slot_equal (slot, slot)); - other_mod = gck_module_new (gck_module_get_functions (module)); + other_mod = gck_module_new (gck_module_get_functions (module), 0); other_slot = g_object_new (GCK_TYPE_SLOT, "module", other_mod, "handle", gck_slot_get_handle (slot), NULL); g_assert (gck_slot_equal (slot, other_slot)); g_object_unref (other_mod); |