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 + +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