1 /* libsecret - GLib wrapper for Secret Service
3 * Copyright 2012 Red Hat Inc.
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published
7 * by the Free Software Foundation; either version 2.1 of the licence or (at
8 * your option) any later version.
10 * See the included COPYING file for more information.
12 * Author: Stef Walter <stefw@gnome.org>
17 #include "secret-collection.h"
18 #include "secret-dbus-generated.h"
19 #include "secret-enum-types.h"
20 #include "secret-item.h"
21 #include "secret-paths.h"
22 #include "secret-private.h"
23 #include "secret-service.h"
24 #include "secret-types.h"
25 #include "secret-value.h"
27 #include <glib/gi18n-lib.h>
32 * @short_description: A secret item
34 * #SecretItem represents a secret item stored in the Secret Service.
36 * Each item has a value, represented by a #SecretValue, which can be
37 * retrieved by secret_item_get_secret() or set by secret_item_set_secret().
38 * The item is only available when the item is not locked.
40 * Items can be locked or unlocked using the secret_service_lock() or
41 * secret_service_unlock() functions. The Secret Service may not be able to
42 * unlock individual items, and may unlock an entire collection when a single
45 * Each item has a set of attributes, which are used to locate the item later.
46 * These are not stored or transferred in a secure manner. Each attribute has
47 * a string name and a string value. Use secret_service_search() to search for
48 * items based on their attributes, and secret_item_set_attributes() to change
49 * the attributes associated with an item.
51 * Items can be created with secret_item_create() or secret_service_store().
53 * These functions have an unstable API and may change across versions. Use
54 * <literal>libsecret-unstable</literal> package to access them.
62 * A proxy object representing a secret item in the Secret Service.
67 * @parent_class: the parent class
69 * The class for #SecretItem.
74 * @SECRET_ITEM_NONE: no flags
75 * @SECRET_ITEM_LOAD_SECRET: a secret has been (or should be) loaded for #SecretItem
77 * Flags which determine which parts of the #SecretItem proxy are initialized.
81 * SecretItemCreateFlags:
82 * @SECRET_ITEM_CREATE_NONE: no flags
83 * @SECRET_ITEM_CREATE_REPLACE: replace an item with the same attributes.
85 * Flags for secret_item_create().
99 struct _SecretItemPrivate {
100 /* No changes between construct and finalize */
101 SecretService *service;
102 SecretItemFlags init_flags;
103 GCancellable *cancellable;
105 /* Locked by mutex */
110 static GInitableIface *secret_item_initable_parent_iface = NULL;
112 static GAsyncInitableIface *secret_item_async_initable_parent_iface = NULL;
114 static void secret_item_initable_iface (GInitableIface *iface);
116 static void secret_item_async_initable_iface (GAsyncInitableIface *iface);
118 G_DEFINE_TYPE_WITH_CODE (SecretItem, secret_item, G_TYPE_DBUS_PROXY,
119 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, secret_item_initable_iface);
120 G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, secret_item_async_initable_iface);
124 secret_item_init (SecretItem *self)
126 self->pv = G_TYPE_INSTANCE_GET_PRIVATE (self, SECRET_TYPE_ITEM, SecretItemPrivate);
127 self->pv->cancellable = g_cancellable_new ();
128 g_mutex_init (&self->pv->mutex);
132 on_set_attributes (GObject *source,
133 GAsyncResult *result,
136 SecretItem *self = SECRET_ITEM (user_data);
137 GError *error = NULL;
139 secret_item_set_attributes_finish (self, result, &error);
141 g_warning ("couldn't set SecretItem Attributes: %s", error->message);
142 g_error_free (error);
145 g_object_unref (self);
149 on_set_label (GObject *source,
150 GAsyncResult *result,
153 SecretItem *self = SECRET_ITEM (user_data);
154 GError *error = NULL;
156 secret_item_set_label_finish (self, result, &error);
158 g_warning ("couldn't set SecretItem Label: %s", error->message);
159 g_error_free (error);
162 g_object_unref (self);
167 item_take_service (SecretItem *self,
168 SecretService *service)
173 g_return_if_fail (self->pv->service == NULL);
175 self->pv->service = service;
176 g_object_add_weak_pointer (G_OBJECT (self->pv->service),
177 (gpointer *)&self->pv->service);
179 /* Yes, we expect that the service will stay around */
180 g_object_unref (service);
184 secret_item_set_property (GObject *obj,
189 SecretItem *self = SECRET_ITEM (obj);
193 item_take_service (self, g_value_dup_object (value));
196 self->pv->init_flags = g_value_get_flags (value);
198 case PROP_ATTRIBUTES:
199 secret_item_set_attributes (self, NULL, g_value_get_boxed (value),
200 self->pv->cancellable, on_set_attributes,
201 g_object_ref (self));
204 secret_item_set_label (self, g_value_get_string (value),
205 self->pv->cancellable, on_set_label,
206 g_object_ref (self));
209 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
215 secret_item_get_property (GObject *obj,
220 SecretItem *self = SECRET_ITEM (obj);
224 g_value_set_object (value, self->pv->service);
227 g_value_set_flags (value, secret_item_get_flags (self));
229 case PROP_ATTRIBUTES:
230 g_value_take_boxed (value, secret_item_get_attributes (self));
233 g_value_take_string (value, secret_item_get_label (self));
236 g_value_set_boolean (value, secret_item_get_locked (self));
239 g_value_set_uint64 (value, secret_item_get_created (self));
242 g_value_set_uint64 (value, secret_item_get_modified (self));
245 G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
251 secret_item_dispose (GObject *obj)
253 SecretItem *self = SECRET_ITEM (obj);
255 g_cancellable_cancel (self->pv->cancellable);
257 G_OBJECT_CLASS (secret_item_parent_class)->dispose (obj);
261 secret_item_finalize (GObject *obj)
263 SecretItem *self = SECRET_ITEM (obj);
265 if (self->pv->service)
266 g_object_remove_weak_pointer (G_OBJECT (self->pv->service),
267 (gpointer *)&self->pv->service);
269 g_object_unref (self->pv->cancellable);
270 g_mutex_clear (&self->pv->mutex);
272 G_OBJECT_CLASS (secret_item_parent_class)->finalize (obj);
276 handle_property_changed (GObject *object,
277 const gchar *property_name)
279 if (g_str_equal (property_name, "Attributes"))
280 g_object_notify (object, "attributes");
282 else if (g_str_equal (property_name, "Label"))
283 g_object_notify (object, "label");
285 else if (g_str_equal (property_name, "Locked"))
286 g_object_notify (object, "locked");
288 else if (g_str_equal (property_name, "Created"))
289 g_object_notify (object, "created");
291 else if (g_str_equal (property_name, "Modified"))
292 g_object_notify (object, "modified");
296 secret_item_properties_changed (GDBusProxy *proxy,
297 GVariant *changed_properties,
298 const gchar* const *invalidated_properties)
300 GObject *obj = G_OBJECT (proxy);
301 gchar *property_name;
305 g_object_freeze_notify (obj);
307 g_variant_iter_init (&iter, changed_properties);
308 while (g_variant_iter_loop (&iter, "{sv}", &property_name, &value))
309 handle_property_changed (obj, property_name);
311 g_object_thaw_notify (obj);
315 secret_item_class_init (SecretItemClass *klass)
317 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
318 GDBusProxyClass *proxy_class = G_DBUS_PROXY_CLASS (klass);
320 gobject_class->get_property = secret_item_get_property;
321 gobject_class->set_property = secret_item_set_property;
322 gobject_class->dispose = secret_item_dispose;
323 gobject_class->finalize = secret_item_finalize;
325 proxy_class->g_properties_changed = secret_item_properties_changed;
328 * SecretItem:service:
330 * The #SecretService object that this item is associated with and
331 * uses to interact with the actual D-Bus Secret Service.
333 g_object_class_install_property (gobject_class, PROP_SERVICE,
334 g_param_spec_object ("service", "Service", "Secret Service",
335 SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
340 * A set of flags describing which parts of the secret item have
343 g_object_class_install_property (gobject_class, PROP_FLAGS,
344 g_param_spec_flags ("flags", "Flags", "Item flags",
345 secret_item_flags_get_type (), SECRET_ITEM_NONE,
346 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
349 * SecretItem:attributes:
351 * The attributes set on this item. Attributes are used to locate an
352 * item. They are not guaranteed to be stored or transferred securely.
354 * Type: GLib.HashTable(utf8,utf8)
357 g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
358 g_param_spec_boxed ("attributes", "Attributes", "Item attributes",
359 G_TYPE_HASH_TABLE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
364 * The human readable label for the item.
366 * Setting this property will result in the label of the item being
367 * set asynchronously. To properly track the changing of the label use the
368 * secret_item_set_label() function.
370 g_object_class_install_property (gobject_class, PROP_LABEL,
371 g_param_spec_string ("label", "Label", "Item label",
372 NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
377 * Whether the item is locked or not. An item may not be independently
378 * lockable separate from other items in its collection.
380 * To lock or unlock a item use the secret_service_lock() or
381 * secret_service_unlock() functions.
383 g_object_class_install_property (gobject_class, PROP_LOCKED,
384 g_param_spec_boolean ("locked", "Locked", "Item locked",
385 TRUE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
388 * SecretItem:created:
390 * The date and time (in seconds since the UNIX epoch) that this
393 g_object_class_install_property (gobject_class, PROP_CREATED,
394 g_param_spec_uint64 ("created", "Created", "Item creation date",
395 0UL, G_MAXUINT64, 0UL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
398 * SecretItem:modified:
400 * The date and time (in seconds since the UNIX epoch) that this
401 * item was last modified.
403 g_object_class_install_property (gobject_class, PROP_MODIFIED,
404 g_param_spec_uint64 ("modified", "Modified", "Item modified date",
405 0UL, G_MAXUINT64, 0UL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
407 g_type_class_add_private (gobject_class, sizeof (SecretItemPrivate));
411 GCancellable *cancellable;
415 init_closure_free (gpointer data)
417 InitClosure *closure = data;
418 g_clear_object (&closure->cancellable);
419 g_slice_free (InitClosure, closure);
423 item_ensure_for_flags_sync (SecretItem *self,
424 SecretItemFlags flags,
425 GCancellable *cancellable,
428 if (flags & SECRET_ITEM_LOAD_SECRET && !secret_item_get_locked (self)) {
429 if (!secret_item_load_secret_sync (self, cancellable, error))
438 on_init_load_secret (GObject *source,
439 GAsyncResult *result,
442 GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
443 SecretItem *self = SECRET_ITEM (source);
444 GError *error = NULL;
446 if (!secret_item_load_secret_finish (self, result, &error))
447 g_simple_async_result_take_error (async, error);
449 g_simple_async_result_complete (async);
450 g_object_unref (async);
454 item_ensure_for_flags_async (SecretItem *self,
455 SecretItemFlags flags,
456 GSimpleAsyncResult *async)
458 InitClosure *init = g_simple_async_result_get_op_res_gpointer (async);
460 if (flags & SECRET_ITEM_LOAD_SECRET && !secret_item_get_locked (self))
461 secret_item_load_secret (self, init->cancellable,
462 on_init_load_secret, g_object_ref (async));
465 g_simple_async_result_complete (async);
469 secret_item_initable_init (GInitable *initable,
470 GCancellable *cancellable,
474 SecretService *service;
477 if (!secret_item_initable_parent_iface->init (initable, cancellable, error))
480 proxy = G_DBUS_PROXY (initable);
482 if (!_secret_util_have_cached_properties (proxy)) {
483 g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD,
484 "No such secret item at path: %s",
485 g_dbus_proxy_get_object_path (proxy));
489 self = SECRET_ITEM (initable);
490 if (!self->pv->service) {
491 service = secret_service_get_sync (SECRET_SERVICE_NONE, cancellable, error);
495 item_take_service (self, service);
498 return item_ensure_for_flags_sync (self, self->pv->init_flags, cancellable, error);
502 secret_item_initable_iface (GInitableIface *iface)
504 secret_item_initable_parent_iface = g_type_interface_peek_parent (iface);
506 iface->init = secret_item_initable_init;
510 on_init_service (GObject *source,
511 GAsyncResult *result,
514 GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
515 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
516 SecretService *service;
517 GError *error = NULL;
519 service = secret_service_get_finish (result, &error);
521 item_take_service (self, service);
522 item_ensure_for_flags_async (self, self->pv->init_flags, async);
525 g_simple_async_result_take_error (async, error);
526 g_simple_async_result_complete (async);
529 g_object_unref (self);
530 g_object_unref (async);
534 on_init_base (GObject *source,
535 GAsyncResult *result,
538 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
539 InitClosure *init = g_simple_async_result_get_op_res_gpointer (res);
540 SecretItem *self = SECRET_ITEM (source);
541 GDBusProxy *proxy = G_DBUS_PROXY (self);
542 GError *error = NULL;
544 if (!secret_item_async_initable_parent_iface->init_finish (G_ASYNC_INITABLE (self),
546 g_simple_async_result_take_error (res, error);
547 g_simple_async_result_complete (res);
549 } else if (!_secret_util_have_cached_properties (proxy)) {
550 g_simple_async_result_set_error (res, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD,
551 "No such secret item at path: %s",
552 g_dbus_proxy_get_object_path (proxy));
553 g_simple_async_result_complete (res);
555 } else if (self->pv->service == NULL) {
556 secret_service_get (SECRET_SERVICE_NONE, init->cancellable,
557 on_init_service, g_object_ref (res));
560 item_ensure_for_flags_async (self, self->pv->init_flags, res);
563 g_object_unref (res);
567 secret_item_async_initable_init_async (GAsyncInitable *initable,
569 GCancellable *cancellable,
570 GAsyncReadyCallback callback,
573 GSimpleAsyncResult *res;
576 res = g_simple_async_result_new (G_OBJECT (initable), callback, user_data,
577 secret_item_async_initable_init_async);
578 init = g_slice_new0 (InitClosure);
579 init->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
580 g_simple_async_result_set_op_res_gpointer (res, init, init_closure_free);
582 secret_item_async_initable_parent_iface->init_async (initable, io_priority,
587 g_object_unref (res);
591 secret_item_async_initable_init_finish (GAsyncInitable *initable,
592 GAsyncResult *result,
595 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (initable),
596 secret_item_async_initable_init_async), FALSE);
598 if (_secret_util_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
605 secret_item_async_initable_iface (GAsyncInitableIface *iface)
607 secret_item_async_initable_parent_iface = g_type_interface_peek_parent (iface);
609 iface->init_async = secret_item_async_initable_init_async;
610 iface->init_finish = secret_item_async_initable_init_finish;
614 * secret_item_refresh:
615 * @self: the collection
617 * Refresh the properties on this item. This fires off a request to
618 * refresh, and the properties will be updated later.
620 * Calling this method is not normally necessary, as the secret service
621 * will notify the client when properties change.
624 secret_item_refresh (SecretItem *self)
626 g_return_if_fail (SECRET_IS_ITEM (self));
628 _secret_util_get_properties (G_DBUS_PROXY (self),
634 _secret_item_set_cached_secret (SecretItem *self,
637 SecretValue *other = NULL;
638 gboolean updated = FALSE;
640 g_return_if_fail (SECRET_IS_ITEM (self));
643 secret_value_ref (value);
645 g_mutex_lock (&self->pv->mutex);
647 if (value != self->pv->value) {
648 other = self->pv->value;
649 self->pv->value = value;
655 g_mutex_unlock (&self->pv->mutex);
658 secret_value_unref (other);
661 g_object_notify (G_OBJECT (self), "flags");
665 GCancellable *cancellable;
671 create_closure_free (gpointer data)
673 CreateClosure *closure = data;
674 g_clear_object (&closure->cancellable);
675 g_clear_object (&closure->item);
676 secret_value_unref (closure->value);
677 g_slice_free (CreateClosure, closure);
681 on_create_item (GObject *source,
682 GAsyncResult *result,
685 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
686 CreateClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
687 GError *error = NULL;
689 closure->item = secret_item_new_for_dbus_path_finish (result, &error);
691 g_simple_async_result_take_error (res, error);
693 /* As a convenince mark down the SecretValue on the item */
694 _secret_item_set_cached_secret (closure->item, closure->value);
696 g_simple_async_result_complete (res);
697 g_object_unref (res);
701 on_create_path (GObject *source,
702 GAsyncResult *result,
705 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
706 CreateClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
707 SecretService *service = SECRET_SERVICE (source);
708 GError *error = NULL;
711 path = secret_service_create_item_dbus_path_finish (service, result, &error);
713 secret_item_new_for_dbus_path (service, path, SECRET_ITEM_NONE,
714 closure->cancellable, on_create_item,
717 g_simple_async_result_take_error (res, error);
718 g_simple_async_result_complete (res);
721 g_object_unref (res);
725 item_properties_new (const gchar *label,
726 const SecretSchema *schema,
727 GHashTable *attributes)
729 const gchar *schema_name = NULL;
730 GHashTable *properties;
734 schema_name = schema->name;
736 properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
737 (GDestroyNotify)g_variant_unref);
739 value = g_variant_new_string (label);
740 g_hash_table_insert (properties,
741 SECRET_ITEM_INTERFACE ".Label",
742 g_variant_ref_sink (value));
744 value = _secret_attributes_to_variant (attributes, schema_name);
745 g_hash_table_insert (properties,
746 SECRET_ITEM_INTERFACE ".Attributes",
747 g_variant_ref_sink (value));
753 * secret_item_create:
754 * @collection: a secret collection to create this item in
755 * @schema: (allow-none): the schema for the attributes
756 * @attributes: (element-type utf8 utf8): attributes for the new item
757 * @label: label for the new item
758 * @value: secret value for the new item
759 * @flags: flags for the creation of the new item
760 * @cancellable: optional cancellation object
761 * @callback: called when the operation completes
762 * @user_data: data to pass to the callback
764 * Create a new item in the secret service.
766 * If the @flags contains %SECRET_ITEM_CREATE_REPLACE, then the secret
767 * service will search for an item matching the @attributes, and update that item
768 * instead of creating a new one.
770 * This method may block indefinitely and should not be used in user interface
771 * threads. The secret service may prompt the user. secret_service_prompt()
772 * will be used to handle any prompts that are required.
775 secret_item_create (SecretCollection *collection,
776 const SecretSchema *schema,
777 GHashTable *attributes,
780 SecretItemCreateFlags flags,
781 GCancellable *cancellable,
782 GAsyncReadyCallback callback,
785 SecretService *service = NULL;
786 const gchar *collection_path;
787 GSimpleAsyncResult *res;
788 CreateClosure *closure;
789 GHashTable *properties;
791 g_return_if_fail (SECRET_IS_COLLECTION (collection));
792 g_return_if_fail (label != NULL);
793 g_return_if_fail (attributes != NULL);
794 g_return_if_fail (value != NULL);
795 g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
797 /* Warnings raised already */
798 if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
801 res = g_simple_async_result_new (NULL, callback, user_data,
803 closure = g_slice_new0 (CreateClosure);
804 closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
805 closure->value = secret_value_ref (value);
806 g_simple_async_result_set_op_res_gpointer (res, closure, create_closure_free);
808 properties = item_properties_new (label, schema, attributes);
809 g_object_get (collection, "service", &service, NULL);
811 collection_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (collection));
813 secret_service_create_item_dbus_path (service, collection_path, properties,
814 value, flags, cancellable,
815 on_create_path, g_object_ref (res));
817 g_hash_table_unref (properties);
818 g_object_unref (service);
819 g_object_unref (res);
823 * secret_item_create_finish:
824 * @result: the asynchronous result passed to the callback
825 * @error: location to place an error on failure
827 * Finish operation to create a new item in the secret service.
829 * Returns: (transfer full): the new item, which should be unreferenced
830 * with g_object_unref()
833 secret_item_create_finish (GAsyncResult *result,
836 GSimpleAsyncResult *res;
837 CreateClosure *closure;
839 g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL,
840 secret_item_create), NULL);
841 g_return_val_if_fail (error == NULL || *error == NULL, NULL);
843 res = G_SIMPLE_ASYNC_RESULT (result);
845 if (_secret_util_propagate_error (res, error))
848 closure = g_simple_async_result_get_op_res_gpointer (res);
849 if (closure->item == NULL)
852 return g_object_ref (closure->item);
856 * secret_item_create_sync:
857 * @collection: a secret collection to create this item in
858 * @schema: (allow-none): the schema for the attributes
859 * @attributes: (element-type utf8 utf8): attributes for the new item
860 * @label: label for the new item
861 * @value: secret value for the new item
862 * @flags: flags for the creation of the new item
863 * @cancellable: optional cancellation object
864 * @error: location to place an error on failure
866 * Create a new item in the secret service.
868 * If the @flags contains %SECRET_ITEM_CREATE_REPLACE, then the secret
869 * service will search for an item matching the @attributes, and update that item
870 * instead of creating a new one.
872 * This method may block indefinitely and should not be used in user interface
873 * threads. The secret service may prompt the user. secret_service_prompt()
874 * will be used to handle any prompts that are required.
876 * Returns: (transfer full): the new item, which should be unreferenced
877 * with g_object_unref()
880 secret_item_create_sync (SecretCollection *collection,
881 const SecretSchema *schema,
882 GHashTable *attributes,
885 SecretItemCreateFlags flags,
886 GCancellable *cancellable,
889 SecretService *service = NULL;
890 const gchar *collection_path;
891 SecretItem *item = NULL;
892 GHashTable *properties;
895 g_return_val_if_fail (SECRET_IS_COLLECTION (collection), NULL);
896 g_return_val_if_fail (label != NULL, NULL);
897 g_return_val_if_fail (attributes != NULL, NULL);
898 g_return_val_if_fail (value != NULL, NULL);
899 g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
900 g_return_val_if_fail (error == NULL || *error == NULL, NULL);
902 /* Warnings raised already */
903 if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
906 properties = item_properties_new (label, schema, attributes);
907 g_object_get (collection, "service", &service, NULL);
909 collection_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (collection));
911 path = secret_service_create_item_dbus_path_sync (service, collection_path, properties,
912 value, flags, cancellable, error);
915 item = secret_item_new_for_dbus_path_sync (service, path, SECRET_ITEM_NONE,
920 g_hash_table_unref (properties);
921 g_object_unref (service);
927 on_item_deleted (GObject *source,
928 GAsyncResult *result,
931 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
932 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
933 GError *error = NULL;
935 if (_secret_service_delete_path_finish (SECRET_SERVICE (source), result, &error))
936 g_simple_async_result_set_op_res_gboolean (res, TRUE);
939 g_simple_async_result_take_error (res, error);
941 g_simple_async_result_complete (res);
942 g_object_unref (self);
943 g_object_unref (res);
947 * secret_item_delete:
949 * @cancellable: optional cancellation object
950 * @callback: called when the operation completes
951 * @user_data: data to pass to the callback
955 * This method returns immediately and completes asynchronously. The secret
956 * service may prompt the user. secret_service_prompt() will be used to handle
957 * any prompts that show up.
960 secret_item_delete (SecretItem *self,
961 GCancellable *cancellable,
962 GAsyncReadyCallback callback,
965 GSimpleAsyncResult *res;
966 const gchar *object_path;
968 g_return_if_fail (SECRET_IS_ITEM (self));
969 g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
971 object_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (self));
972 res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
975 _secret_service_delete_path (self->pv->service, object_path, TRUE,
976 cancellable, on_item_deleted, g_object_ref (res));
978 g_object_unref (res);
982 * secret_item_delete_finish:
984 * @result: asynchronous result passed to the callback
985 * @error: location to place an error on failure
987 * Complete asynchronous operation to delete the secret item.
989 * Returns: whether the item was successfully deleted or not
992 secret_item_delete_finish (SecretItem *self,
993 GAsyncResult *result,
996 GSimpleAsyncResult *res;
998 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
999 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1000 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
1001 secret_item_delete), FALSE);
1003 res = G_SIMPLE_ASYNC_RESULT (result);
1005 if (_secret_util_propagate_error (res, error))
1008 return g_simple_async_result_get_op_res_gboolean (res);
1012 * secret_item_delete_sync:
1014 * @cancellable: optional cancellation object
1015 * @error: location to place an error on failure
1017 * Delete this secret item.
1019 * This method may block indefinitely and should not be used in user
1020 * interface threads. The secret service may prompt the user.
1021 * secret_service_prompt() will be used to handle any prompts that show up.
1023 * Returns: whether the item was successfully deleted or not
1026 secret_item_delete_sync (SecretItem *self,
1027 GCancellable *cancellable,
1033 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1034 g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
1035 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1037 sync = _secret_sync_new ();
1038 g_main_context_push_thread_default (sync->context);
1040 secret_item_delete (self, cancellable, _secret_sync_on_result, sync);
1042 g_main_loop_run (sync->loop);
1044 ret = secret_item_delete_finish (self, sync->result, error);
1046 g_main_context_pop_thread_default (sync->context);
1047 _secret_sync_free (sync);
1053 * secret_item_get_flags:
1054 * @self: the secret item proxy
1056 * Get the flags representing what features of the #SecretItem proxy
1057 * have been initialized.
1059 * Use secret_item_load_secret() to initialize further features
1060 * and change the flags.
1062 * Returns: the flags for features initialized
1065 secret_item_get_flags (SecretItem *self)
1067 SecretServiceFlags flags = 0;
1069 g_return_val_if_fail (SECRET_IS_ITEM (self), SECRET_ITEM_NONE);
1071 g_mutex_lock (&self->pv->mutex);
1073 if (self->pv->value)
1074 flags |= SECRET_ITEM_LOAD_SECRET;
1076 g_mutex_unlock (&self->pv->mutex);
1083 * secret_item_get_service:
1086 * Get the Secret Service object that this item was created with.
1088 * Returns: (transfer none): the Secret Service object
1091 secret_item_get_service (SecretItem *self)
1093 g_return_val_if_fail (SECRET_IS_ITEM (self), NULL);
1094 return self->pv->service;
1099 * secret_item_get_secret:
1102 * Get the secret value of this item. If this item is locked or the secret
1103 * has not yet been loaded then this will return %NULL.
1105 * To load the secret call the secret_item_load_secret() method.
1107 * Returns: (transfer full) (allow-none): the secret value which should be
1108 * released with secret_value_unref(), or %NULL
1111 secret_item_get_secret (SecretItem *self)
1113 SecretValue *value = NULL;
1115 g_return_val_if_fail (SECRET_IS_ITEM (self), NULL);
1117 g_mutex_lock (&self->pv->mutex);
1119 if (self->pv->value)
1120 value = secret_value_ref (self->pv->value);
1122 g_mutex_unlock (&self->pv->mutex);
1129 GCancellable *cancellable;
1133 load_closure_free (gpointer data)
1135 LoadClosure *closure = data;
1136 g_clear_object (&closure->cancellable);
1137 g_slice_free (LoadClosure, closure);
1141 on_item_load_secret (GObject *source,
1142 GAsyncResult *result,
1145 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
1146 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
1147 SecretSession *session;
1148 GError *error = NULL;
1153 retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
1154 if (error == NULL) {
1155 child = g_variant_get_child_value (retval, 0);
1156 g_variant_unref (retval);
1158 session = _secret_service_get_session (self->pv->service);
1159 value = _secret_session_decode_secret (session, child);
1160 g_variant_unref (child);
1162 if (value == NULL) {
1163 g_set_error (&error, SECRET_ERROR, SECRET_ERROR_PROTOCOL,
1164 _("Received invalid secret from the secret storage"));
1166 _secret_item_set_cached_secret (self, value);
1167 secret_value_unref (value);
1171 if (error != NULL) {
1172 g_simple_async_result_take_error (res, error);
1175 g_simple_async_result_complete (res);
1176 g_object_unref (res);
1180 on_load_ensure_session (GObject *source,
1181 GAsyncResult *result,
1184 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
1185 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
1186 LoadClosure *load = g_simple_async_result_get_op_res_gpointer (res);
1187 const gchar *session_path;
1188 GError *error = NULL;
1190 secret_service_ensure_session_finish (self->pv->service, result, &error);
1191 if (error != NULL) {
1192 g_simple_async_result_take_error (res, error);
1193 g_simple_async_result_complete (res);
1196 session_path = secret_service_get_session_dbus_path (self->pv->service);
1197 g_assert (session_path != NULL && session_path[0] != '\0');
1198 g_dbus_proxy_call (G_DBUS_PROXY (self), "GetSecret",
1199 g_variant_new ("(o)", session_path),
1200 G_DBUS_CALL_FLAGS_NONE, -1, load->cancellable,
1201 on_item_load_secret, g_object_ref (res));
1204 g_object_unref (self);
1205 g_object_unref (res);
1209 * secret_item_load_secret:
1210 * @self: an item proxy
1211 * @cancellable: optional cancellation object
1212 * @callback: called when the operation completes
1213 * @user_data: data to pass to the callback
1215 * Load the secret value of this item.
1217 * Each item has a single secret which might be a password or some
1218 * other secret binary value.
1220 * This function will fail if the secret item is locked.
1222 * This function returns immediately and completes asynchronously.
1225 secret_item_load_secret (SecretItem *self,
1226 GCancellable *cancellable,
1227 GAsyncReadyCallback callback,
1230 GSimpleAsyncResult *res;
1231 LoadClosure *closure;
1233 g_return_if_fail (SECRET_IS_ITEM (self));
1234 g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
1236 res = g_simple_async_result_new (G_OBJECT (self), callback,
1237 user_data, secret_item_load_secret);
1238 closure = g_slice_new0 (LoadClosure);
1239 closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
1240 g_simple_async_result_set_op_res_gpointer (res, closure, load_closure_free);
1242 secret_service_ensure_session (self->pv->service, cancellable,
1243 on_load_ensure_session,
1244 g_object_ref (res));
1246 g_object_unref (res);
1250 * secret_item_load_secret_finish:
1251 * @self: an item proxy
1252 * @result: asynchronous result passed to callback
1253 * @error: location to place error on failure
1255 * Complete asynchronous operation to load the secret value of this item.
1257 * The newly loaded secret value can be accessed by calling
1258 * secret_item_get_secret().
1260 * Returns: whether the secret item succesfully loaded or not
1263 secret_item_load_secret_finish (SecretItem *self,
1264 GAsyncResult *result,
1267 GSimpleAsyncResult *res;
1269 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
1270 secret_item_load_secret), FALSE);
1272 res = G_SIMPLE_ASYNC_RESULT (result);
1273 if (_secret_util_propagate_error (res, error))
1280 * secret_item_load_secret_sync:
1282 * @cancellable: optional cancellation object
1283 * @error: location to place error on failure
1285 * Load the secret value of this item.
1287 * Each item has a single secret which might be a password or some
1288 * other secret binary value.
1290 * This function may block indefinetely. Use the asynchronous version
1291 * in user interface threads.
1293 * Returns: whether the secret item succesfully loaded or not
1296 secret_item_load_secret_sync (SecretItem *self,
1297 GCancellable *cancellable,
1303 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1304 g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
1305 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1307 sync = _secret_sync_new ();
1308 g_main_context_push_thread_default (sync->context);
1310 secret_item_load_secret (self, cancellable, _secret_sync_on_result, sync);
1312 g_main_loop_run (sync->loop);
1314 result = secret_item_load_secret_finish (self, sync->result, error);
1316 g_main_context_pop_thread_default (sync->context);
1317 _secret_sync_free (sync);
1323 SecretService *service;
1324 GCancellable *cancellable;
1330 loads_closure_free (gpointer data)
1332 LoadsClosure *loads = data;
1334 g_variant_unref (loads->in);
1336 g_object_unref (loads->service);
1337 g_clear_object (&loads->cancellable);
1338 g_slice_free (LoadsClosure, loads);
1342 on_get_secrets_complete (GObject *source,
1343 GAsyncResult *result,
1346 GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
1347 LoadsClosure *loads = g_simple_async_result_get_op_res_gpointer (async);
1348 GHashTable *with_paths;
1349 GError *error = NULL;
1350 GHashTableIter iter;
1356 retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
1357 if (retval != NULL) {
1358 with_paths = _secret_service_decode_get_secrets_all (loads->service, retval);
1359 g_return_if_fail (with_paths != NULL);
1361 g_hash_table_iter_init (&iter, with_paths);
1362 while (g_hash_table_iter_next (&iter, (gpointer *)&path, (gpointer *)&value)) {
1363 item = g_hash_table_lookup (loads->items, path);
1365 _secret_item_set_cached_secret (item, value);
1368 g_hash_table_unref (with_paths);
1369 g_variant_unref (retval);
1373 g_simple_async_result_take_error (async, error);
1375 g_simple_async_result_complete (async);
1376 g_object_unref (async);
1380 on_loads_secrets_session (GObject *source,
1381 GAsyncResult *result,
1384 GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
1385 LoadsClosure *loads = g_simple_async_result_get_op_res_gpointer (async);
1386 GError *error = NULL;
1387 const gchar *session;
1389 secret_service_ensure_session_finish (SECRET_SERVICE (source), result, &error);
1390 if (error != NULL) {
1391 g_simple_async_result_take_error (async, error);
1392 g_simple_async_result_complete (async);
1395 session = secret_service_get_session_dbus_path (SECRET_SERVICE (source));
1396 g_dbus_proxy_call (G_DBUS_PROXY (source), "GetSecrets",
1397 g_variant_new ("(@aoo)", loads->in, session),
1398 G_DBUS_CALL_FLAGS_NO_AUTO_START, -1,
1399 loads->cancellable, on_get_secrets_complete,
1400 g_object_ref (async));
1403 g_object_unref (async);
1407 * secret_item_load_secrets:
1408 * @items: (element-type SecretUnstable.Item): the items to retrieve secrets for
1409 * @cancellable: optional cancellation object
1410 * @callback: called when the operation completes
1411 * @user_data: data to pass to the callback
1413 * Load the secret values for an secret items stored in the service.
1415 * The @items must all have the same SecretItem::service property.
1417 * This function returns immediately and completes asynchronously.
1420 secret_item_load_secrets (GList *items,
1421 GCancellable *cancellable,
1422 GAsyncReadyCallback callback,
1425 GSimpleAsyncResult *async;
1426 LoadsClosure *loads;
1431 g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
1433 for (l = items; l != NULL; l = g_list_next (l))
1434 g_return_if_fail (SECRET_IS_ITEM (l->data));
1436 async = g_simple_async_result_new (NULL, callback, user_data,
1437 secret_item_load_secrets);
1438 loads = g_slice_new0 (LoadsClosure);
1439 loads->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
1440 loads->items = g_hash_table_new_full (g_str_hash, g_str_equal,
1441 g_free, g_object_unref);
1443 paths = g_ptr_array_new ();
1444 for (l = items; l != NULL; l = g_list_next (l)) {
1445 if (secret_item_get_locked (l->data))
1448 if (loads->service == NULL) {
1449 loads->service = secret_item_get_service (l->data);
1451 g_object_ref (loads->service);
1454 path = g_dbus_proxy_get_object_path (l->data);
1455 g_hash_table_insert (loads->items, g_strdup (path), g_object_ref (l->data));
1456 g_ptr_array_add (paths, (gpointer)path);
1459 loads->in = g_variant_new_objv ((const gchar * const *)paths->pdata, paths->len);
1460 g_variant_ref_sink (loads->in);
1462 g_ptr_array_free (paths, TRUE);
1463 g_simple_async_result_set_op_res_gpointer (async, loads, loads_closure_free);
1465 if (loads->service) {
1466 secret_service_ensure_session (loads->service, cancellable,
1467 on_loads_secrets_session,
1468 g_object_ref (async));
1470 g_simple_async_result_complete_in_idle (async);
1473 g_object_unref (async);
1477 * secret_item_load_secrets_finish:
1478 * @result: asynchronous result passed to callback
1479 * @error: location to place an error on failure
1481 * Complete asynchronous operation to load the secret values for
1482 * secret items stored in the service.
1484 * Items that are locked will not have their secrets loaded.
1486 * Returns: whether the operation succeded or not
1489 secret_item_load_secrets_finish (GAsyncResult *result,
1492 GSimpleAsyncResult *async;
1494 g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL,
1495 secret_item_load_secrets), FALSE);
1496 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1498 async = G_SIMPLE_ASYNC_RESULT (result);
1499 if (_secret_util_propagate_error (async, error))
1506 * secret_item_load_secrets_sync:
1507 * @items: (element-type SecretUnstable.Item): the items to retrieve secrets for
1508 * @cancellable: optional cancellation object
1509 * @error: location to place an error on failure
1511 * Load the secret values for an secret items stored in the service.
1513 * The @items must all have the same SecretItem::service property.
1515 * This method may block indefinitely and should not be used in user interface
1518 * Items that are locked will not have their secrets loaded.
1520 * Returns: whether the operation succeded or not
1523 secret_item_load_secrets_sync (GList *items,
1524 GCancellable *cancellable,
1531 for (l = items; l != NULL; l = g_list_next (l))
1532 g_return_val_if_fail (SECRET_IS_ITEM (l->data), FALSE);
1534 g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
1535 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1537 sync = _secret_sync_new ();
1538 g_main_context_push_thread_default (sync->context);
1540 secret_item_load_secrets (items, cancellable,
1541 _secret_sync_on_result, sync);
1543 g_main_loop_run (sync->loop);
1545 ret = secret_item_load_secrets_finish (sync->result, error);
1547 g_main_context_pop_thread_default (sync->context);
1548 _secret_sync_free (sync);
1554 GCancellable *cancellable;
1559 set_closure_free (gpointer data)
1561 SetClosure *set = data;
1562 g_clear_object (&set->cancellable);
1563 secret_value_unref (set->value);
1564 g_slice_free (SetClosure, set);
1568 on_item_set_secret (GObject *source,
1569 GAsyncResult *result,
1572 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
1573 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
1574 SetClosure *set = g_simple_async_result_get_op_res_gpointer (res);
1575 GError *error = NULL;
1578 retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
1580 if (error == NULL) {
1581 _secret_item_set_cached_secret (self, set->value);
1583 g_simple_async_result_take_error (res, error);
1586 g_variant_unref (retval);
1588 g_simple_async_result_complete (res);
1589 g_object_unref (self);
1590 g_object_unref (res);
1594 on_set_ensure_session (GObject *source,
1595 GAsyncResult *result,
1598 GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
1599 SecretItem *self = SECRET_ITEM (g_async_result_get_source_object (user_data));
1600 SetClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
1601 SecretSession *session;
1603 GError *error = NULL;
1605 secret_service_ensure_session_finish (self->pv->service, result, &error);
1606 if (error != NULL) {
1607 g_simple_async_result_take_error (res, error);
1608 g_simple_async_result_complete (res);
1611 session = _secret_service_get_session (self->pv->service);
1612 encoded = _secret_session_encode_secret (session, closure->value);
1613 g_dbus_proxy_call (G_DBUS_PROXY (self), "SetSecret",
1614 g_variant_new ("(@(oayays))", encoded),
1615 G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, closure->cancellable,
1616 on_item_set_secret, g_object_ref (res));
1619 g_object_unref (self);
1620 g_object_unref (res);
1624 * secret_item_set_secret:
1626 * @value: a new secret value
1627 * @cancellable: optional cancellation object
1628 * @callback: called when the operation completes
1629 * @user_data: data to pass to the callback
1631 * Set the secret value of this item.
1633 * Each item has a single secret which might be a password or some
1634 * other secret binary value.
1636 * This function returns immediately and completes asynchronously.
1639 secret_item_set_secret (SecretItem *self,
1641 GCancellable *cancellable,
1642 GAsyncReadyCallback callback,
1645 GSimpleAsyncResult *res;
1646 SetClosure *closure;
1648 g_return_if_fail (SECRET_IS_ITEM (self));
1649 g_return_if_fail (value != NULL);
1650 g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
1652 res = g_simple_async_result_new (G_OBJECT (self), callback,
1653 user_data, secret_item_set_secret);
1654 closure = g_slice_new0 (SetClosure);
1655 closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
1656 closure->value = secret_value_ref (value);
1657 g_simple_async_result_set_op_res_gpointer (res, closure, set_closure_free);
1659 secret_service_ensure_session (self->pv->service, cancellable,
1660 on_set_ensure_session,
1661 g_object_ref (res));
1663 g_object_unref (res);
1667 * secret_item_set_secret_finish:
1669 * @result: asynchronous result passed to callback
1670 * @error: location to place error on failure
1672 * Complete asynchronous operation to set the secret value of this item.
1674 * Returns: whether the change was successful or not
1677 secret_item_set_secret_finish (SecretItem *self,
1678 GAsyncResult *result,
1681 GSimpleAsyncResult *res;
1683 g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
1684 secret_item_set_secret), FALSE);
1686 res = G_SIMPLE_ASYNC_RESULT (result);
1687 if (_secret_util_propagate_error (res, error))
1694 * secret_item_set_secret_sync:
1696 * @value: a new secret value
1697 * @cancellable: optional cancellation object
1698 * @error: location to place error on failure
1700 * Set the secret value of this item.
1702 * Each item has a single secret which might be a password or some
1703 * other secret binary value.
1705 * This function may block indefinetely. Use the asynchronous version
1706 * in user interface threads.
1708 * Returns: whether the change was successful or not
1711 secret_item_set_secret_sync (SecretItem *self,
1713 GCancellable *cancellable,
1719 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1720 g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
1721 g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
1723 sync = _secret_sync_new ();
1724 g_main_context_push_thread_default (sync->context);
1726 secret_item_set_secret (self, value, cancellable, _secret_sync_on_result, sync);
1728 g_main_loop_run (sync->loop);
1730 ret = secret_item_set_secret_finish (self, sync->result, error);
1732 g_main_context_pop_thread_default (sync->context);
1733 _secret_sync_free (sync);
1739 * secret_item_get_schema_name:
1742 * Gets the name of the schema that this item was stored with. This is also
1743 * available at the <literal>xdg:schema</literal> attribute.
1745 * Returns: (transfer full): the schema name
1748 secret_item_get_schema_name (SecretItem *self)
1753 g_return_val_if_fail (SECRET_IS_ITEM (self), NULL);
1755 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Attributes");
1756 g_return_val_if_fail (variant != NULL, NULL);
1758 g_variant_lookup (variant, "xdg:schema", "s", &schema_name);
1759 g_variant_unref (variant);
1765 * secret_item_get_attributes:
1768 * Set the attributes of this item.
1770 * The @attributes are a mapping of string keys to string values.
1771 * Attributes are used to search for items. Attributes are not stored
1772 * or transferred securely by the secret service.
1774 * Do not modify the attributes returned by this method. Use
1775 * secret_item_set_attributes() instead.
1777 * Returns: (transfer full) (element-type utf8 utf8): a new reference
1778 * to the attributes, which should not be modified, and
1779 * released with g_hash_table_unref()
1782 secret_item_get_attributes (SecretItem *self)
1784 GHashTable *attributes;
1787 g_return_val_if_fail (SECRET_IS_ITEM (self), NULL);
1789 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Attributes");
1790 g_return_val_if_fail (variant != NULL, NULL);
1792 attributes = _secret_attributes_for_variant (variant);
1793 g_variant_unref (variant);
1799 * secret_item_set_attributes:
1801 * @schema: (allow-none): the schema for the attributes
1802 * @attributes: (element-type utf8 utf8): a new set of attributes
1803 * @cancellable: optional cancellation object
1804 * @callback: called when the asynchronous operation completes
1805 * @user_data: data to pass to the callback
1807 * Set the attributes of this item.
1809 * The @attributes are a mapping of string keys to string values.
1810 * Attributes are used to search for items. Attributes are not stored
1811 * or transferred securely by the secret service.
1813 * This function returns immediately and completes asynchronously.
1816 secret_item_set_attributes (SecretItem *self,
1817 const SecretSchema *schema,
1818 GHashTable *attributes,
1819 GCancellable *cancellable,
1820 GAsyncReadyCallback callback,
1823 const gchar *schema_name = NULL;
1825 g_return_if_fail (SECRET_IS_ITEM (self));
1826 g_return_if_fail (attributes != NULL);
1828 if (schema != NULL) {
1829 if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
1830 return; /* Warnings raised already */
1831 schema_name = schema->name;
1834 _secret_util_set_property (G_DBUS_PROXY (self), "Attributes",
1835 _secret_attributes_to_variant (attributes, schema_name),
1836 secret_item_set_attributes, cancellable,
1837 callback, user_data);
1841 * secret_item_set_attributes_finish:
1843 * @result: asynchronous result passed to the callback
1844 * @error: location to place error on failure
1846 * Complete operation to set the attributes of this item.
1848 * Returns: whether the change was successful or not
1851 secret_item_set_attributes_finish (SecretItem *self,
1852 GAsyncResult *result,
1855 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1857 return _secret_util_set_property_finish (G_DBUS_PROXY (self),
1858 secret_item_set_attributes,
1863 * secret_item_set_attributes_sync:
1865 * @schema: (allow-none): the schema for the attributes
1866 * @attributes: (element-type utf8 utf8): a new set of attributes
1867 * @cancellable: optional cancellation object
1868 * @error: location to place error on failure
1870 * Set the attributes of this item.
1872 * The @attributes are a mapping of string keys to string values.
1873 * Attributes are used to search for items. Attributes are not stored
1874 * or transferred securely by the secret service.
1876 * This function may block indefinetely. Use the asynchronous version
1877 * in user interface threads.
1879 * Returns: whether the change was successful or not
1882 secret_item_set_attributes_sync (SecretItem *self,
1883 const SecretSchema *schema,
1884 GHashTable *attributes,
1885 GCancellable *cancellable,
1888 const gchar *schema_name = NULL;
1890 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1891 g_return_val_if_fail (attributes != NULL, FALSE);
1893 if (schema != NULL) {
1894 if (!_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
1895 return FALSE; /* Warnings raised already */
1896 schema_name = schema->name;
1899 return _secret_util_set_property_sync (G_DBUS_PROXY (self), "Attributes",
1900 _secret_attributes_to_variant (attributes, schema_name),
1901 cancellable, error);
1905 * secret_item_get_label:
1908 * Get the label of this item.
1910 * Returns: (transfer full): the label, which should be freed with g_free()
1913 secret_item_get_label (SecretItem *self)
1918 g_return_val_if_fail (SECRET_IS_ITEM (self), NULL);
1920 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Label");
1921 g_return_val_if_fail (variant != NULL, NULL);
1923 label = g_variant_dup_string (variant, NULL);
1924 g_variant_unref (variant);
1930 * secret_item_set_label:
1932 * @label: a new label
1933 * @cancellable: optional cancellation object
1934 * @callback: called when the operation completes
1935 * @user_data: data to pass to the callback
1937 * Set the label of this item.
1939 * This function returns immediately and completes asynchronously.
1942 secret_item_set_label (SecretItem *self,
1944 GCancellable *cancellable,
1945 GAsyncReadyCallback callback,
1948 g_return_if_fail (SECRET_IS_ITEM (self));
1949 g_return_if_fail (label != NULL);
1951 _secret_util_set_property (G_DBUS_PROXY (self), "Label",
1952 g_variant_new_string (label),
1953 secret_item_set_label,
1954 cancellable, callback, user_data);
1958 * secret_item_set_label_finish:
1960 * @result: asynchronous result passed to callback
1961 * @error: location to place error on failure
1963 * Complete asynchronous operation to set the label of this collection.
1965 * Returns: whether the change was successful or not
1968 secret_item_set_label_finish (SecretItem *self,
1969 GAsyncResult *result,
1972 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
1974 return _secret_util_set_property_finish (G_DBUS_PROXY (self),
1975 secret_item_set_label,
1980 * secret_item_set_label_sync:
1982 * @label: a new label
1983 * @cancellable: optional cancellation object
1984 * @error: location to place error on failure
1986 * Set the label of this item.
1988 * This function may block indefinetely. Use the asynchronous version
1989 * in user interface threads.
1991 * Returns: whether the change was successful or not
1994 secret_item_set_label_sync (SecretItem *self,
1996 GCancellable *cancellable,
1999 g_return_val_if_fail (SECRET_IS_ITEM (self), FALSE);
2000 g_return_val_if_fail (label != NULL, FALSE);
2002 return _secret_util_set_property_sync (G_DBUS_PROXY (self), "Label",
2003 g_variant_new_string (label),
2004 cancellable, error);
2008 * secret_item_get_locked:
2011 * Get whether the item is locked or not.
2013 * Depending on the secret service an item may not be able to be locked
2014 * independently from the collection that it is in.
2016 * Returns: whether the item is locked or not
2019 secret_item_get_locked (SecretItem *self)
2024 g_return_val_if_fail (SECRET_IS_ITEM (self), TRUE);
2026 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Locked");
2027 g_return_val_if_fail (variant != NULL, TRUE);
2029 locked = g_variant_get_boolean (variant);
2030 g_variant_unref (variant);
2036 * secret_item_get_created:
2039 * Get the created date and time of the item. The return value is
2040 * the number of seconds since the unix epoch, January 1st 1970.
2042 * Returns: the created date and time
2045 secret_item_get_created (SecretItem *self)
2050 g_return_val_if_fail (SECRET_IS_ITEM (self), TRUE);
2052 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Created");
2053 g_return_val_if_fail (variant != NULL, 0);
2055 created = g_variant_get_uint64 (variant);
2056 g_variant_unref (variant);
2062 * secret_item_get_modified:
2065 * Get the modified date and time of the item. The return value is
2066 * the number of seconds since the unix epoch, January 1st 1970.
2068 * Returns: the modified date and time
2071 secret_item_get_modified (SecretItem *self)
2076 g_return_val_if_fail (SECRET_IS_ITEM (self), TRUE);
2078 variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Modified");
2079 g_return_val_if_fail (variant != NULL, 0);
2081 modified = g_variant_get_uint64 (variant);
2082 g_variant_unref (variant);