[gnome-keyring/gnome-3-0] gcr: Login properly when importing private keys.
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-keyring/gnome-3-0] gcr: Login properly when importing private keys.
- Date: Mon, 30 May 2011 10:21:34 +0000 (UTC)
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]