summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-im/pidgin/files/pidgin-gnome-keyring.patch')
-rw-r--r--net-im/pidgin/files/pidgin-gnome-keyring.patch175
1 files changed, 175 insertions, 0 deletions
diff --git a/net-im/pidgin/files/pidgin-gnome-keyring.patch b/net-im/pidgin/files/pidgin-gnome-keyring.patch
new file mode 100644
index 0000000..8fe92ef
--- /dev/null
+++ b/net-im/pidgin/files/pidgin-gnome-keyring.patch
@@ -0,0 +1,175 @@
+Index: pidgin-2.6.3/configure.ac
+===================================================================
+--- pidgin-2.6.3.orig/configure.ac
++++ pidgin-2.6.3/configure.ac
+@@ -1799,6 +1799,20 @@ if test "x$enable_nss" != "xno"; then
+ [AC_HELP_STRING([--with-nss-libs=PREFIX], [specify location of Mozilla nss3 libs.])],
+ [with_nss_libs="$withval"])
+
++dnl #######################################################################
++dnl # Check for gnome-keyring
++dnl #--enable-gnome-keyring=(yes|no)
++dnl #######################################################################
++AC_ARG_ENABLE(gnome-keyring,
++ AC_HELP_STRING([--enable-gnome-keyring],
++ [use gnome keyring for storing password [default=no]]),,
++ enable_gnome_keyring=no)
++if test "x$enable_gnome_keyring" = "xyes"; then
++ PKG_CHECK_MODULES(PURPLE_KEYRING,
++ gnome-keyring-1,
++ AC_DEFINE(PURPLE_ENABLE_KEYRING, [], [Set if we should use gnome-keyring]))
++fi
++
+
+ if test -n "$with_nspr_includes" || test -n "$with_nspr_libs" || \
+ test -n "$with_nss_includes" || test -n "$with_nss_libs" ||
+Index: pidgin-2.6.3/libpurple/Makefile.am
+===================================================================
+--- pidgin-2.6.3.orig/libpurple/Makefile.am
++++ pidgin-2.6.3/libpurple/Makefile.am
+@@ -291,6 +291,7 @@ libpurple_la_LIBADD = \
+ $(GLIB_LIBS) \
+ $(LIBXML_LIBS) \
+ $(NETWORKMANAGER_LIBS) \
++ $(PURPLE_KEYRING_LIBS) \
+ $(INTLLIBS) \
+ $(FARSIGHT_LIBS) \
+ $(GSTREAMER_LIBS) \
+@@ -306,6 +307,7 @@ AM_CPPFLAGS = \
+ $(GLIB_CFLAGS) \
+ $(DEBUG_CFLAGS) \
+ $(DBUS_CFLAGS) \
++ $(PURPLE_KEYRING_CFLAGS) \
+ $(LIBXML_CFLAGS) \
+ $(FARSIGHT_CFLAGS) \
+ $(GSTREAMER_CFLAGS) \
+Index: pidgin-2.6.3/libpurple/account.c
+===================================================================
+--- pidgin-2.6.3.orig/libpurple/account.c
++++ pidgin-2.6.3/libpurple/account.c
+@@ -49,6 +49,13 @@ typedef struct
+ #define PURPLE_ACCOUNT_GET_PRIVATE(account) \
+ ((PurpleAccountPrivate *) (account->priv))
+
++#ifdef PURPLE_ENABLE_KEYRING
++#include <gnome-keyring.h>
++
++static char * purple_account_get_password_from_keyring (const char *_prpl, const char *_user);
++static gboolean purple_account_set_password_in_keyring (const char *_prpl, const char *_user, const char *password);
++#endif
++
+ /* TODO: Should use PurpleValue instead of this? What about "ui"? */
+ typedef struct
+ {
+@@ -378,8 +385,13 @@ account_to_xmlnode(PurpleAccount *accoun
+ if (purple_account_get_remember_password(account) &&
+ ((tmp = purple_account_get_password(account)) != NULL))
+ {
++#ifdef PURPLE_ENABLE_KEYRING
++ purple_account_set_password_in_keyring( purple_account_get_protocol_id(account),
++ purple_account_get_username(account), tmp);
++#else
+ child = xmlnode_new_child(node, "password");
+ xmlnode_insert_data(child, tmp, -1);
++#endif
+ }
+
+ if ((tmp = purple_account_get_alias(account)) != NULL)
+@@ -828,17 +840,30 @@ parse_account(xmlnode *node)
+ }
+
+ ret = purple_account_new(name, _purple_oscar_convert(name, protocol_id)); /* XXX: */
+- g_free(name);
+- g_free(protocol_id);
+-
+- /* Read the password */
+- child = xmlnode_get_child(node, "password");
+- if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
++ gboolean got_pwd = FALSE;
++#ifdef PURPLE_ENABLE_KEYRING
++ data = purple_account_get_password_from_keyring(protocol_id, name);
++ if (data)
+ {
++ got_pwd = TRUE;
+ purple_account_set_remember_password(ret, TRUE);
+ purple_account_set_password(ret, data);
+ g_free(data);
+ }
++#endif
++ if (!got_pwd)
++ {
++ /* Read the password */
++ child = xmlnode_get_child(node, "password");
++ if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
++ {
++ purple_account_set_remember_password(ret, TRUE);
++ purple_account_set_password(ret, data);
++ g_free(data);
++ }
++ }
++ g_free(name);
++ g_free(protocol_id);
+
+ /* Read the alias */
+ child = xmlnode_get_child(node, "alias");
+@@ -2873,3 +2898,60 @@ purple_accounts_uninit(void)
+ purple_signals_disconnect_by_handle(handle);
+ purple_signals_unregister_by_instance(handle);
+ }
++
++#ifdef PURPLE_ENABLE_KEYRING
++static char *
++purple_account_get_password_from_keyring(const char *_prpl, const char *_user)
++{
++ GnomeKeyringNetworkPasswordData *found_item;
++ GnomeKeyringResult result;
++ GList *matches;
++ char *password;
++
++ matches = NULL;
++
++ result = gnome_keyring_find_network_password_sync (
++ _user, /* user */
++ NULL, /* domain */
++ "gaim.local", /* server */
++ NULL, /* object */
++ _prpl, /* protocol */
++ NULL, /* authtype */
++ 1863, /* port */
++ &matches);
++
++ if (result != GNOME_KEYRING_RESULT_OK)
++ return NULL;
++
++ g_assert (matches != NULL && matches->data != NULL);
++
++ found_item = (GnomeKeyringNetworkPasswordData *) matches->data;
++
++ password = g_strdup (found_item->password);
++
++ gnome_keyring_network_password_list_free (matches);
++
++ return password;
++}
++
++static gboolean
++purple_account_set_password_in_keyring (const char *_prpl, const char *_user, const char *_password)
++{
++ GnomeKeyringResult result;
++ guint32 item_id;
++
++ result = gnome_keyring_set_network_password_sync (
++ NULL, /* default keyring */
++ _user, /* user */
++ NULL, /* domain */
++ "gaim.local", /* server */
++ NULL, /* object */
++ _prpl, /* protocol */
++ NULL, /* authtype */
++ 1863, /* port */
++ _password, /* password */
++ &item_id);
++
++ return result == GNOME_KEYRING_RESULT_OK;
++}
++#endif