File pidgin-gnome-keyring.patch of Package pidgin.openSUSE_Leap_42.2_Update

diff -Naur pidgin-2.10.10.orig/configure.ac pidgin-2.10.10/configure.ac
--- pidgin-2.10.10.orig/configure.ac
+++ pidgin-2.10.10/configure.ac
@@ -2124,6 +2124,20 @@
 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(PURPLE_ENABLE_KEYRING, [], [Set if we should use gnome-keyring]))
+fi
+
+dnl #######################################################################
 dnl # Check for Tcl
 dnl #######################################################################
 AC_ARG_ENABLE(tcl, [AC_HELP_STRING([--disable-tcl],
diff -Naur pidgin-2.10.10.orig/libpurple/account.c pidgin-2.10.10/libpurple/account.c
--- pidgin-2.10.10.orig/libpurple/account.c
+++ pidgin-2.10.10/libpurple/account.c
@@ -54,6 +54,13 @@
 #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
 {
@@ -393,8 +400,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
 	} else if (_purple_account_is_password_encrypted(account)) {
 		const char *keyring = NULL;
 		const char *mode = NULL;
@@ -909,37 +921,51 @@
 	}
 
 	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) {
-		const char *keyring_id = xmlnode_get_attrib(child, "keyring_id");
-		const char *mode = xmlnode_get_attrib(child, "mode");
-		gboolean is_plaintext;
-
-		data = xmlnode_get_data(child);
-
-		if (keyring_id == NULL || keyring_id[0] == '\0')
-			is_plaintext = TRUE;
-		else if (g_strcmp0(keyring_id, "keyring-internal") != 0)
-			is_plaintext = FALSE;
-		else if (mode == NULL || mode[0] == '\0' || g_strcmp0(mode, "cleartext") == 0)
-			is_plaintext = TRUE;
-		else
-			is_plaintext = FALSE;
-
-		if (is_plaintext) {
-			purple_account_set_remember_password(ret, TRUE);
-			purple_account_set_password(ret, data);
-		} else {
-			purple_debug_warning("account", "found encrypted password, "
-				"but it's not supported in 2.x.y\n");
-			_purple_account_set_encrypted_password(ret, keyring_id, mode, data);
-		}
+        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)
+        {
+		child = xmlnode_get_child(node, "password");
+		if (child != NULL) {
+			const char *keyring_id = xmlnode_get_attrib(child, "keyring_id");
+			const char *mode = xmlnode_get_attrib(child, "mode");
+			gboolean is_plaintext;
+
+			data = xmlnode_get_data(child);
+
+			if (keyring_id == NULL || keyring_id[0] == '\0')
+				is_plaintext = TRUE;
+			else if (g_strcmp0(keyring_id, "keyring-internal") != 0)
+				is_plaintext = FALSE;
+			else if (mode == NULL || mode[0] == '\0' || g_strcmp0(mode, "cleartext") == 0)
+				is_plaintext = TRUE;
+			else
+				is_plaintext = FALSE;
+
+			if (is_plaintext) {
+				purple_account_set_remember_password(ret, TRUE);
+				purple_account_set_password(ret, data);
+			} else {
+				purple_debug_warning("account", "found encrypted password, "
+					"but it's not supported in 2.x.y\n");
+				_purple_account_set_encrypted_password(ret, keyring_id, mode, data);
+			}
+			g_free(data);
+		}
+	}
+	g_free(name);
+	g_free(protocol_id);
 
 	/* Read the alias */
 	child = xmlnode_get_child(node, "alias");
@@ -3305,6 +3331,63 @@
 	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
+
 /* libpurple 3.0.0 compatibility */
 
 static void
diff -Naur pidgin-2.10.10.orig/libpurple/Makefile.am pidgin-2.10.10/libpurple/Makefile.am
--- pidgin-2.10.10.orig/libpurple/Makefile.am
+++ pidgin-2.10.10/libpurple/Makefile.am
@@ -305,6 +305,7 @@
 	$(GLIB_LIBS) \
 	$(LIBXML_LIBS) \
 	$(NETWORKMANAGER_LIBS) \
+	$(PURPLE_KEYRING_LIBS) \
 	$(INTLLIBS) \
 	$(FARSTREAM_LIBS) \
 	$(GSTREAMER_LIBS) \
@@ -326,7 +327,8 @@
 	$(GSTREAMER_CFLAGS) \
 	$(GSTINTERFACES_CFLAGS) \
 	$(IDN_CFLAGS) \
-	$(NETWORKMANAGER_CFLAGS)
+	$(NETWORKMANAGER_CFLAGS) \
+	$(PURPLE_KEYRING_CFLAGS)
 
 # INSTALL_SSL_CERTIFICATES is true when SSL_CERTIFICATES_DIR is empty.
 # We want to use SSL_CERTIFICATES_DIR when it's not empty.
openSUSE Build Service is sponsored by