[libgnome-keyring] Properly send the Type property when a new item is created.



commit 231045523eb6f17ee942b359af4c200e65a3fd00
Author: Stef Walter <stefw collabora co uk>
Date:   Thu Sep 15 12:00:40 2011 +0200

    Properly send the Type property when a new item is created.
    
     * Previously items were all being created as generic secret.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=654425

 library/gnome-keyring.c       |   48 ++++++++++++++++++++++++++++------------
 library/tests/test-keyrings.c |   28 +++++++++++++++++++++++
 2 files changed, 61 insertions(+), 15 deletions(-)
---
diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c
index 61d4f8b..4544084 100644
--- a/library/gnome-keyring.c
+++ b/library/gnome-keyring.c
@@ -2567,6 +2567,27 @@ item_create_sync (GnomeKeyringResult res, guint32 item_id, gpointer data)
 	*result = item_id;
 }
 
+static const gchar *
+item_type_to_string (GnomeKeyringItemType item_type)
+{
+	switch (item_type) {
+	case GNOME_KEYRING_ITEM_GENERIC_SECRET:
+		return "org.freedesktop.Secret.Generic";
+	case GNOME_KEYRING_ITEM_NETWORK_PASSWORD:
+		return "org.gnome.keyring.NetworkPassword";
+	case GNOME_KEYRING_ITEM_NOTE:
+		return "org.gnome.keyring.Note";
+	case GNOME_KEYRING_ITEM_CHAINED_KEYRING_PASSWORD:
+		return "org.gnome.keyring.ChainedKeyring";
+	case GNOME_KEYRING_ITEM_ENCRYPTION_KEY_PASSWORD:
+		return "org.gnome.keyring.EncryptionKey";
+	case GNOME_KEYRING_ITEM_PK_STORAGE:
+		return "org.gnome.keyring.PkStorage";
+	default:
+		return "org.freedesktop.Secret.Generic";
+	}
+}
+
 static DBusMessage*
 item_create_prepare (const gchar *path, GnomeKeyringItemType type, const gchar *label,
                      GnomeKeyringAttributeList *attrs, DBusMessageIter *iter)
@@ -2574,6 +2595,7 @@ item_create_prepare (const gchar *path, GnomeKeyringItemType type, const gchar *
 	DBusMessageIter array, variant, dict;
 	DBusMessage *req;
 	const char *string;
+	const gchar *type_string;
 
 	req = dbus_message_new_method_call (gkr_service_name (), path,
 	                                    COLLECTION_INTERFACE, "CreateItem");
@@ -2599,6 +2621,16 @@ item_create_prepare (const gchar *path, GnomeKeyringItemType type, const gchar *
 	dbus_message_iter_close_container (&dict, &variant);
 	dbus_message_iter_close_container (&array, &dict);
 
+	/* Set the item type */
+	string = ITEM_INTERFACE ".Type";
+	type_string = item_type_to_string (type);
+	dbus_message_iter_open_container (&array, DBUS_TYPE_DICT_ENTRY, NULL, &dict);
+	dbus_message_iter_append_basic (&dict, DBUS_TYPE_STRING, &string);
+	dbus_message_iter_open_container (&dict, DBUS_TYPE_VARIANT, "s", &variant);
+	dbus_message_iter_append_basic (&variant, DBUS_TYPE_STRING, &type_string);
+	dbus_message_iter_close_container (&dict, &variant);
+	dbus_message_iter_close_container (&array, &dict);
+
 	dbus_message_iter_close_container (iter, &array);
 	return req;
 }
@@ -3394,21 +3426,7 @@ item_set_info_1_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data)
 	dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &string);
 	dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "s", &variant);
 
-	if (args->info->type == GNOME_KEYRING_ITEM_GENERIC_SECRET)
-		string = "org.freedesktop.Secret.Generic";
-	else if (args->info->type == GNOME_KEYRING_ITEM_NETWORK_PASSWORD)
-		string = "org.gnome.keyring.NetworkPassword";
-	else if (args->info->type == GNOME_KEYRING_ITEM_NOTE)
-		string = "org.gnome.keyring.Note";
-	else if (args->info->type == GNOME_KEYRING_ITEM_CHAINED_KEYRING_PASSWORD)
-		string = "org.gnome.keyring.ChainedKeyring";
-	else if (args->info->type == GNOME_KEYRING_ITEM_ENCRYPTION_KEY_PASSWORD)
-		string = "org.gnome.keyring.EncryptionKey";
-	else if (args->info->type == GNOME_KEYRING_ITEM_PK_STORAGE)
-		string = "org.gnome.keyring.PkStorage";
-	else
-		string = "org.freedesktop.Secret.Generic";
-
+	string = item_type_to_string (args->info->type);
 	dbus_message_iter_append_basic (&variant, DBUS_TYPE_STRING, &string);
 	dbus_message_iter_close_container (&iter, &variant);
 
diff --git a/library/tests/test-keyrings.c b/library/tests/test-keyrings.c
index b7a7981..517ec8e 100644
--- a/library/tests/test-keyrings.c
+++ b/library/tests/test-keyrings.c
@@ -238,6 +238,33 @@ test_create_list_items (void)
 }
 
 static void
+test_create_item_with_type (void)
+{
+	GnomeKeyringResult res;
+	guint id;
+	GList *ids;
+	GnomeKeyringItemInfo *info;
+
+	/* Try in an invalid keyring */
+	res = gnome_keyring_item_create_sync (KEYRING_NAME, GNOME_KEYRING_ITEM_NOTE,
+	                                      DISPLAY_NAME, NULL, SECRET, FALSE, &id);
+	g_assert_cmpint (GNOME_KEYRING_RESULT_OK, ==, res);
+
+	/* List ids that were created */
+	res = gnome_keyring_list_item_ids_sync (KEYRING_NAME, &ids);
+	g_assert_cmpint (GNOME_KEYRING_RESULT_OK, ==, res);
+
+	/* Now make sure both have that same secret */
+	res = gnome_keyring_item_get_info_sync (KEYRING_NAME, id, &info);
+	g_assert_cmpint (GNOME_KEYRING_RESULT_OK, ==, res);
+	g_assert_cmpint (gnome_keyring_item_info_get_type (info), ==, GNOME_KEYRING_ITEM_NOTE);
+
+	/* Now delete the item */
+	res = gnome_keyring_item_delete_sync (NULL, id);
+	g_assert_cmpint (GNOME_KEYRING_RESULT_OK, ==, res);
+}
+
+static void
 test_find_keyrings (void)
 {
 	GnomeKeyringResult res;
@@ -737,6 +764,7 @@ main (int argc, char **argv)
 	g_test_add_func ("/keyrings/delete-keyring", test_delete_keyring);
 	g_test_add_func ("/keyrings/recreate-keyring", test_recreate_keyring);
 	g_test_add_func ("/keyrings/create-list-items", test_create_list_items);
+	g_test_add_func ("/keyrings/create-item-with-type", test_create_item_with_type);
 	g_test_add_func ("/keyrings/find-keyrings", test_find_keyrings);
 	g_test_add_func ("/keyrings/find-invalid", test_find_invalid);
 	g_test_add_func ("/keyrings/lock-keyrings", test_lock_keyrings);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]