[gnome-keyring/dbus-api: 6/6] [pkcs11] Cleaner way of associating data with credentials.



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]