--- 2.0b4-my/configure.ac 2006-11-13 18:29:02.830447000 +0800 +++ 2.0b4-my2/configure.ac 2006-11-13 17:05:20.491984000 +0800 @@ -1783,5 +1783,19 @@ LDFLAGS="$orig_LDFLAGS" fi +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(VINO_ENABLE_KEYRING, [], [Set if we should use gnome-keyring])) +fi + AC_MSG_CHECKING(for me pot o' gold) --- 2.0b4-my/libpurple/Makefile.am 2006-10-19 01:38:16.000000000 +0800 +++ 2.0b4-my2/libpurple/Makefile.am 2006-11-13 18:28:51.383417000 +0800 @@ -221,6 +221,7 @@ $(LIBXML_LIBS) \ $(LIBNM_LIBS) \ $(STATIC_LINK_LIBS) \ + $(PURPLE_KEYRING_LIBS) \ $(INTLLIBS) \ -lm @@ -233,5 +234,6 @@ $(GLIB_CFLAGS) \ $(DEBUG_CFLAGS) \ $(DBUS_CFLAGS) \ + $(PURPLE_KEYRING_CFLAGS) \ $(LIBXML_CFLAGS) \ $(LIBNM_CFLAGS) --- 2.0b4-my/libpurple/account.c 2006-10-19 01:38:16.000000000 +0800 +++ 2.0b4-my2/libpurple/account.c 2006-11-13 18:26:19.409755000 +0800 @@ -40,6 +40,13 @@ #include "util.h" #include "xmlnode.h" +#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 { @@ -321,8 +328,13 @@ 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) @@ -703,17 +715,30 @@ } 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"); @@ -2352,3 +2377,60 @@ gaim_signals_unregister_by_instance(gaim_accounts_get_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