Use collection aliases with secret_password_store() and friends

* Make SECRET_COLLECTION_DEFAULT and SECRET_COLLECTION_SESSION
   be the simple aliases for those collections.
 * Accept either an alias or a path in secret_password_store()
   and secret_service_store() and friends.
This commit is contained in:
Stef Walter 2012-07-06 09:42:08 +02:00
parent 7098b856b7
commit b535ed1bbf
9 changed files with 63 additions and 41 deletions

View File

@ -66,6 +66,21 @@
* during a secret_collection_new() or secret_collection_new_sync() operation. * during a secret_collection_new() or secret_collection_new_sync() operation.
*/ */
/**
* SECRET_COLLECTION_DEFAULT:
*
* An alias to the default collection. This can be passed to secret_password_store()
* secret_service_read_alias().
*/
/**
* SECRET_COLLECTION_SESSION:
*
* An alias to the session collection, which will be cleared when the user ends
* the session. This can be passed to secret_password_store(),
* secret_service_read_alias() or similar functions.
*/
enum { enum {
PROP_0, PROP_0,
PROP_SERVICE, PROP_SERVICE,

View File

@ -1000,7 +1000,7 @@ on_store_service (GObject *source,
* @service: (allow-none): the secret service * @service: (allow-none): the secret service
* @schema: (allow-none): the schema to use to check attributes * @schema: (allow-none): the schema to use to check attributes
* @attributes: (element-type utf8 utf8): the attribute keys and values * @attributes: (element-type utf8 utf8): the attribute keys and values
* @collection_path: (allow-none): the D-Bus path to the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @value: the secret value * @value: the secret value
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -1017,7 +1017,7 @@ on_store_service (GObject *source,
* If @service is NULL, then secret_service_get() will be called to get * If @service is NULL, then secret_service_get() will be called to get
* the default #SecretService proxy. * the default #SecretService proxy.
* *
* If @collection_path is not specified, then the default collection will be * If @collection is not specified, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -1027,7 +1027,7 @@ void
secret_service_store (SecretService *service, secret_service_store (SecretService *service,
const SecretSchema *schema, const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
SecretValue *value, SecretValue *value,
GCancellable *cancellable, GCancellable *cancellable,
@ -1052,7 +1052,7 @@ secret_service_store (SecretService *service,
async = g_simple_async_result_new (G_OBJECT (service), callback, user_data, async = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
secret_service_store); secret_service_store);
store = g_slice_new0 (StoreClosure); store = g_slice_new0 (StoreClosure);
store->collection_path = g_strdup (collection_path); store->collection_path = _secret_util_collection_to_path (collection);
store->cancellable = cancellable ? g_object_ref (cancellable) : NULL; store->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
store->value = secret_value_ref (value); store->value = secret_value_ref (value);
store->properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, store->properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
@ -1117,7 +1117,7 @@ secret_service_store_finish (SecretService *service,
* @service: (allow-none): the secret service * @service: (allow-none): the secret service
* @schema: (allow-none): the schema for the attributes * @schema: (allow-none): the schema for the attributes
* @attributes: (element-type utf8 utf8): the attribute keys and values * @attributes: (element-type utf8 utf8): the attribute keys and values
* @collection_path: (allow-none): the D-Bus path to the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @value: the secret value * @value: the secret value
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -1130,7 +1130,7 @@ secret_service_store_finish (SecretService *service,
* If the attributes match a secret item already stored in the collection, then * If the attributes match a secret item already stored in the collection, then
* the item will be updated with these new values. * the item will be updated with these new values.
* *
* If @collection_path is %NULL, then the default collection will be * If @collection is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -1146,7 +1146,7 @@ gboolean
secret_service_store_sync (SecretService *service, secret_service_store_sync (SecretService *service,
const SecretSchema *schema, const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
SecretValue *value, SecretValue *value,
GCancellable *cancellable, GCancellable *cancellable,
@ -1169,7 +1169,7 @@ secret_service_store_sync (SecretService *service,
sync = _secret_sync_new (); sync = _secret_sync_new ();
g_main_context_push_thread_default (sync->context); g_main_context_push_thread_default (sync->context);
secret_service_store (service, schema, attributes, collection_path, secret_service_store (service, schema, attributes, collection,
label, value, cancellable, _secret_sync_on_result, sync); label, value, cancellable, _secret_sync_on_result, sync);
g_main_loop_run (sync->loop); g_main_loop_run (sync->loop);

View File

@ -45,7 +45,7 @@
/** /**
* secret_password_store: (skip) * secret_password_store: (skip)
* @schema: the schema for attributes * @schema: the schema for attributes
* @collection_path: (allow-none): the D-Bus object path of the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @password: the null-terminated password to store * @password: the null-terminated password to store
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -63,7 +63,7 @@
* If the attributes match a secret item already stored in the collection, then * If the attributes match a secret item already stored in the collection, then
* the item will be updated with these new values. * the item will be updated with these new values.
* *
* If @collection_path is %NULL, then the default collection will be * If @collection is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -71,7 +71,7 @@
*/ */
void void
secret_password_store (const SecretSchema *schema, secret_password_store (const SecretSchema *schema,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -91,7 +91,7 @@ secret_password_store (const SecretSchema *schema,
attributes = secret_attributes_buildv (schema, va); attributes = secret_attributes_buildv (schema, va);
va_end (va); va_end (va);
secret_password_storev (schema, attributes, collection_path, label, password, secret_password_storev (schema, attributes, collection, label, password,
cancellable, callback, user_data); cancellable, callback, user_data);
g_hash_table_unref (attributes); g_hash_table_unref (attributes);
@ -101,7 +101,7 @@ secret_password_store (const SecretSchema *schema,
* secret_password_storev: * secret_password_storev:
* @schema: the schema for attributes * @schema: the schema for attributes
* @attributes: (element-type utf8 utf8): the attribute keys and values * @attributes: (element-type utf8 utf8): the attribute keys and values
* @collection_path: (allow-none): the D-Bus object path of the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @password: the null-terminated password to store * @password: the null-terminated password to store
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -115,7 +115,7 @@ secret_password_store (const SecretSchema *schema,
* If the attributes match a secret item already stored in the collection, then * If the attributes match a secret item already stored in the collection, then
* the item will be updated with these new values. * the item will be updated with these new values.
* *
* If @collection_path is %NULL, then the default collection will be * If @collection is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -126,7 +126,7 @@ secret_password_store (const SecretSchema *schema,
void void
secret_password_storev (const SecretSchema *schema, secret_password_storev (const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -147,7 +147,7 @@ secret_password_storev (const SecretSchema *schema,
value = secret_value_new (password, -1, "text/plain"); value = secret_value_new (password, -1, "text/plain");
secret_service_store (NULL, schema, attributes, collection_path, secret_service_store (NULL, schema, attributes, collection,
label, value, cancellable, callback, user_data); label, value, cancellable, callback, user_data);
secret_value_unref (value); secret_value_unref (value);
@ -173,7 +173,7 @@ secret_password_store_finish (GAsyncResult *result,
/** /**
* secret_password_store_sync: * secret_password_store_sync:
* @schema: the schema for attributes * @schema: the schema for attributes
* @collection_path: (allow-none): the D-Bus object path of the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @password: the null-terminated password to store * @password: the null-terminated password to store
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -190,7 +190,7 @@ secret_password_store_finish (GAsyncResult *result,
* If the attributes match a secret item already stored in the collection, then * If the attributes match a secret item already stored in the collection, then
* the item will be updated with these new values. * the item will be updated with these new values.
* *
* If @collection_path is %NULL, then the default collection will be * If @collection is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -201,7 +201,7 @@ secret_password_store_finish (GAsyncResult *result,
*/ */
gboolean gboolean
secret_password_store_sync (const SecretSchema *schema, secret_password_store_sync (const SecretSchema *schema,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -222,7 +222,7 @@ secret_password_store_sync (const SecretSchema *schema,
attributes = secret_attributes_buildv (schema, va); attributes = secret_attributes_buildv (schema, va);
va_end (va); va_end (va);
ret = secret_password_storev_sync (schema, attributes, collection_path, ret = secret_password_storev_sync (schema, attributes, collection,
label, password, cancellable, error); label, password, cancellable, error);
g_hash_table_unref (attributes); g_hash_table_unref (attributes);
@ -233,7 +233,7 @@ secret_password_store_sync (const SecretSchema *schema,
* secret_password_storev_sync: * secret_password_storev_sync:
* @schema: the schema for attributes * @schema: the schema for attributes
* @attributes: (element-type utf8 utf8): the attribute keys and values * @attributes: (element-type utf8 utf8): the attribute keys and values
* @collection_path: (allow-none): the D-Bus object path of the collection where to store the secret * @collection: (allow-none): a collection alias, or D-Bus object path of the collection where to store the secret
* @label: label for the secret * @label: label for the secret
* @password: the null-terminated password to store * @password: the null-terminated password to store
* @cancellable: optional cancellation object * @cancellable: optional cancellation object
@ -246,7 +246,7 @@ secret_password_store_sync (const SecretSchema *schema,
* If the attributes match a secret item already stored in the collection, then * If the attributes match a secret item already stored in the collection, then
* the item will be updated with these new values. * the item will be updated with these new values.
* *
* If @collection_path is %NULL, then the default collection will be * If @collection is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session * used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions. * collection, which doesn't get stored across login sessions.
* *
@ -260,7 +260,7 @@ secret_password_store_sync (const SecretSchema *schema,
gboolean gboolean
secret_password_storev_sync (const SecretSchema *schema, secret_password_storev_sync (const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -283,7 +283,7 @@ secret_password_storev_sync (const SecretSchema *schema,
sync = _secret_sync_new (); sync = _secret_sync_new ();
g_main_context_push_thread_default (sync->context); g_main_context_push_thread_default (sync->context);
secret_password_storev (schema, attributes, collection_path, label, password, secret_password_storev (schema, attributes, collection, label, password,
cancellable, _secret_sync_on_result, sync); cancellable, _secret_sync_on_result, sync);
g_main_loop_run (sync->loop); g_main_loop_run (sync->loop);

View File

@ -27,7 +27,7 @@ G_BEGIN_DECLS
#include "secret-types.h" #include "secret-types.h"
void secret_password_store (const SecretSchema *schema, void secret_password_store (const SecretSchema *schema,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -37,7 +37,7 @@ void secret_password_store (const SecretSchema *sche
void secret_password_storev (const SecretSchema *schema, void secret_password_storev (const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -48,7 +48,7 @@ gboolean secret_password_store_finish (GAsyncResult *result,
GError **error); GError **error);
gboolean secret_password_store_sync (const SecretSchema *schema, gboolean secret_password_store_sync (const SecretSchema *schema,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,
@ -57,7 +57,7 @@ gboolean secret_password_store_sync (const SecretSchema *sche
gboolean secret_password_storev_sync (const SecretSchema *schema, gboolean secret_password_storev_sync (const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
const gchar *password, const gchar *password,
GCancellable *cancellable, GCancellable *cancellable,

View File

@ -1834,7 +1834,7 @@ on_create_item_session (GObject *source,
/** /**
* secret_service_create_item_dbus_path: * secret_service_create_item_dbus_path:
* @self: a secret service object * @self: a secret service object
* @collection_path: (allow-none): the D-Bus object path of the collection in which to create item * @collection_path: the D-Bus object path of the collection in which to create item
* @properties: (element-type utf8 GLib.Variant): hash table of D-Bus properties * @properties: (element-type utf8 GLib.Variant): hash table of D-Bus properties
* for the new collection * for the new collection
* @value: the secret value to store in the item * @value: the secret value to store in the item
@ -1859,10 +1859,6 @@ on_create_item_session (GObject *source,
* <literal>org.freedesktop.Secret.Item.Label</literal>. The values * <literal>org.freedesktop.Secret.Item.Label</literal>. The values
* in the hash table should be #GVariant values of the properties. * in the hash table should be #GVariant values of the properties.
* *
* If @collection_path is %NULL, then the default collection will be
* used. Use #SECRET_COLLECTION_SESSION to store the password in the session
* collection, which doesn't get stored across login sessions.
*
* This method will return immediately and complete asynchronously. The secret * This method will return immediately and complete asynchronously. The secret
* service may prompt the user. secret_service_prompt() will be used to handle * service may prompt the user. secret_service_prompt() will be used to handle
* any prompts that are required. * any prompts that are required.
@ -1881,13 +1877,11 @@ secret_service_create_item_dbus_path (SecretService *self,
ItemClosure *closure; ItemClosure *closure;
g_return_if_fail (SECRET_IS_SERVICE (self)); g_return_if_fail (SECRET_IS_SERVICE (self));
g_return_if_fail (collection_path != NULL && g_variant_is_object_path (collection_path));
g_return_if_fail (properties != NULL); g_return_if_fail (properties != NULL);
g_return_if_fail (value != NULL); g_return_if_fail (value != NULL);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
if (collection_path == NULL)
collection_path = SECRET_COLLECTION_DEFAULT;
res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
secret_service_create_item_dbus_path); secret_service_create_item_dbus_path);
closure = g_slice_new0 (ItemClosure); closure = g_slice_new0 (ItemClosure);
@ -1945,7 +1939,7 @@ secret_service_create_item_dbus_path_finish (SecretService *self,
/** /**
* secret_service_create_item_dbus_path_sync: * secret_service_create_item_dbus_path_sync:
* @self: a secret service object * @self: a secret service object
* @collection_path: (allow-none): the D-Bus path of the collection in which to create item * @collection_path: the D-Bus path of the collection in which to create item
* @properties: (element-type utf8 GLib.Variant): hash table of D-Bus properties * @properties: (element-type utf8 GLib.Variant): hash table of D-Bus properties
* for the new collection * for the new collection
* @value: the secret value to store in the item * @value: the secret value to store in the item
@ -1989,6 +1983,7 @@ secret_service_create_item_dbus_path_sync (SecretService *self,
gchar *path; gchar *path;
g_return_val_if_fail (SECRET_IS_SERVICE (self), NULL); g_return_val_if_fail (SECRET_IS_SERVICE (self), NULL);
g_return_val_if_fail (collection_path != NULL && g_variant_is_object_path (collection_path), NULL);
g_return_val_if_fail (properties != NULL, NULL); g_return_val_if_fail (properties != NULL, NULL);
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL);

View File

@ -64,6 +64,8 @@ gchar * _secret_util_parent_path (const gchar *path
gboolean _secret_util_empty_path (const gchar *path); gboolean _secret_util_empty_path (const gchar *path);
gchar * _secret_util_collection_to_path (const gchar *collection);
gint _secret_util_array_index_of (GVariant *array, gint _secret_util_array_index_of (GVariant *array,
GVariant *value); GVariant *value);

View File

@ -223,7 +223,7 @@ gint secret_service_unlock_sync (SecretService
void secret_service_store (SecretService *service, void secret_service_store (SecretService *service,
const SecretSchema *schema, const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
SecretValue *value, SecretValue *value,
GCancellable *cancellable, GCancellable *cancellable,
@ -237,7 +237,7 @@ gboolean secret_service_store_finish (SecretService
gboolean secret_service_store_sync (SecretService *service, gboolean secret_service_store_sync (SecretService *service,
const SecretSchema *schema, const SecretSchema *schema,
GHashTable *attributes, GHashTable *attributes,
const gchar *collection_path, const gchar *collection,
const gchar *label, const gchar *label,
SecretValue *value, SecretValue *value,
GCancellable *cancellable, GCancellable *cancellable,

View File

@ -37,9 +37,9 @@ typedef struct _SecretPrompt SecretPrompt;
typedef struct _SecretService SecretService; typedef struct _SecretService SecretService;
typedef struct _SecretValue SecretValue; typedef struct _SecretValue SecretValue;
#define SECRET_COLLECTION_DEFAULT "/org/freedesktop/secrets/aliases/default" #define SECRET_COLLECTION_DEFAULT "default"
#define SECRET_COLLECTION_SESSION "/org/freedesktop/secrets/aliases/session" #define SECRET_COLLECTION_SESSION "session"
G_END_DECLS G_END_DECLS

View File

@ -109,6 +109,16 @@ _secret_util_empty_path (const gchar *path)
return (g_str_equal (path, "") || g_str_equal (path, "/")); return (g_str_equal (path, "") || g_str_equal (path, "/"));
} }
gchar *
_secret_util_collection_to_path (const gchar *collection)
{
if (collection == NULL)
collection = SECRET_COLLECTION_DEFAULT;
if (strchr (collection, '/') == NULL)
return g_strdup_printf ("/org/freedesktop/secrets/aliases/%s", collection);
return g_strdup (collection);
}
GVariant * GVariant *
_secret_util_variant_for_properties (GHashTable *properties) _secret_util_variant_for_properties (GHashTable *properties)
{ {