[gnome-keyring/dbus-api: 6/6] [pkcs11] Cleaner way of associating data with credentials.
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-keyring/dbus-api: 6/6] [pkcs11] Cleaner way of associating data with credentials.
- Date: Wed, 11 Nov 2009 00:59:58 +0000 (UTC)
commit 6eaa69672ed3079639bb9121f393a55f038db28c
Author: Stef Walter <stef memberwebs com>
Date: Tue Nov 10 05:05:42 2009 +0000
[pkcs11] Cleaner way of associating data with credentials.
Don't use g_object_set_data instead use our own way of
associating data with credentials.
pkcs11/gck/gck-credential.c | 29 ++++++++++++++++++++++++++-
pkcs11/gck/gck-credential.h | 6 +++++
pkcs11/gck/gck-private-key.c | 14 +++++-------
pkcs11/gck/tests/unit-test-credential.c | 24 ++++++++++++++++++++++
pkcs11/secret-store/gck-secret-collection.c | 7 ++---
5 files changed, 67 insertions(+), 13 deletions(-)
---
diff --git a/pkcs11/gck/gck-credential.c b/pkcs11/gck/gck-credential.c
index 0a1584f..2002e34 100644
--- a/pkcs11/gck/gck-credential.c
+++ b/pkcs11/gck/gck-credential.c
@@ -42,8 +42,10 @@ struct _GckCredentialPrivate {
/* The object we authenticated */
GckObject *object;
- /* Optional secret */
+ /* Optional secret and/or data */
GckSecret *secret;
+ gpointer user_data;
+ GDestroyNotify destroy;
/* Can limit by number of uses remaining */
gint uses_remaining;
@@ -193,6 +195,11 @@ gck_credential_dispose (GObject *obj)
g_object_unref (self->pv->secret);
self->pv->secret = NULL;
+ if (self->pv->user_data && self->pv->destroy)
+ (self->pv->destroy)(self->pv->user_data);
+ self->pv->user_data = NULL;
+ self->pv->destroy = NULL;
+
G_OBJECT_CLASS (gck_credential_parent_class)->dispose (obj);
}
@@ -203,6 +210,8 @@ gck_credential_finalize (GObject *obj)
g_assert (!self->pv->object);
g_assert (!self->pv->secret);
+ g_assert (!self->pv->user_data);
+ g_assert (!self->pv->destroy);
G_OBJECT_CLASS (gck_credential_parent_class)->finalize (obj);
}
@@ -403,3 +412,21 @@ gck_credential_throw_away_one_use (GckCredential *self)
if (self->pv->uses_remaining == 0)
self_destruct (self);
}
+
+gpointer
+gck_credential_get_data (GckCredential *self)
+{
+ g_return_val_if_fail (GCK_IS_CREDENTIAL (self), NULL);
+ return self->pv->user_data;
+}
+
+void
+gck_credential_set_data (GckCredential *self, gpointer data, GDestroyNotify destroy)
+{
+ g_return_if_fail (GCK_IS_CREDENTIAL (self));
+
+ if (self->pv->user_data && self->pv->destroy)
+ (self->pv->destroy) (self->pv->user_data);
+ self->pv->user_data = data;
+ self->pv->destroy = destroy;
+}
diff --git a/pkcs11/gck/gck-credential.h b/pkcs11/gck/gck-credential.h
index 61f135a..4b201fd 100644
--- a/pkcs11/gck/gck-credential.h
+++ b/pkcs11/gck/gck-credential.h
@@ -68,6 +68,12 @@ const gchar* gck_credential_get_password (GckCredential
GckObject* gck_credential_get_object (GckCredential *self);
+gpointer gck_credential_get_data (GckCredential *self);
+
+void gck_credential_set_data (GckCredential *self,
+ gpointer data,
+ GDestroyNotify destroy);
+
gint gck_credential_get_uses_remaining (GckCredential *self);
void gck_credential_set_uses_remaining (GckCredential *self,
diff --git a/pkcs11/gck/gck-private-key.c b/pkcs11/gck/gck-private-key.c
index edc0780..7d12c1c 100644
--- a/pkcs11/gck/gck-private-key.c
+++ b/pkcs11/gck/gck-private-key.c
@@ -175,7 +175,7 @@ acquire_from_credential (GckCredential *cred, GckObject *object, gpointer user_d
g_assert (!*result);
/* The sexp we stored on the credential */
- *result = g_object_get_data (G_OBJECT (cred), "private-key-sexp");
+ *result = gck_credential_get_data (cred);
if (*result != NULL) {
*result = gck_sexp_ref (*result);
gck_credential_throw_away_one_use (cred);
@@ -189,7 +189,7 @@ static gboolean
have_from_credential (GckCredential *cred, GckObject *object, gpointer unused)
{
/* The sexp we stored on the credential */
- return g_object_get_data (G_OBJECT (cred), "private-key-sexp") ? TRUE : FALSE;
+ return gck_credential_get_data (cred) ? TRUE : FALSE;
}
/* -----------------------------------------------------------------------------
@@ -401,12 +401,10 @@ gck_private_key_set_locked_private (GckPrivateKey *self, GckCredential *cred,
{
g_return_if_fail (GCK_IS_PRIVATE_KEY (self));
g_return_if_fail (GCK_IS_CREDENTIAL (cred));
-
- if (sexp == NULL)
- g_object_set_data (G_OBJECT (cred), "private-key-sexp", NULL);
- else
- g_object_set_data_full (G_OBJECT (cred), "private-key-sexp",
- gck_sexp_ref (sexp), gck_sexp_unref);
+ g_return_if_fail (gck_credential_get_object (cred) == GCK_OBJECT (self));
+ if (sexp != NULL)
+ gck_sexp_ref (sexp);
+ gck_credential_set_data (cred, sexp, gck_sexp_unref);
}
GckSexp*
diff --git a/pkcs11/gck/tests/unit-test-credential.c b/pkcs11/gck/tests/unit-test-credential.c
index 42dcd06..a67b47c 100644
--- a/pkcs11/gck/tests/unit-test-credential.c
+++ b/pkcs11/gck/tests/unit-test-credential.c
@@ -251,3 +251,27 @@ DEFINE_TEST(credential_login_property)
g_object_unref (cred);
}
+
+DEFINE_TEST(credential_data)
+{
+ GckCredential *cred;
+ CK_RV rv;
+
+ rv = gck_credential_create (object, NULL, (guchar*)"mock", 4, &cred);
+ g_assert (rv == CKR_OK);
+ g_assert (cred);
+
+ g_assert (gck_credential_get_data (cred) == NULL);
+
+ gck_credential_set_data (cred, g_strdup ("one"), g_free);
+
+ g_assert_cmpstr ("one", ==, gck_credential_get_data (cred));
+
+ gck_credential_set_data (cred, g_strdup ("ONE"), g_free);
+ g_assert_cmpstr ("ONE", ==, gck_credential_get_data (cred));
+
+ gck_credential_set_data (cred, NULL, NULL);
+ g_assert (gck_credential_get_data (cred) == NULL);
+
+ g_object_unref (cred);
+}
diff --git a/pkcs11/secret-store/gck-secret-collection.c b/pkcs11/secret-store/gck-secret-collection.c
index 42de851..5cad5d2 100644
--- a/pkcs11/secret-store/gck-secret-collection.c
+++ b/pkcs11/secret-store/gck-secret-collection.c
@@ -96,7 +96,7 @@ find_unlocked_secret_data (GckCredential *cred, GckObject *object, gpointer user
g_return_val_if_fail (!*result, FALSE);
- sdata = g_object_get_data (G_OBJECT (cred), "collection-secret-data");
+ sdata = gck_credential_get_data (cred);
if (sdata) {
g_return_val_if_fail (sdata == self->sdata, FALSE);
*result = sdata;
@@ -300,8 +300,7 @@ gck_secret_collection_real_unlock (GckObject *obj, GckCredential *cred)
return CKR_PIN_INCORRECT;
/* Credential now tracks our secret data */
- g_object_set_data_full (G_OBJECT (cred), "collection-secret-data",
- g_object_ref (self->sdata), g_object_unref);
+ gck_credential_set_data (cred, g_object_ref (self->sdata), g_object_unref);
return CKR_OK;
}
@@ -323,7 +322,7 @@ gck_secret_collection_real_unlock (GckObject *obj, GckCredential *cred)
switch (res) {
case GCK_DATA_SUCCESS:
- g_object_set_data_full (G_OBJECT (cred), "collection-secret-data", sdata, g_object_unref);
+ gck_credential_set_data (cred, sdata, g_object_unref);
track_secret_data (self, sdata);
return CKR_OK;
case GCK_DATA_LOCKED:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]