[gcr] gck: GTlsInteraction is set on sessions, not slots
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcr] gck: GTlsInteraction is set on sessions, not slots
- Date: Wed, 2 Nov 2011 08:11:19 +0000 (UTC)
commit 399f40a41f058a19c490cf8e5c8ba940e053510f
Author: Stef Walter <stefw collabora co uk>
Date: Wed Nov 2 08:53:20 2011 +0100
gck: GTlsInteraction is set on sessions, not slots
* At least for now. We can figure out how to have a global interaction
handler later.
* interactions often are specific to windows which are bound to sessions
rather than being a global deal so we need to have this level of
granularity.
docs/reference/gck/gck-sections.txt | 3 +-
docs/reference/gcr/gcr.interfaces | 1 +
gck/gck-session.c | 89 ++++++++++++++++++++++++--------
gck/gck-slot.c | 96 +----------------------------------
gck/gck.h | 8 +--
gck/gck.symbols | 3 +-
gcr/gcr-pkcs11-importer.c | 11 ++---
7 files changed, 79 insertions(+), 132 deletions(-)
---
diff --git a/docs/reference/gck/gck-sections.txt b/docs/reference/gck/gck-sections.txt
index 4f96348..eacf4ba 100644
--- a/docs/reference/gck/gck-sections.txt
+++ b/docs/reference/gck/gck-sections.txt
@@ -128,8 +128,6 @@ gck_slot_hash
gck_slot_get_module
gck_slot_get_handle
gck_slot_get_info
-gck_slot_get_interaction
-gck_slot_set_interaction
gck_slot_match
gck_slot_get_token_info
gck_slot_get_mechanisms
@@ -209,6 +207,7 @@ gck_session_decrypt_finish
gck_session_login_interactive
gck_session_login_interactive_async
gck_session_login_interactive_finish
+gck_session_set_interaction
gck_session_sign
gck_session_sign_full
gck_session_sign_async
diff --git a/docs/reference/gcr/gcr.interfaces b/docs/reference/gcr/gcr.interfaces
index 5af264f..a88b4e2 100644
--- a/docs/reference/gcr/gcr.interfaces
+++ b/docs/reference/gcr/gcr.interfaces
@@ -34,6 +34,7 @@ GtkTreeViewAccessible AtkComponent AtkTable AtkSelection GtkCellAccessibleParent
GtkScrolledWindowAccessible AtkComponent
GtkWindowAccessible AtkComponent AtkWindow
GtkAction GtkBuildable
+GckSession GInitable GAsyncInitable
GdkPixbuf GIcon
GApplication GActionGroup
GtkApplication GActionGroup
diff --git a/gck/gck-session.c b/gck/gck-session.c
index 4b15e83..55ec9c1 100644
--- a/gck/gck-session.c
+++ b/gck/gck-session.c
@@ -87,13 +87,14 @@ struct _GckSessionPrivate {
/* Not modified after construct/init */
GckSlot *slot;
CK_SESSION_HANDLE handle;
- GTlsInteraction *interaction;
GckSessionOptions options;
gulong opening_flags;
gpointer app_data;
- /* Modified atomically */
- gint discarded;
+ /* Changable data locked by mutex */
+ GMutex *mutex;
+ GTlsInteraction *interaction;
+ gboolean discarded;
};
static void gck_session_initable_iface (GInitableIface *iface);
@@ -140,6 +141,7 @@ static void
gck_session_init (GckSession *self)
{
self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SESSION, GckSessionPrivate);
+ self->pv->mutex = g_mutex_new ();
}
static void
@@ -162,7 +164,7 @@ gck_session_get_property (GObject *obj, guint prop_id, GValue *value,
g_value_set_uint (value, gck_session_get_options (self));
break;
case PROP_INTERACTION:
- g_value_take_object (value, self->pv->interaction);
+ g_value_take_object (value, gck_session_get_interaction (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -184,8 +186,7 @@ gck_session_set_property (GObject *obj, guint prop_id, const GValue *value,
self->pv->handle = g_value_get_ulong (value);
break;
case PROP_INTERACTION:
- g_return_if_fail (self->pv->interaction == NULL);
- self->pv->interaction = g_value_dup_object (value);
+ gck_session_set_interaction (self, g_value_get_object (value));
break;
case PROP_SLOT:
g_return_if_fail (!self->pv->slot);
@@ -224,13 +225,19 @@ static void
gck_session_dispose (GObject *obj)
{
GckSession *self = GCK_SESSION (obj);
+ gboolean discard = FALSE;
gboolean handled;
g_return_if_fail (GCK_IS_SESSION (self));
- if (self->pv->handle != 0 &&
- g_atomic_int_compare_and_exchange (&self->pv->discarded, 0, 1)) {
+ if (self->pv->handle != 0) {
+ g_mutex_lock (self->pv->mutex);
+ discard = !self->pv->discarded;
+ self->pv->discarded = TRUE;
+ g_mutex_unlock (self->pv->mutex);
+ }
+ if (discard) {
/*
* Let the world know that we're discarding the session
* handle. This allows any necessary session reuse to work.
@@ -248,12 +255,13 @@ gck_session_finalize (GObject *obj)
{
GckSession *self = GCK_SESSION (obj);
- g_assert (self->pv->handle == 0 ||
- g_atomic_int_get (&self->pv->discarded) != 0);
+ g_assert (self->pv->handle == 0 || self->pv->discarded);
g_clear_object (&self->pv->interaction);
g_clear_object (&self->pv->slot);
+ g_mutex_free (self->pv->mutex);
+
G_OBJECT_CLASS (gck_session_parent_class)->finalize (obj);
}
@@ -599,22 +607,16 @@ gck_session_from_handle (GckSlot *slot,
gulong session_handle,
GckSessionOptions options)
{
- GTlsInteraction *interaction;
GckSession *session;
g_return_val_if_fail (GCK_IS_SLOT (slot), NULL);
- interaction = gck_slot_get_interaction (slot);
-
session = g_object_new (GCK_TYPE_SESSION,
- "interaction", interaction,
"handle", session_handle,
"slot", slot,
"options", options,
NULL);
- g_clear_object (&interaction);
-
return session;
}
@@ -782,6 +784,36 @@ gck_session_get_interaction (GckSession *self)
}
/**
+ * gck_session_set_interaction:
+ * @self: the session
+ * @interaction: (allow-none): the interaction or %NULL
+ *
+ * Set the interaction object on this session, which is used to prompt for
+ * pins and the like.
+ */
+void
+gck_session_set_interaction (GckSession *self,
+ GTlsInteraction *interaction)
+{
+ GTlsInteraction *previous;
+ g_return_if_fail (GCK_IS_SESSION (self));
+ g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction));
+
+ if (interaction)
+ g_object_ref (interaction);
+
+ g_mutex_lock (self->pv->mutex);
+
+ previous = self->pv->interaction;
+ self->pv->interaction = interaction;
+
+ g_mutex_unlock (self->pv->mutex);
+
+ if (previous)
+ g_object_unref (previous);
+}
+
+/**
* gck_session_open:
* @slot: the slot to open session on
* @options: session options
@@ -812,6 +844,7 @@ gck_session_open (GckSlot *slot,
* @slot: the slot to open session on
* @options: session options
* @interaction: (allow-none): optional interaction for logins or object authentication
+ * @cancellable: optional cancellation object
* @callback: called when the operation completes
* @user_data: data to pass to callback
*
@@ -1192,6 +1225,9 @@ gck_session_login_interactive (GckSession *self,
Interactive args = { GCK_ARGUMENTS_INIT, interaction, cancellable, NULL, };
g_return_val_if_fail (GCK_IS_SESSION (self), FALSE);
+ g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), FALSE);
+ g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
/* TODO: For now this is all we support */
g_return_val_if_fail (user_type == CKU_USER, FALSE);
@@ -1224,6 +1260,8 @@ gck_session_login_interactive_async (GckSession *self,
Interactive* args = _gck_call_async_prep (self, self, perform_interactive, NULL, sizeof (*args), free_interactive);
g_return_if_fail (GCK_IS_SESSION (self));
+ g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction));
+ g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
/* TODO: For now this is all we support */
g_return_if_fail (user_type == CKU_USER);
@@ -1250,6 +1288,8 @@ gck_session_login_interactive_finish (GckSession *self,
GAsyncResult *result,
GError **error)
{
+ g_return_val_if_fail (GCK_IS_SESSION (self), FALSE);
+
return _gck_call_basic_finish (result, error);
}
@@ -2566,14 +2606,16 @@ crypt_sync (GckSession *self, GckObject *key, GckMechanism *mechanism, const guc
args.complete_func = complete_func;
args.key_object = key;
- args.interaction = self->pv->interaction;
+ args.interaction = gck_session_get_interaction (self);
if (!_gck_call_sync (self, perform_crypt, NULL, &args, cancellable, error)) {
g_free (args.result);
- return NULL;
+ args.result = NULL;
+ } else {
+ *n_result = args.n_result;
}
- *n_result = args.n_result;
+ g_clear_object (&args.interaction);
return args.result;
}
@@ -3096,6 +3138,7 @@ gck_session_verify_full (GckSession *self, GckObject *key, GckMechanism *mechani
gsize n_signature, GCancellable *cancellable, GError **error)
{
Verify args;
+ gboolean ret;
g_return_val_if_fail (GCK_IS_OBJECT (key), FALSE);
g_return_val_if_fail (mechanism, FALSE);
@@ -3114,9 +3157,13 @@ gck_session_verify_full (GckSession *self, GckObject *key, GckMechanism *mechani
args.n_signature = n_signature;
args.key_object = key;
- args.interaction = self->pv->interaction;
+ args.interaction = gck_session_get_interaction (self);
- return _gck_call_sync (self, perform_verify, NULL, &args, cancellable, error);
+ ret = _gck_call_sync (self, perform_verify, NULL, &args, cancellable, error);
+
+ g_clear_object (&args.interaction);
+
+ return ret;
}
/**
diff --git a/gck/gck-slot.c b/gck/gck-slot.c
index 5dd9b9c..b6cd1c8 100644
--- a/gck/gck-slot.c
+++ b/gck/gck-slot.c
@@ -48,17 +48,12 @@
enum {
PROP_0,
PROP_MODULE,
- PROP_HANDLE,
- PROP_INTERACTION
+ PROP_HANDLE
};
struct _GckSlotPrivate {
GckModule *module;
CK_SLOT_ID handle;
-
- /* Changable data locked by mutex */
- GMutex *mutex;
- GTlsInteraction *interaction;
};
G_DEFINE_TYPE (GckSlot, gck_slot, G_TYPE_OBJECT);
@@ -71,7 +66,6 @@ static void
gck_slot_init (GckSlot *self)
{
self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, GCK_TYPE_SLOT, GckSlotPrivate);
- self->pv->mutex = g_mutex_new ();
}
static void
@@ -87,9 +81,6 @@ gck_slot_get_property (GObject *obj, guint prop_id, GValue *value,
case PROP_HANDLE:
g_value_set_ulong (value, gck_slot_get_handle (self));
break;
- case PROP_INTERACTION:
- g_value_take_object (value, gck_slot_get_interaction (self));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -115,9 +106,6 @@ gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value,
g_assert (!self->pv->handle);
self->pv->handle = g_value_get_ulong (value);
break;
- case PROP_INTERACTION:
- gck_slot_set_interaction (self, g_value_get_object (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -125,25 +113,11 @@ gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value,
}
static void
-gck_slot_dispose (GObject *obj)
-{
- GckSlot *self = GCK_SLOT (obj);
-
- gck_slot_set_interaction (self, NULL);
-
- G_OBJECT_CLASS (gck_slot_parent_class)->dispose (obj);
-}
-
-static void
gck_slot_finalize (GObject *obj)
{
GckSlot *self = GCK_SLOT (obj);
- g_assert (self->pv->interaction == NULL);
-
- self->pv->handle = 0;
g_clear_object (&self->pv->module);
- g_mutex_free (self->pv->mutex);
G_OBJECT_CLASS (gck_slot_parent_class)->finalize (obj);
}
@@ -156,7 +130,6 @@ gck_slot_class_init (GckSlotClass *klass)
gobject_class->get_property = gck_slot_get_property;
gobject_class->set_property = gck_slot_set_property;
- gobject_class->dispose = gck_slot_dispose;
gobject_class->finalize = gck_slot_finalize;
/**
@@ -177,17 +150,6 @@ gck_slot_class_init (GckSlotClass *klass)
g_param_spec_ulong ("handle", "Handle", "PKCS11 Slot ID",
0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- /**
- * GckSlot:interaction:
- *
- * Interaction object used to ask the user for pins when opening
- * sessions. Used if the session_options of the enumerator have
- * %GCK_SESSION_LOGIN_USER or %GCK_SESSION_AUTHENTICATE
- */
- g_object_class_install_property (gobject_class, PROP_INTERACTION,
- g_param_spec_object ("interaction", "Interaction", "Interaction asking for pins",
- G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE));
-
g_type_class_add_private (gobject_class, sizeof (GckSlotPrivate));
}
@@ -919,62 +881,6 @@ gck_slot_has_flags (GckSlot *self, gulong flags)
}
/**
- * gck_slot_get_interaction:
- * @self: the slot
- *
- * Get the interaction used when a pin is needed
- *
- * Returns: (transfer full) (allow-none): the interaction or %NULL
- */
-GTlsInteraction *
-gck_slot_get_interaction (GckSlot *self)
-{
- GTlsInteraction *result = NULL;
-
- g_return_val_if_fail (GCK_IS_SLOT (self), NULL);
-
- g_mutex_lock (self->pv->mutex);
-
- if (self->pv->interaction)
- result = g_object_ref (self->pv->interaction);
-
- g_mutex_unlock (self->pv->mutex);
-
- return result;
-}
-
-/**
- * gck_slot_set_interaction:
- * @self: the slot
- * @interaction: (allow-none): the interaction or %NULL
- *
- * Set the interaction used when a pin is needed
- */
-void
-gck_slot_set_interaction (GckSlot *self,
- GTlsInteraction *interaction)
-{
- GTlsInteraction *previous = NULL;
-
- g_return_if_fail (GCK_IS_SLOT (self));
- g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction));
-
- g_mutex_lock (self->pv->mutex);
-
- if (interaction != self->pv->interaction) {
- previous = self->pv->interaction;
- self->pv->interaction = interaction;
- if (interaction)
- g_object_ref (interaction);
- }
-
- g_mutex_unlock (self->pv->mutex);
-
- g_clear_object (&previous);
- g_object_notify (G_OBJECT (self), "interaction");
-}
-
-/**
* gck_slot_enumerate_objects:
* @self: a #GckSlot to enumerate objects on
* @match: attributes that the objects must match, or empty for all objects
diff --git a/gck/gck.h b/gck/gck.h
index 8cbcb45..79202fe 100644
--- a/gck/gck.h
+++ b/gck/gck.h
@@ -614,11 +614,6 @@ GckMechanismInfo* gck_slot_get_mechanism_info (GckSlot *self,
gboolean gck_slot_has_flags (GckSlot *self,
gulong flags);
-GTlsInteraction * gck_slot_get_interaction (GckSlot *self);
-
-void gck_slot_set_interaction (GckSlot *self,
- GTlsInteraction *interaction);
-
GckSession* gck_slot_open_session (GckSlot *self,
GckSessionOptions options,
GCancellable *cancellable,
@@ -727,6 +722,9 @@ GckSessionOptions gck_session_get_options (GckSession *self);
GTlsInteraction * gck_session_get_interaction (GckSession *self);
+void gck_session_set_interaction (GckSession *self,
+ GTlsInteraction *interaction);
+
GckSession * gck_session_open (GckSlot *slot,
GckSessionOptions options,
GTlsInteraction *interaction,
diff --git a/gck/gck.symbols b/gck/gck.symbols
index ac1a276..237b88f 100644
--- a/gck/gck.symbols
+++ b/gck/gck.symbols
@@ -190,6 +190,7 @@ gck_session_open
gck_session_open_async
gck_session_open_finish
gck_session_options_get_type
+gck_session_set_interaction
gck_session_set_pin
gck_session_set_pin_async
gck_session_set_pin_finish
@@ -214,7 +215,6 @@ gck_slot_equal
gck_slot_from_handle
gck_slot_get_handle
gck_slot_get_info
-gck_slot_get_interaction
gck_slot_get_mechanism_info
gck_slot_get_mechanisms
gck_slot_get_module
@@ -231,7 +231,6 @@ gck_slot_open_session_async
gck_slot_open_session_finish
gck_slot_open_session_full
gck_slot_open_session_full_async
-gck_slot_set_interaction
gck_slots_enumerate_objects
gck_string_from_chars
gck_string_to_chars
diff --git a/gcr/gcr-pkcs11-importer.c b/gcr/gcr-pkcs11-importer.c
index 5cc60b6..c60a17c 100644
--- a/gcr/gcr-pkcs11-importer.c
+++ b/gcr/gcr-pkcs11-importer.c
@@ -535,12 +535,11 @@ state_open_session (GSimpleAsyncResult *res,
GError *error = NULL;
if (async) {
- gck_slot_open_session_async (self->slot, options,
- data->cancellable, on_open_session,
- g_object_ref (res));
+ gck_session_open_async (self->slot, options, self->interaction,
+ data->cancellable, on_open_session, g_object_ref (res));
} else {
- session = gck_slot_open_session_full (self->slot, options, 0,
- NULL, NULL, data->cancellable, &error);
+ session = gck_session_open (self->slot, options, self->interaction,
+ data->cancellable, &error);
complete_open_session (res, session, error);
}
}
@@ -817,7 +816,6 @@ _gcr_pkcs11_importer_import_async (GcrImporter *importer,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GcrPkcs11Importer *self = GCR_PKCS11_IMPORTER (importer);
GSimpleAsyncResult *res;
GcrImporterData *data;
@@ -830,7 +828,6 @@ _gcr_pkcs11_importer_import_async (GcrImporter *importer,
g_simple_async_result_set_op_res_gpointer (res, data, gcr_importer_data_free);
supplement_prep (res);
- gck_slot_set_interaction (self->slot, self->interaction);
next_state (res, state_open_session);
g_object_unref (res);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]