diff --git a/libgnome-keyring-2.29.5-acl-assertion.patch b/libgnome-keyring-2.29.5-acl-assertion.patch new file mode 100644 index 0000000..5fa08c6 --- /dev/null +++ b/libgnome-keyring-2.29.5-acl-assertion.patch @@ -0,0 +1,37 @@ +From 604de15586fea8adaa06a0a6a2090002a068ec98 Mon Sep 17 00:00:00 2001 +From: Stef Walter +Date: Sun, 03 Jan 2010 01:03:05 +0000 +Subject: Fix assertion calling deprecated acl function. + +--- +diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c +index 2cf8a40..be49a6f 100644 +--- a/library/gnome-keyring.c ++++ b/library/gnome-keyring.c +@@ -3381,6 +3381,13 @@ gnome_keyring_item_set_attributes_sync (const char *keyring, + return gkr_operation_block (op); + } + ++static void ++item_get_acl_reply (GnomeKeyringResult res, gpointer user_data) ++{ ++ GkrCallback *cb = user_data; ++ gkr_callback_invoke_ok_list (cb, NULL); ++} ++ + /** + * gnome_keyring_item_get_acl: + * @keyring: The name of the keyring in which the item exists, or NULL for the default keyring. +@@ -3401,7 +3408,9 @@ gnome_keyring_item_get_acl (const char *keyring, + GDestroyNotify destroy_data) + { + GkrOperation *op; +- op = gkr_operation_new (callback, GKR_CALLBACK_RES_LIST, data, destroy_data); ++ GkrCallback *cb; ++ cb = gkr_callback_new (NULL, callback, GKR_CALLBACK_RES_LIST, data, destroy_data); ++ op = gkr_operation_new (item_get_acl_reply, GKR_CALLBACK_RES, cb, gkr_callback_free); + gkr_operation_complete_later (op, GNOME_KEYRING_RESULT_OK); + gkr_operation_unref (op); + return op; +-- +cgit v0.8.3.1 diff --git a/libgnome-keyring-2.29.5-session-clear.patch b/libgnome-keyring-2.29.5-session-clear.patch new file mode 100644 index 0000000..1f6296e --- /dev/null +++ b/libgnome-keyring-2.29.5-session-clear.patch @@ -0,0 +1,114 @@ +From 48b8a75059b05d6f1b8e7e040e811d8429f514f5 Mon Sep 17 00:00:00 2001 +From: Stef Walter +Date: Sun, 03 Jan 2010 02:09:45 +0000 +Subject: Clear the client's session when the service disconnects. + +--- +diff --git a/library/gkr-operation.c b/library/gkr-operation.c +index 4f36763..ebc93d6 100644 +--- a/library/gkr-operation.c ++++ b/library/gkr-operation.c +@@ -27,6 +27,7 @@ + + #include "gkr-misc.h" + #include "gkr-operation.h" ++#include "gkr-session.h" + #include "gnome-keyring.h" + #include "gnome-keyring-private.h" + +@@ -216,6 +217,33 @@ gkr_operation_complete_later (GkrOperation *op, GnomeKeyringResult res) + gkr_operation_ref (op), gkr_operation_unref); + } + ++static DBusHandlerResult ++on_name_changed_filter (DBusConnection *connection, DBusMessage *message, void *user_data) ++{ ++ const char *object_name; ++ const char *new_owner; ++ const char *old_owner; ++ ++ /* org.freedesktop.DBus.NameOwnerChanged(STRING name, STRING old_owner, STRING new_owner) */ ++ if (dbus_message_is_signal (message, DBUS_INTERFACE_DBUS, "NameOwnerChanged") && ++ dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &object_name, ++ DBUS_TYPE_STRING, &old_owner, DBUS_TYPE_STRING, &new_owner, ++ DBUS_TYPE_INVALID)) { ++ ++ /* See if it's the secret service going away */ ++ if (object_name && g_str_equal (SECRETS_SERVICE, object_name) && ++ new_owner && g_str_equal ("", new_owner)) { ++ ++ /* Clear any session, when the service goes away */ ++ gkr_session_clear (); ++ } ++ ++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; ++ } ++ ++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; ++} ++ + static DBusConnection* + connect_to_service (void) + { +@@ -245,18 +273,21 @@ connect_to_service (void) + rule = "type='signal',interface='org.gnome.secrets.Prompt',member='Completed'"; + dbus_bus_add_match (conn, rule, NULL); + ++ /* Listen for name owner changed signals */ + rule = "type='signal',member='NameOwnerChanged',interface='org.freedesktop.DBus'"; + dbus_bus_add_match (conn, rule, NULL); ++ dbus_connection_add_filter (conn, on_name_changed_filter, NULL, NULL); + + G_LOCK (dbus_connection); + { + if (dbus_connection) { +- dbus_connection_unref (dbus_connection); ++ dbus_connection_unref (conn); + } else { + egg_dbus_connect_with_mainloop (conn, NULL); + dbus_connection = conn; + } + } ++ G_UNLOCK (dbus_connection); + } + + return dbus_connection_ref (dbus_connection); +diff --git a/library/gkr-session.c b/library/gkr-session.c +index ed1480d..f5b4c81 100644 +--- a/library/gkr-session.c ++++ b/library/gkr-session.c +@@ -379,6 +379,19 @@ gkr_session_negotiate (GkrOperation *op) + session_negotiate_aes (op); + } + ++void ++gkr_session_clear (void) ++{ ++ G_LOCK (session_globals); ++ { ++ if (the_session) { ++ gkr_session_unref (the_session); ++ the_session = NULL; ++ } ++ } ++ G_UNLOCK (session_globals); ++} ++ + static gboolean + session_encode_secret (DBusMessageIter *iter, const gchar *path, gconstpointer parameter, + gsize n_parameter, gconstpointer secret, gsize n_secret) +diff --git a/library/gkr-session.h b/library/gkr-session.h +index c6f02b3..e3a0632 100644 +--- a/library/gkr-session.h ++++ b/library/gkr-session.h +@@ -28,6 +28,8 @@ + + void gkr_session_negotiate (GkrOperation *op); + ++void gkr_session_clear (void); ++ + GkrSession* gkr_session_ref (GkrSession *session); + + void gkr_session_unref (gpointer data); +-- +cgit v0.8.3.1 diff --git a/libgnome-keyring-2.29.5-set-info-type-property.patch b/libgnome-keyring-2.29.5-set-info-type-property.patch new file mode 100644 index 0000000..8bdb01f --- /dev/null +++ b/libgnome-keyring-2.29.5-set-info-type-property.patch @@ -0,0 +1,164 @@ +From c04283e31e4084025768f5df23db9ed5a1cf2a48 Mon Sep 17 00:00:00 2001 +From: Stef Walter +Date: Mon, 04 Jan 2010 01:29:38 +0000 +Subject: Implement setting of Type property in gnome_keyring_item_set_info(). + +--- +diff --git a/library/gnome-keyring.c b/library/gnome-keyring.c +index be49a6f..e58ef21 100644 +--- a/library/gnome-keyring.c ++++ b/library/gnome-keyring.c +@@ -2796,10 +2796,8 @@ static gboolean + item_get_info_foreach (const gchar *property, DBusMessageIter *iter, gpointer user_data) + { + GnomeKeyringItemInfo *info = user_data; +- DBusMessageIter array, dict; + const char *sval; + dbus_int64_t i64val; +- int type; + + if (g_str_equal (property, "Label")) { + if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRING) +@@ -2819,41 +2817,25 @@ item_get_info_foreach (const gchar *property, DBusMessageIter *iter, gpointer us + dbus_message_iter_get_basic (iter, &i64val); + info->ctime = (time_t)i64val; + +- } else if (g_str_equal (property, "Attributes")) { +- if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_ARRAY) ++ } else if (g_str_equal (property, "Type")) { ++ if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRING) + return FALSE; +- dbus_message_iter_recurse (iter, &array); +- for (;;) { +- type = dbus_message_iter_get_arg_type (&array); +- if (type == DBUS_TYPE_INVALID) +- break; +- else if (type != DBUS_TYPE_DICT_ENTRY) +- return FALSE; +- dbus_message_iter_recurse (&array, &dict); +- if (dbus_message_iter_get_arg_type (&dict) != DBUS_TYPE_STRING) +- return FALSE; +- dbus_message_iter_get_basic (&dict, &sval); +- if (g_str_equal ("gkr:item-type", sval)) { +- if (!dbus_message_iter_next (&dict) || +- dbus_message_iter_get_arg_type (&dict) != DBUS_TYPE_STRING) +- return FALSE; +- dbus_message_iter_get_basic (&dict, &sval); +- if (g_str_equal (sval, "generic-secret")) +- info->type = GNOME_KEYRING_ITEM_GENERIC_SECRET; +- else if (g_str_equal (sval, "network-password")) +- info->type = GNOME_KEYRING_ITEM_NETWORK_PASSWORD; +- else if (g_str_equal (sval, "note")) +- info->type = GNOME_KEYRING_ITEM_NOTE; +- else if (g_str_equal (sval, "chained-keyring-password")) +- info->type = GNOME_KEYRING_ITEM_CHAINED_KEYRING_PASSWORD; +- else if (g_str_equal (sval, "encryption-key-password")) +- info->type = GNOME_KEYRING_ITEM_ENCRYPTION_KEY_PASSWORD; +- else if (g_str_equal (sval, "pk-storage")) +- info->type = GNOME_KEYRING_ITEM_PK_STORAGE; +- } +- +- dbus_message_iter_next (&array); +- } ++ dbus_message_iter_get_basic (iter, &sval); ++ g_return_val_if_fail (sval, FALSE); ++ if (g_str_equal (sval, "org.freedesktop.Secret.Generic")) ++ info->type = GNOME_KEYRING_ITEM_GENERIC_SECRET; ++ else if (g_str_equal (sval, "org.gnome.keyring.NetworkPassword")) ++ info->type = GNOME_KEYRING_ITEM_NETWORK_PASSWORD; ++ else if (g_str_equal (sval, "org.gnome.keyring.Note")) ++ info->type = GNOME_KEYRING_ITEM_NOTE; ++ else if (g_str_equal (sval, "org.gnome.keyring.ChainedKeyring")) ++ info->type = GNOME_KEYRING_ITEM_CHAINED_KEYRING_PASSWORD; ++ else if (g_str_equal (sval, "org.gnome.keyring.EncryptionKey")) ++ info->type = GNOME_KEYRING_ITEM_ENCRYPTION_KEY_PASSWORD; ++ else if (g_str_equal (sval, "org.gnome.keyring.PkStorage")) ++ info->type = GNOME_KEYRING_ITEM_PK_STORAGE; ++ else ++ info->type = GNOME_KEYRING_ITEM_GENERIC_SECRET; + } + + return TRUE; +@@ -3064,7 +3046,7 @@ item_set_info_free (gpointer data) + } + + static void +-item_set_info_2_reply (GkrOperation *op, GkrSession *session, gpointer user_data) ++item_set_info_3_reply (GkrOperation *op, GkrSession *session, gpointer user_data) + { + item_set_info_args *args = user_data; + DBusMessageIter iter; +@@ -3091,18 +3073,16 @@ item_set_info_2_reply (GkrOperation *op, GkrSession *session, gpointer user_data + } + + static void +-item_set_info_1_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data) ++item_set_info_2_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data) + { + item_set_info_args *args = user_data; + + if (gkr_operation_handle_errors (op, reply)) + return; + +- /* TODO: No way to set item 'type' easily, so we skip for now */ +- + /* Need a session to send a secret */ + if (args->info->secret) { +- gkr_operation_push (op, item_set_info_2_reply, GKR_CALLBACK_OP_SESSION, args, NULL); ++ gkr_operation_push (op, item_set_info_3_reply, GKR_CALLBACK_OP_SESSION, args, NULL); + gkr_session_negotiate (op); + + /* No secret? all done */ +@@ -3111,6 +3091,50 @@ item_set_info_1_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data) + } + } + ++static void ++item_set_info_1_reply (GkrOperation *op, DBusMessage *reply, gpointer user_data) ++{ ++ item_set_info_args *args = user_data; ++ DBusMessageIter iter, variant; ++ DBusMessage *req; ++ const char *string; ++ ++ if (gkr_operation_handle_errors (op, reply)) ++ return; ++ ++ /* Next set the type */ ++ req = dbus_message_new_method_call (SECRETS_SERVICE, args->path, ++ DBUS_INTERFACE_PROPERTIES, "Set"); ++ ++ dbus_message_iter_init_append (req, &iter); ++ string = ITEM_INTERFACE; ++ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &string); ++ string = "Type"; ++ 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"; ++ ++ dbus_message_iter_append_basic (&variant, DBUS_TYPE_STRING, &string); ++ dbus_message_iter_close_container (&iter, &variant); ++ ++ gkr_operation_push (op, item_set_info_2_reply, GKR_CALLBACK_OP_MSG, args, NULL); ++ gkr_operation_request (op, req); ++} ++ + /** + * gnome_keyring_item_set_info: + * @keyring: The name of the keyring in which the item exists, or NULL for the default keyring. +-- +cgit v0.8.3.1 diff --git a/libgnome-keyring.spec b/libgnome-keyring.spec index 9818347..2448268 100644 --- a/libgnome-keyring.spec +++ b/libgnome-keyring.spec @@ -6,7 +6,7 @@ Summary: Framework for managing passwords and other secrets Name: libgnome-keyring Version: 2.29.4 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv2+ and LGPLv2+ Group: System Environment/Libraries Source: http://ftp.gnome.org/pub/GNOME/sources/libgnome-keyring/2.29/libgnome-keyring-%{version}.tar.bz2 @@ -20,6 +20,12 @@ BuildRequires: libgcrypt-devel >= %{gcrypt_version} BuildRequires: intltool Conflicts: gnome-keyring < 2.29.4 + +# from upstream +Patch0: libgnome-keyring-2.29.5-acl-assertion.patch +Patch1: libgnome-keyring-2.29.5-session-clear.patch +Patch2: libgnome-keyring-2.29.5-set-info-type-property.patch + %description gnome-keyring is a program that keep password and other secrets for users. The library libgnome-keyring is used by applications to integrate @@ -42,6 +48,10 @@ header files needed to develop applications that use libgnome-keyring. %prep %setup -q -n libgnome-keyring-%{version} +%patch0 -p1 -b .acl-assertion +%patch1 -p1 -b .session-clear +%patch2 -p1 -b .info-type + %build %configure --disable-gtk-doc @@ -82,5 +92,10 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Mon Jan 25 2010 Tomas Bzatek - 2.29.4-2 +- Fix assertion calling deprecated acl function +- Clear the client's session when the service disconnects +- Implement setting of Type property in gnome_keyring_item_set_info() + * Thu Jan 7 2010 Tomas Bzatek - 2.29.4-1 - Initial packaging