static gboolean generate_hashed_items (GkmSecretCollection *collection, EggBuffer *buffer) { GHashTable *attributes; const gchar *value; GList *items, *l; guint32 id, type; items = gkm_secret_collection_get_items (collection); egg_buffer_add_uint32 (buffer, g_list_length (items)); for (l = items; l; l = g_list_next (l)) { value = gkm_secret_object_get_identifier (l->data); if (!convert_to_integer (value, &id)) { g_warning ("trying to save a non-numeric item identifier '%s' into " "the keyring file format which only supports numeric.", value); continue; } egg_buffer_add_uint32 (buffer, id); value = gkm_secret_item_get_schema (l->data); type = gkm_secret_compat_parse_item_type (value); egg_buffer_add_uint32 (buffer, type); attributes = gkm_secret_item_get_fields (l->data); buffer_add_attributes (buffer, attributes, TRUE); } g_list_free (items); return !egg_buffer_has_error (buffer); }
static gboolean generate_encrypted_data (EggBuffer *buffer, GkmSecretCollection *collection, GkmSecretData *data) { GkmSecretObject *obj; GkmSecretItem *item; GList *items, *l; GHashTable *attributes; const gchar *label; GkmSecret *secret; GList *acl; int i; g_assert (buffer); g_assert (GKM_IS_SECRET_COLLECTION (collection)); g_assert (GKM_IS_SECRET_DATA (data)); /* Make sure we're using non-pageable memory */ egg_buffer_set_allocator (buffer, egg_secure_realloc); items = gkm_secret_collection_get_items (collection); for (l = items; l && !egg_buffer_has_error(buffer); l = g_list_next (l)) { item = GKM_SECRET_ITEM (l->data); obj = GKM_SECRET_OBJECT (l->data); label = gkm_secret_object_get_label (obj); buffer_add_utf8_string (buffer, label); secret = gkm_secret_data_get_secret (data, gkm_secret_object_get_identifier (obj)); buffer_add_secret (buffer, secret); if (!buffer_add_time (buffer, gkm_secret_object_get_created (obj)) || !buffer_add_time (buffer, gkm_secret_object_get_modified (obj))) break; /* reserved: */ if (!buffer_add_utf8_string (buffer, NULL)) break; for (i = 0; i < 4; i++) egg_buffer_add_uint32 (buffer, 0); attributes = gkm_secret_item_get_fields (item); if (!buffer_add_attributes (buffer, attributes, FALSE)) break; acl = g_object_get_data (G_OBJECT (item), "compat-acl"); if (!generate_acl_data (buffer, acl)) break; } g_list_free (items); /* Iteration completed prematurely == fail */ return (l == NULL); }
static void gkm_secret_item_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) { GkmSecretItem *self = GKM_SECRET_ITEM (obj); switch (prop_id) { case PROP_COLLECTION: g_value_set_object (value, gkm_secret_item_get_collection (self)); break; case PROP_FIELDS: g_value_set_boxed (value, gkm_secret_item_get_fields (self)); break; case PROP_SCHEMA: g_value_set_string (value, gkm_secret_item_get_schema (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } }