diff options
author | Stef Walter <stefw@gnome.org> | 2013-03-05 12:43:48 +0100 |
---|---|---|
committer | Stef Walter <stefw@gnome.org> | 2013-03-05 18:40:28 +0100 |
commit | c90a1cca64b2cf0da8e4b38baa905434beff5e72 (patch) | |
tree | 3d364ac8372a0fd556e859895519a6f7243b9b32 /pkcs11/secret-store | |
parent | 527da9c6f6af487d4eb4142c160a88d6f6fff815 (diff) | |
download | gnome-keyring-c90a1cca64b2cf0da8e4b38baa905434beff5e72.tar.gz |
secret-store: Update the Created and Modified properties correctly
* Set the Modified property before committing transactions
* Set the Created property when items and collections are created
* Add tests for this functionality
https://bugzilla.gnome.org/show_bug.cgi?id=695052
Diffstat (limited to 'pkcs11/secret-store')
-rw-r--r-- | pkcs11/secret-store/gkm-secret-collection.c | 2 | ||||
-rw-r--r-- | pkcs11/secret-store/gkm-secret-item.c | 8 | ||||
-rw-r--r-- | pkcs11/secret-store/gkm-secret-object.c | 52 | ||||
-rw-r--r-- | pkcs11/secret-store/gkm-secret-object.h | 5 | ||||
-rw-r--r-- | pkcs11/secret-store/tests/test-secret-object.c | 8 |
5 files changed, 64 insertions, 11 deletions
diff --git a/pkcs11/secret-store/gkm-secret-collection.c b/pkcs11/secret-store/gkm-secret-collection.c index cd5df634..6e5bb953 100644 --- a/pkcs11/secret-store/gkm-secret-collection.c +++ b/pkcs11/secret-store/gkm-secret-collection.c @@ -334,6 +334,7 @@ factory_create_collection (GkmSession *session, GkmTransaction *transaction, "label", label, NULL); + gkm_secret_object_mark_created (GKM_SECRET_OBJECT (collection)); g_free (identifier); g_free (label); @@ -795,6 +796,7 @@ gkm_secret_collection_create_item (GkmSecretCollection *self, GkmTransaction *tr g_free (identifier); add_item (self, transaction, item); + gkm_secret_object_mark_created (GKM_SECRET_OBJECT (item)); g_object_unref (item); return item; } diff --git a/pkcs11/secret-store/gkm-secret-item.c b/pkcs11/secret-store/gkm-secret-item.c index d7cbdb38..a2a92e6c 100644 --- a/pkcs11/secret-store/gkm-secret-item.c +++ b/pkcs11/secret-store/gkm-secret-item.c @@ -67,7 +67,6 @@ complete_set_schema (GkmTransaction *transaction, GObject *obj, gpointer user_da } else { gkm_object_notify_attribute (GKM_OBJECT (obj), CKA_G_SCHEMA); g_object_notify (G_OBJECT (obj), "schema"); - gkm_secret_object_was_modified (GKM_SECRET_OBJECT (self)); g_free (old_schema); } @@ -81,6 +80,7 @@ begin_set_schema (GkmSecretItem *self, GkmTransaction *transaction, gchar *schem g_assert (!gkm_transaction_get_failed (transaction)); if (self->schema != schema) { + gkm_secret_object_begin_modified (GKM_SECRET_OBJECT (self), transaction); gkm_transaction_add (transaction, self, complete_set_schema, self->schema); self->schema = schema; } @@ -89,11 +89,8 @@ begin_set_schema (GkmSecretItem *self, GkmTransaction *transaction, gchar *schem static gboolean complete_set_secret (GkmTransaction *transaction, GObject *obj, gpointer user_data) { - GkmSecretItem *self = GKM_SECRET_ITEM (obj); - if (!gkm_transaction_get_failed (transaction)) { gkm_object_notify_attribute (GKM_OBJECT (obj), CKA_VALUE); - gkm_secret_object_was_modified (GKM_SECRET_OBJECT (self)); } return TRUE; @@ -112,7 +109,6 @@ complete_set_fields (GkmTransaction *transaction, GObject *obj, gpointer user_da } else { gkm_object_notify_attribute (GKM_OBJECT (obj), CKA_G_FIELDS); g_object_notify (G_OBJECT (obj), "fields"); - gkm_secret_object_was_modified (GKM_SECRET_OBJECT (self)); if (old_fields) g_hash_table_unref (old_fields); } @@ -126,6 +122,7 @@ begin_set_fields (GkmSecretItem *self, GkmTransaction *transaction, GHashTable * g_assert (GKM_IS_SECRET_OBJECT (self)); g_assert (!gkm_transaction_get_failed (transaction)); + gkm_secret_object_begin_modified (GKM_SECRET_OBJECT (self), transaction); gkm_transaction_add (transaction, self, complete_set_fields, self->fields); self->fields = fields; } @@ -278,6 +275,7 @@ gkm_secret_item_real_set_attribute (GkmObject *base, GkmSession *session, gkm_secret_data_set_transacted (sdata, transaction, identifier, secret); g_object_unref (secret); g_object_unref (sdata); + gkm_secret_object_begin_modified (GKM_SECRET_OBJECT (self), transaction); if (!gkm_transaction_get_failed (transaction)) gkm_transaction_add (transaction, self, complete_set_secret, NULL); return; diff --git a/pkcs11/secret-store/gkm-secret-object.c b/pkcs11/secret-store/gkm-secret-object.c index 2c71719d..580dfa67 100644 --- a/pkcs11/secret-store/gkm-secret-object.c +++ b/pkcs11/secret-store/gkm-secret-object.c @@ -64,7 +64,6 @@ complete_set_label (GkmTransaction *transaction, GObject *obj, gpointer user_dat } else { gkm_object_notify_attribute (GKM_OBJECT (obj), CKA_LABEL); g_object_notify (G_OBJECT (obj), "label"); - gkm_secret_object_was_modified (self); g_free (old_label); } @@ -77,6 +76,7 @@ begin_set_label (GkmSecretObject *self, GkmTransaction *transaction, gchar *labe g_assert (GKM_IS_SECRET_OBJECT (self)); g_assert (!gkm_transaction_get_failed (transaction)); + gkm_secret_object_begin_modified (GKM_SECRET_OBJECT (self), transaction); gkm_transaction_add (transaction, self, complete_set_label, self->pv->label); self->pv->label = label; } @@ -361,11 +361,30 @@ gkm_secret_object_get_created (GkmSecretObject *self) void gkm_secret_object_set_created (GkmSecretObject *self, glong when) { + GTimeVal tv; + g_return_if_fail (GKM_IS_SECRET_OBJECT (self)); + + if (when < 0) { + g_get_current_time (&tv); + when = tv.tv_sec; + } + self->pv->created = when; g_object_notify (G_OBJECT (self), "created"); } +void +gkm_secret_object_mark_created (GkmSecretObject *self) +{ + GTimeVal tv; + + g_return_if_fail (GKM_IS_SECRET_OBJECT (self)); + + g_get_current_time (&tv); + gkm_secret_object_set_created (self, tv.tv_sec); +} + glong gkm_secret_object_get_modified (GkmSecretObject *self) { @@ -381,13 +400,38 @@ gkm_secret_object_set_modified (GkmSecretObject *self, glong when) g_object_notify (G_OBJECT (self), "modified"); } +static gboolean +complete_set_modified (GkmTransaction *transaction, + GObject *obj, + gpointer user_data) +{ + GkmSecretObject *self = GKM_SECRET_OBJECT (obj); + glong *old_modified = user_data; + + if (gkm_transaction_get_failed (transaction)) { + self->pv->modified = *old_modified; + + } else { + gkm_object_notify_attribute (GKM_OBJECT (obj), CKA_G_MODIFIED); + g_object_notify (G_OBJECT (obj), "modified"); + } + + g_free (old_modified); + return TRUE; +} + void -gkm_secret_object_was_modified (GkmSecretObject *self) +gkm_secret_object_begin_modified (GkmSecretObject *self, + GkmTransaction *transaction) { GTimeVal tv; - g_return_if_fail (GKM_IS_SECRET_OBJECT (self)); + + g_return_if_fail (!gkm_transaction_get_failed (transaction)); + gkm_transaction_add (transaction, self, complete_set_modified, + g_memdup (&self->pv->modified, sizeof (gulong))); + g_get_current_time (&tv); - gkm_secret_object_set_modified (self, tv.tv_sec); + self->pv->modified = tv.tv_sec; } gboolean diff --git a/pkcs11/secret-store/gkm-secret-object.h b/pkcs11/secret-store/gkm-secret-object.h index 9cd458a0..1dc361ca 100644 --- a/pkcs11/secret-store/gkm-secret-object.h +++ b/pkcs11/secret-store/gkm-secret-object.h @@ -64,12 +64,15 @@ glong gkm_secret_object_get_created (GkmSecretObject *self); void gkm_secret_object_set_created (GkmSecretObject *self, glong value); +void gkm_secret_object_mark_created (GkmSecretObject *self); + glong gkm_secret_object_get_modified (GkmSecretObject *self); void gkm_secret_object_set_modified (GkmSecretObject *self, glong value); -void gkm_secret_object_was_modified (GkmSecretObject *self); +void gkm_secret_object_begin_modified (GkmSecretObject *self, + GkmTransaction *transaction); gboolean gkm_secret_object_is_locked (GkmSecretObject *self, GkmSession *session); diff --git a/pkcs11/secret-store/tests/test-secret-object.c b/pkcs11/secret-store/tests/test-secret-object.c index be33ff56..a916387e 100644 --- a/pkcs11/secret-store/tests/test-secret-object.c +++ b/pkcs11/secret-store/tests/test-secret-object.c @@ -129,9 +129,15 @@ test_modified_prop (Test *test, gconstpointer unused) static void test_was_modified (Test *test, gconstpointer unused) { + GkmTransaction *transaction; GTimeVal tv; + g_get_current_time (&tv); - gkm_secret_object_was_modified (test->object); + + transaction = gkm_transaction_new (); + gkm_secret_object_begin_modified (test->object, transaction); + g_assert_cmpuint (gkm_transaction_complete_and_unref (transaction), ==, CKR_OK); + g_assert (tv.tv_sec == gkm_secret_object_get_modified (test->object)); } |