summaryrefslogtreecommitdiff
path: root/pkcs11/secret-store
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-03-05 12:43:48 +0100
committerStef Walter <stefw@gnome.org>2013-03-05 18:40:28 +0100
commitc90a1cca64b2cf0da8e4b38baa905434beff5e72 (patch)
tree3d364ac8372a0fd556e859895519a6f7243b9b32 /pkcs11/secret-store
parent527da9c6f6af487d4eb4142c160a88d6f6fff815 (diff)
downloadgnome-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.c2
-rw-r--r--pkcs11/secret-store/gkm-secret-item.c8
-rw-r--r--pkcs11/secret-store/gkm-secret-object.c52
-rw-r--r--pkcs11/secret-store/gkm-secret-object.h5
-rw-r--r--pkcs11/secret-store/tests/test-secret-object.c8
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));
}