[gnome-keyring/gnome-3-0] gcr: Login properly when importing private keys.



commit 74f990b8beab63c57fbf9a6ae3df04f1be572b55
Author: Stef Walter <stefw collabora co uk>
Date:   Mon May 30 12:21:04 2011 +0200

    gcr: Login properly when importing private keys.

 gcr/gcr-importer.c |   18 +++++++++++++++---
 gcr/gcr-parser.c   |   11 +++++++++++
 2 files changed, 26 insertions(+), 3 deletions(-)
---
diff --git a/gcr/gcr-importer.c b/gcr/gcr-importer.c
index 6657e3c..5b168fc 100644
--- a/gcr/gcr-importer.c
+++ b/gcr/gcr-importer.c
@@ -97,6 +97,7 @@ struct _GcrImporterPrivate {
 	GByteArray *buffer;
 	GckSession *session;
 	GQueue queue;
+	gboolean any_private;
 
 	/* Extra async stuff */
 	GAsyncReadyCallback callback;
@@ -136,6 +137,7 @@ cleanup_state_data (GcrImporter *self)
 	while ((attrs = g_queue_pop_head (&self->pv->queue)) != NULL)
 		gck_attributes_unref (attrs);
 	g_assert (g_queue_is_empty (&self->pv->queue));
+	self->pv->any_private = FALSE;
 
 	if (self->pv->cancel)
 		g_object_unref (self->pv->cancel);
@@ -376,6 +378,7 @@ on_open_session (GObject *obj, GAsyncResult *res, gpointer user_data)
 static void
 state_open_session (GcrImporter *self, gboolean async)
 {
+	guint options = GCK_SESSION_READ_WRITE;
 	GckSession *session;
 	GError *error = NULL;
 	
@@ -384,12 +387,14 @@ state_open_session (GcrImporter *self, gboolean async)
 		next_state (self, state_failure);
 		
 	} else {
-		
+		if (self->pv->any_private)
+			options |= GCK_SESSION_LOGIN_USER;
+
 		if (async) {
-			gck_slot_open_session_async (self->pv->slot, GCK_SESSION_READ_WRITE, self->pv->cancel,
+			gck_slot_open_session_async (self->pv->slot, options, self->pv->cancel,
 			                             on_open_session, self);
 		} else {
-			session = gck_slot_open_session_full (self->pv->slot, GCK_SESSION_READ_WRITE, 0, NULL, NULL,
+			session = gck_slot_open_session_full (self->pv->slot, options, 0, NULL, NULL,
 			                                      self->pv->cancel, &error);
 			complete_open_session (self, session, error);
 		}
@@ -921,9 +926,16 @@ gcr_importer_listen (GcrImporter *self, GcrParser *parser)
 void
 gcr_importer_queue (GcrImporter *self, const gchar *label, GckAttributes *attrs)
 {
+	gboolean is_private;
+
 	g_return_if_fail (GCR_IS_IMPORTER (self));
 	g_return_if_fail (attrs);
 
+	if (!gck_attributes_find_boolean (attrs, CKA_PRIVATE, &is_private))
+		is_private = FALSE;
+	if (is_private)
+		self->pv->any_private = TRUE;
+
 	g_queue_push_tail (&self->pv->queue, gck_attributes_ref (attrs));
 	g_signal_emit (self, signals[QUEUED], 0, label, attrs);
 }
diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c
index 1ab990c..b24f65a 100644
--- a/gcr/gcr-parser.c
+++ b/gcr/gcr-parser.c
@@ -306,6 +306,14 @@ parsed_ulong (GcrParser *self, CK_ATTRIBUTE_TYPE type, gulong value)
 	gck_attributes_add_ulong (self->pv->parsed_attrs, type, value);
 }
 
+static void
+parsed_boolean (GcrParser *self, CK_ATTRIBUTE_TYPE type, gboolean value)
+{
+	g_assert (GCR_IS_PARSER (self));
+	g_assert (self->pv->parsed_attrs);
+	gck_attributes_add_boolean (self->pv->parsed_attrs, type, value);
+}
+
 static gint
 enum_next_password (GcrParser *self, PasswordState *state, const gchar **password)
 {
@@ -379,6 +387,7 @@ parse_der_private_key_rsa (GcrParser *self, const guchar *data, gsize n_data)
 
 	parsed_clear (self, CKO_PRIVATE_KEY);
 	parsed_ulong (self, CKA_KEY_TYPE, CKK_RSA);
+	parsed_boolean (self, CKA_PRIVATE, CK_TRUE);
 	res = GCR_ERROR_FAILURE;
 
 	if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "version", NULL), &version))
@@ -426,6 +435,7 @@ parse_der_private_key_dsa (GcrParser *self, const guchar *data, gsize n_data)
 
 	parsed_clear (self, CKO_PRIVATE_KEY);
 	parsed_ulong (self, CKA_KEY_TYPE, CKK_DSA);
+	parsed_boolean (self, CKA_PRIVATE, CK_TRUE);
 	ret = GCR_ERROR_FAILURE;
 
 	if (!parsed_asn1_attribute (self, asn, data, n_data, "p", CKA_PRIME) ||
@@ -460,6 +470,7 @@ parse_der_private_key_dsa_parts (GcrParser *self, const guchar *keydata, gsize n
 
 	parsed_clear (self, CKO_PRIVATE_KEY);
 	parsed_ulong (self, CKA_KEY_TYPE, CKK_DSA);
+	parsed_boolean (self, CKA_PRIVATE, CK_TRUE);
 	ret = GCR_ERROR_FAILURE;
 
 	if (!parsed_asn1_attribute (self, asn_params, params, n_params, "p", CKA_PRIME) ||



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