diff --git a/library/secret-item.c b/library/secret-item.c index a9a871c..3180d26 100644 --- a/library/secret-item.c +++ b/library/secret-item.c @@ -1728,6 +1728,32 @@ secret_item_set_secret_sync (SecretItem *self, return ret; } +/** + * secret_item_get_schema_name: + * @self: an item + * + * Gets the name of the schema that this item was stored with. This is also + * available at the xdg:schema attribute. + * + * Returns: (transfer full): the schema name + */ +gchar * +secret_item_get_schema_name (SecretItem *self) +{ + gchar *schema_name; + GVariant *variant; + + g_return_val_if_fail (SECRET_IS_ITEM (self), NULL); + + variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Attributes"); + g_return_val_if_fail (variant != NULL, NULL); + + g_variant_lookup (variant, "xdg:schema", "s", &schema_name); + g_variant_unref (variant); + + return schema_name; +} + /** * secret_item_get_attributes: * @self: an item @@ -1787,15 +1813,19 @@ secret_item_set_attributes (SecretItem *self, GAsyncReadyCallback callback, gpointer user_data) { + const gchar *schema_name = NULL; + g_return_if_fail (SECRET_IS_ITEM (self)); g_return_if_fail (attributes != NULL); - /* Warnings raised already */ - if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE)) - return; + if (schema != NULL) { + if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE)) + return; /* Warnings raised already */ + schema_name = schema->name; + } _secret_util_set_property (G_DBUS_PROXY (self), "Attributes", - _secret_attributes_to_variant (attributes, NULL), + _secret_attributes_to_variant (attributes, schema_name), secret_item_set_attributes, cancellable, callback, user_data); } @@ -1848,15 +1878,19 @@ secret_item_set_attributes_sync (SecretItem *self, GCancellable *cancellable, GError **error) { + const gchar *schema_name = NULL; + g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE); g_return_val_if_fail (attributes != NULL, FALSE); - /* Warnings raised already */ - if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE)) - return FALSE; + if (schema != NULL) { + if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE)) + return FALSE; /* Warnings raised already */ + schema_name = schema->name; + } return _secret_util_set_property_sync (G_DBUS_PROXY (self), "Attributes", - _secret_attributes_to_variant (attributes, NULL), + _secret_attributes_to_variant (attributes, schema_name), cancellable, error); } diff --git a/library/secret-item.h b/library/secret-item.h index ed2ea76..85863cb 100644 --- a/library/secret-item.h +++ b/library/secret-item.h @@ -141,6 +141,8 @@ gboolean secret_item_set_secret_sync (SecretItem *self, GCancellable *cancellable, GError **error); +gchar * secret_item_get_schema_name (SecretItem *self); + GHashTable* secret_item_get_attributes (SecretItem *self); void secret_item_set_attributes (SecretItem *self, diff --git a/library/tests/test-item.c b/library/tests/test-item.c index 6c844a2..c2ab9b2 100644 --- a/library/tests/test-item.c +++ b/library/tests/test-item.c @@ -30,6 +30,16 @@ #include #include +static const SecretSchema MOCK_SCHEMA = { + "org.mock.Schema.Item", + SECRET_SCHEMA_NONE, + { + { "number", SECRET_SCHEMA_ATTRIBUTE_INTEGER }, + { "string", SECRET_SCHEMA_ATTRIBUTE_STRING }, + { "even", SECRET_SCHEMA_ATTRIBUTE_BOOLEAN }, + } +}; + typedef struct { SecretService *service; } Test; @@ -179,7 +189,7 @@ test_create_sync (Test *test, value = secret_value_new ("Hoohah", -1, "text/plain"); - item = secret_item_create_sync (collection, NULL, attributes, "Tunnel", + item = secret_item_create_sync (collection, &MOCK_SCHEMA, attributes, "Tunnel", value, FALSE, NULL, &error); g_assert_no_error (error); @@ -218,7 +228,7 @@ test_create_async (Test *test, value = secret_value_new ("Hoohah", -1, "text/plain"); - secret_item_create (collection, NULL, attributes, "Tunnel", + secret_item_create (collection, &MOCK_SCHEMA, attributes, "Tunnel", value, FALSE, NULL, on_async_result, &result); g_assert_no_error (error); @@ -407,6 +417,7 @@ test_set_attributes_sync (Test *test, SecretItem *item; gboolean ret; GHashTable *attributes; + gchar *schema_name; item = secret_item_new_for_dbus_path_sync (test->service, item_path, SECRET_ITEM_NONE, NULL, &error); g_assert_no_error (error); @@ -418,10 +429,15 @@ test_set_attributes_sync (Test *test, g_assert_cmpuint (g_hash_table_size (attributes), ==, 4); g_hash_table_unref (attributes); + /* Has some other schema */ + schema_name = secret_item_get_schema_name (item); + g_assert_cmpstr (schema_name, !=, MOCK_SCHEMA.name); + g_free (schema_name); + attributes = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (attributes, "string", "five"); g_hash_table_insert (attributes, "number", "5"); - ret = secret_item_set_attributes_sync (item, NULL, attributes, NULL, &error); + ret = secret_item_set_attributes_sync (item, &MOCK_SCHEMA, attributes, NULL, &error); g_hash_table_unref (attributes); g_assert_no_error (error); g_assert (ret == TRUE); @@ -429,9 +445,14 @@ test_set_attributes_sync (Test *test, attributes = secret_item_get_attributes (item); g_assert_cmpstr (g_hash_table_lookup (attributes, "string"), ==, "five"); g_assert_cmpstr (g_hash_table_lookup (attributes, "number"), ==, "5"); - g_assert_cmpuint (g_hash_table_size (attributes), ==, 2); + g_assert_cmpuint (g_hash_table_size (attributes), ==, 3); g_hash_table_unref (attributes); + /* Now has our schema */ + schema_name = secret_item_get_schema_name (item); + g_assert_cmpstr (schema_name, ==, MOCK_SCHEMA.name); + g_free (schema_name); + g_object_unref (item); } @@ -444,6 +465,7 @@ test_set_attributes_async (Test *test, GError *error = NULL; GAsyncResult *result = NULL; SecretItem *item; + gchar *schema_name; gboolean ret; item = secret_item_new_for_dbus_path_sync (test->service, item_path, SECRET_ITEM_NONE, NULL, &error); @@ -456,10 +478,15 @@ test_set_attributes_async (Test *test, g_assert_cmpuint (g_hash_table_size (attributes), ==, 4); g_hash_table_unref (attributes); + /* Has some other schema */ + schema_name = secret_item_get_schema_name (item); + g_assert_cmpstr (schema_name, !=, MOCK_SCHEMA.name); + g_free (schema_name); + attributes = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (attributes, "string", "five"); g_hash_table_insert (attributes, "number", "5"); - secret_item_set_attributes (item, NULL, attributes, NULL, on_async_result, &result); + secret_item_set_attributes (item, &MOCK_SCHEMA, attributes, NULL, on_async_result, &result); g_assert (result == NULL); egg_test_wait (); @@ -472,9 +499,14 @@ test_set_attributes_async (Test *test, attributes = secret_item_get_attributes (item); g_assert_cmpstr (g_hash_table_lookup (attributes, "string"), ==, "five"); g_assert_cmpstr (g_hash_table_lookup (attributes, "number"), ==, "5"); - g_assert_cmpuint (g_hash_table_size (attributes), ==, 2); + g_assert_cmpuint (g_hash_table_size (attributes), ==, 3); g_hash_table_unref (attributes); + /* Now has our schema */ + schema_name = secret_item_get_schema_name (item); + g_assert_cmpstr (schema_name, ==, MOCK_SCHEMA.name); + g_free (schema_name); + g_object_unref (item); }