[gcr] gck: GTlsInteraction is set on sessions, not slots



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]