summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-voip/telepathy-haze')
-rw-r--r--net-voip/telepathy-haze/ChangeLog10
-rw-r--r--net-voip/telepathy-haze/Manifest13
-rw-r--r--net-voip/telepathy-haze/files/001-handle_purple_account_request_password.patch269
-rw-r--r--net-voip/telepathy-haze/files/002-fix_resource_leakage.patch141
-rw-r--r--net-voip/telepathy-haze/files/003-fix_more_resource_leaks.patch213
-rw-r--r--net-voip/telepathy-haze/telepathy-haze-0.7.0.ebuild38
6 files changed, 679 insertions, 5 deletions
diff --git a/net-voip/telepathy-haze/ChangeLog b/net-voip/telepathy-haze/ChangeLog
index e6c8764713aa..45150588e8e3 100644
--- a/net-voip/telepathy-haze/ChangeLog
+++ b/net-voip/telepathy-haze/ChangeLog
@@ -1,6 +1,14 @@
# ChangeLog for net-voip/telepathy-haze
# Copyright 1999-2013 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/net-voip/telepathy-haze/ChangeLog,v 1.38 2013/03/30 17:10:44 eva Exp $
+# $Header: /var/cvsroot/gentoo-x86/net-voip/telepathy-haze/ChangeLog,v 1.39 2013/04/21 11:39:40 pacho Exp $
+
+*telepathy-haze-0.7.0 (21 Apr 2013)
+
+ 21 Apr 2013; Pacho Ramos <pacho@gentoo.org>
+ +files/001-handle_purple_account_request_password.patch,
+ +files/002-fix_resource_leakage.patch,
+ +files/003-fix_more_resource_leaks.patch, +telepathy-haze-0.7.0.ebuild:
+ Version bump, bug #466256 by Andreas Mielke
30 Mar 2013; Gilles Dartiguelongue <eva@gentoo.org>
-telepathy-haze-0.5.0.ebuild:
diff --git a/net-voip/telepathy-haze/Manifest b/net-voip/telepathy-haze/Manifest
index 7a48131f187f..dcb139e1aa74 100644
--- a/net-voip/telepathy-haze/Manifest
+++ b/net-voip/telepathy-haze/Manifest
@@ -1,14 +1,19 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
+AUX 001-handle_purple_account_request_password.patch 8398 SHA256 e35c1525593b3c6cb66f197c39c2b8a332c01b86eb33b5ec34557e48194282ee SHA512 53569c79a0125bd6338003a41312a80ff41d7164d22d2218a83bccbed7b5b9c493cf1647060dce3932241b221dda6894926128a9e8baa633bb975346e5724648 WHIRLPOOL a836f7d37e8c970099fd10699e19c21c5bbc7834ae19538b4a828da64181792d4322c8d47650ca1dcd9160229a0b1c5e67dcd763a49b9fabb226d373c03c6d76
+AUX 002-fix_resource_leakage.patch 4526 SHA256 2597e4bae0e23090de4d7edc7c13495adf266aa8a774be9aa034679682b414ac SHA512 65890c988d860f8ce862a277b93a51fa0f6738f4dc44f466c661503f11c6fd4ea74e9136364ffa1b06538c560671b44c6223b39fec02e7f8cbf680d7b6de5909 WHIRLPOOL 8342d4bb2a155b5327b2aa2138c664ee1ad5426417ffd83a54e0ee2da322ae90c12fad1d49032e924fd866e3dc70aaef62bf360fddb288e0833a1d7a39a834c9
+AUX 003-fix_more_resource_leaks.patch 6663 SHA256 7423812e904da7600f25120ec4a428c917800cf7fa92f0c1aceb158f90c8bb9f SHA512 271533ecf415f4880675f68fa14c9057acefa95339b0e2cd2dfd10f39414a81f9dd1622b56ad8669b91f7f8f59ace3d9ba73499f66e4e937888d9b2a59e6d994 WHIRLPOOL 27a6cbe1adfbcc73eeaf02e0f9940425a34d8100a6deeaae0e642afcd930cc2ebda83a601e550f7ec3f218f0514dbe3061c825ddb392f6da8b65e46fe1f5eba2
DIST telepathy-haze-0.6.0.tar.gz 558413 SHA256 e267c54aef8f85746899e365ae344fe9ec73c1aec04298bedad6a88732ab2fe3 SHA512 db87f7f1be4217ab464d3a3fdb33c6121931c286a102b6af7e3a06ece21b88606c41f3eabc1ad2453e58f5091f6a141dbf2369c7d277b135aebf9b0f37cbe2f0 WHIRLPOOL a8f29ee0aee83cddb386d55bbdbe7df2d77acfc936c1ce0e5786345c3e7a20d3d608e4df99b8e5ebc2fcd5644d7ecfa9641564561f9f538fc325259b0f31a52d
+DIST telepathy-haze-0.7.0.tar.gz 559037 SHA256 0b0143358af2435ec267cf62bd1c475e4d6e1f8e950e87bf7da3d288424152bd SHA512 9749ca9733f20b47da84412d35d7cc28d305fcfc8085450456914a6d7907de7cfb4de5e8f7c8e1b06e412feeed5dbc272c69ce889bedc0ac8598aae96beaf677 WHIRLPOOL e432ea9327ee2aa3b3a6a58b73eb916f9f4b45fee5518ce128dd03d705c82b9f3bc90ffd48e541170a28f688fc15f0675d44ce93f2f9e59b4aa37352e6fbc41b
EBUILD telepathy-haze-0.6.0.ebuild 983 SHA256 7d94ee2fe751c588615f518c3b621dad9a68e77b37043a41c52a68416dc14ffb SHA512 ba7c4b890c029b2c8af0c94c27f138f6d1dd02028f0b3694586c4359f9af440cef8428483f4c72d0f9c4e525ee7e44613c38199ef292a14576d5770106334c23 WHIRLPOOL 3ef77de410fbc465c40469b775bf46e0c8f87018d2a8bcbcaa19d29b82f57e7d46373459bb13616e44ebf5cede296c514162b9c5af30c12c5611084851707248
-MISC ChangeLog 5248 SHA256 2d2fa357c7a8f7e2e2cdbe3037e64711cfae411e28d3e9f167058809beacf8bd SHA512 667b461d99366d7f2af7a685e7b330a86156cdf76b64d556d1739d7399902a771a189d8ddd42b8a8dcfe3cd3e9c554becfc1ca21ace94c8f5c0fd097d6a0e391 WHIRLPOOL 068b2dcabda4a9c3b40151f4b4cc4a48e7e54fc740dbb5476571823f3e1818e304398834439360f40c1b5134083a858130ae8cf44f5cc69767d20cc47b98334c
+EBUILD telepathy-haze-0.7.0.ebuild 1151 SHA256 84152c71d6c2f7593f966bcd08c275438738e0cc3b16a509a0391d4b25e1a4cb SHA512 f124d0066704b913588ac78fa45dcce549954275e59e8587a9bddcb814666d8906f20b9d0a8d8fc7ace40247a1b7fa15f4d0e9291b72dac88f6f0b327047fc57 WHIRLPOOL cbd2bb175ece0d4a051b19818fe3247040819ac459288fba6fbaa584a814069659665a00ade81ae0b0a4f7a8d17f4cb142230c245afadb1a1bd97a0cff11b9c9
+MISC ChangeLog 5554 SHA256 a8eaf02e8c30cb1f436bb9e9f388069d336908eefbb2fdd9ffc522314888f5c8 SHA512 45583d7fbd4df886b2304e8a1dfa77bdb8db8b50f24f49a01df465f5aec3eab5db318c6c028ec4fa01fe2888fbeb07f94c4448e0a8b33138ccb800b7ce9c0498 WHIRLPOOL a37be96bd6ab45f02db4140a1fe1a057ed202b4f2df741ff6163d87da0ec2f81904e4add6b4bc79f497adce9409d09f7aab90288bef8751863680ebab8cc01e0
MISC metadata.xml 322 SHA256 0658eb62f074a6ca6adf1c572753ae025b4c1e9048d3d4c0529f98cf2cb6bfa3 SHA512 b0d4a71235e1d7b0c53baae758153e624c4d324389700bbdb4ea8983f0a7f808727ea9821f88efd9058bb739a7c6e3c07cc24fbc496156fabb300b3e7312bea6 WHIRLPOOL 0ec9fb4d4e13f14f744a25ee5a025dd430b08a2ea85413fa02b616b853e602ffec00c24bafd5c0c65cef876b741956b4f11fe8f1681164a2bff3f95b44dc66b0
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
-iEYEAREIAAYFAlFXHJUACgkQ1fmVwcYIWAZijgCglA6p160avsa4233/y7ybazQ3
-o7MAn18sSQkRTBAn9eYt4mpu95Bk9Hq/
-=SRMY
+iEYEAREIAAYFAlFzz/0ACgkQCaWpQKGI+9T1NACdF54oJ3tIhQKiVr8UgFEAuMFS
+I60AnRMdxRURKhK+aPnCrI+R9cDo+JJ6
+=DiHC
-----END PGP SIGNATURE-----
diff --git a/net-voip/telepathy-haze/files/001-handle_purple_account_request_password.patch b/net-voip/telepathy-haze/files/001-handle_purple_account_request_password.patch
new file mode 100644
index 000000000000..e53b378c0a31
--- /dev/null
+++ b/net-voip/telepathy-haze/files/001-handle_purple_account_request_password.patch
@@ -0,0 +1,269 @@
+From 66b7fff2f65b65a5d298bf868bb8e21a32492a58 Mon Sep 17 00:00:00 2001
+From: Stefan Becker <chemobejk@gmail.com>
+Date: Tue, 09 Apr 2013 16:30:34 +0000
+Subject: request: handle purple_account_request_password()
+
+This is needed for libpurple plugins with optional password, e.g. SIPE
+since 1.14.1. That libpurple API call boils down to a
+purple_request_fields() call.
+
+The flagging for --enable-leaky-request-stubs was refactored so that
+this new code is always compiled in.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=63326
+---
+diff --git a/src/connection.c b/src/connection.c
+index 0b272a9..6e9121d 100644
+--- a/src/connection.c
++++ b/src/connection.c
+@@ -42,6 +42,7 @@
+ #include "connection-avatars.h"
+ #include "connection-mail.h"
+ #include "extensions/extensions.h"
++#include "request.h"
+
+ #include "connection-capabilities.h"
+
+@@ -138,6 +139,9 @@ struct _HazeConnectionPrivate
+ gchar *prpl_id;
+ PurplePluginProtocolInfo *prpl_info;
+
++ /* Set if purple_account_request_password() was called */
++ gpointer password_request;
++
+ /* Set if purple_account_disconnect has been called or is scheduled to be
+ * called, so should not be called again.
+ */
+@@ -446,6 +450,11 @@ _haze_connection_password_manager_prompt_cb (GObject *source,
+ {
+ DEBUG ("Simple password manager failed: %s", error->message);
+
++ if (priv->password_request)
++ {
++ haze_request_password_cb(priv->password_request, NULL);
++ }
++
+ if (base_conn->status != TP_CONNECTION_STATUS_DISCONNECTED)
+ {
+ tp_base_connection_disconnect_with_dbus_error (base_conn,
+@@ -454,7 +463,13 @@ _haze_connection_password_manager_prompt_cb (GObject *source,
+ }
+
+ /* no need to call purple_account_disconnect because _connect
+- * was never called */
++ * was never called ...
++ * ... unless we had a dynamic password request */
++ if (priv->password_request)
++ {
++ priv->disconnecting = TRUE;
++ purple_account_disconnect (self->account);
++ }
+
+ g_error_free (error);
+ return;
+@@ -463,11 +478,17 @@ _haze_connection_password_manager_prompt_cb (GObject *source,
+ g_free (priv->password);
+ priv->password = g_strdup (password->str);
+
+- purple_account_set_password (self->account, priv->password);
++ if (priv->password_request)
++ {
++ haze_request_password_cb (priv->password_request, priv->password);
++ } else
++ {
++ purple_account_set_password (self->account, priv->password);
+
+- purple_account_set_enabled(self->account, UI_ID, TRUE);
+- purple_account_connect (self->account);
+- priv->connect_called = TRUE;
++ purple_account_set_enabled(self->account, UI_ID, TRUE);
++ purple_account_connect (self->account);
++ priv->connect_called = TRUE;
++ }
+ }
+
+ static gboolean
+@@ -516,6 +537,20 @@ _haze_connection_start_connecting (TpBaseConnection *base,
+ return TRUE;
+ }
+
++void haze_connection_request_password (PurpleAccount *account,
++ void *user_data)
++{
++ HazeConnection *self = ACCOUNT_GET_HAZE_CONNECTION (account);
++ HazeConnectionPrivate *priv = self->priv;
++
++ priv->password_request = user_data;
++
++ /* pop up auth channel */
++ tp_simple_password_manager_prompt_async (self->password_manager,
++ _haze_connection_password_manager_prompt_cb,
++ self);
++}
++
+ static void
+ _haze_connection_shut_down (TpBaseConnection *base)
+ {
+diff --git a/src/connection.h b/src/connection.h
+index c69a7c1..2e68935 100644
+--- a/src/connection.h
++++ b/src/connection.h
+@@ -111,6 +111,9 @@ const gchar *haze_get_fallback_group (void);
+ const gchar **haze_connection_get_implemented_interfaces (void);
+ const gchar **haze_connection_get_guaranteed_interfaces (void);
+
++void haze_connection_request_password (PurpleAccount *account,
++ gpointer user_data);
++
+ G_END_DECLS
+
+ #endif /* #ifndef __HAZE_CONNECTION_H__*/
+diff --git a/src/main.c b/src/main.c
+index afa0a02..4cd171c 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -141,9 +141,7 @@ haze_ui_init (void)
+ purple_accounts_set_ui_ops (haze_get_account_ui_ops ());
+ purple_conversations_set_ui_ops (haze_get_conv_ui_ops ());
+ purple_connections_set_ui_ops (haze_get_connection_ui_ops ());
+-#ifdef ENABLE_LEAKY_REQUEST_STUBS
+ purple_request_set_ui_ops (haze_request_get_ui_ops ());
+-#endif
+ purple_notify_set_ui_ops (haze_notify_get_ui_ops ());
+ purple_privacy_set_ui_ops (haze_get_privacy_ui_ops ());
+ }
+diff --git a/src/request.c b/src/request.c
+index 408678b..dae859d 100644
+--- a/src/request.c
++++ b/src/request.c
+@@ -18,6 +18,8 @@
+ *
+ */
+
++#include "config.h"
++
+ #include <glib-object.h>
+
+ #include <libpurple/account.h>
+@@ -25,7 +27,9 @@
+
+ #include "debug.h"
+ #include "request.h"
++#include "connection.h"
+
++#ifdef ENABLE_LEAKY_REQUEST_STUBS
+ static gpointer
+ haze_request_input (const char *title,
+ const char *primary,
+@@ -95,6 +99,30 @@ haze_request_action (const char *title,
+
+ return NULL;
+ }
++#endif
++
++struct password_data {
++ PurpleRequestFields *fields;
++ PurpleRequestField *password;
++ GCallback ok_cb;
++ GCallback cancel_cb;
++ void *user_data;
++};
++
++void haze_request_password_cb (gpointer user_data,
++ const gchar *password)
++{
++ struct password_data *pd = user_data;
++
++ if (password) {
++ purple_request_field_string_set_value(pd->password, password);
++ ((PurpleRequestFieldsCb)pd->ok_cb)(pd->user_data, pd->fields);
++ } else {
++ ((PurpleRequestFieldsCb)pd->cancel_cb)(pd->user_data, pd->fields);
++ }
++
++ g_free(pd);
++}
+
+ static gpointer
+ haze_request_fields (const char *title,
+@@ -110,14 +138,36 @@ haze_request_fields (const char *title,
+ PurpleConversation *conv,
+ void *user_data)
+ {
+- DEBUG ("ignoring request:");
+- DEBUG (" title: %s", (title ? title : "(null)"));
+- DEBUG (" primary: %s", (primary ? primary : "(null)"));
+- DEBUG (" secondary: %s", (secondary ? secondary : "(null)"));
++ /*
++ * We must support purple_account_request_password() which boils down
++ * to purple_request_fields() with certain parameters. I'm not sure
++ * if this the best way of doing this, but it works.
++ */
++ if (purple_request_fields_exists(fields, "password") &&
++ purple_request_fields_exists(fields, "remember")) {
++ struct password_data *pd = g_new0(struct password_data, 1);
++
++ DEBUG ("triggering password request");
++
++ pd->fields = fields;
++ pd->password = purple_request_fields_get_field(fields, "password");
++ pd->ok_cb = ok_cb;
++ pd->cancel_cb = cancel_cb;
++ pd->user_data = user_data;
++
++ haze_connection_request_password(account, pd);
++
++ } else {
++ DEBUG ("ignoring request:");
++ DEBUG (" title: %s", (title ? title : "(null)"));
++ DEBUG (" primary: %s", (primary ? primary : "(null)"));
++ DEBUG (" secondary: %s", (secondary ? secondary : "(null)"));
++ }
+
+ return NULL;
+ }
+
++#ifdef ENABLE_LEAKY_REQUEST_STUBS
+ static gpointer
+ haze_request_file (const char *title,
+ const char *filename,
+@@ -152,7 +202,7 @@ haze_request_folder (const char *title,
+
+ return NULL;
+ }
+-
++#endif
+
+ /*
+ void (*close_request)(PurpleRequestType type, void *ui_handle);
+@@ -160,12 +210,14 @@ haze_request_folder (const char *title,
+
+ static PurpleRequestUiOps request_uiops =
+ {
++#ifdef ENABLE_LEAKY_REQUEST_STUBS
+ .request_input = haze_request_input,
+ .request_choice = haze_request_choice,
+ .request_action = haze_request_action,
+- .request_fields = haze_request_fields,
+ .request_file = haze_request_file,
+- .request_folder = haze_request_folder
++ .request_folder = haze_request_folder,
++#endif
++ .request_fields = haze_request_fields
+ };
+
+ PurpleRequestUiOps *
+diff --git a/src/request.h b/src/request.h
+index d896cc6..cc572d6 100644
+--- a/src/request.h
++++ b/src/request.h
+@@ -20,4 +20,7 @@
+
+ #include <libpurple/request.h>
+
++void haze_request_password_cb (gpointer user_data,
++ const gchar *password);
++
+ PurpleRequestUiOps *haze_request_get_ui_ops (void);
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/net-voip/telepathy-haze/files/002-fix_resource_leakage.patch b/net-voip/telepathy-haze/files/002-fix_resource_leakage.patch
new file mode 100644
index 000000000000..ebf15dd6dc4c
--- /dev/null
+++ b/net-voip/telepathy-haze/files/002-fix_resource_leakage.patch
@@ -0,0 +1,141 @@
+From eef971c3aeb61b9b60013f3b728f62e7ac5580bf Mon Sep 17 00:00:00 2001
+From: Stefan Becker <chemobejk@gmail.com>
+Date: Wed, 10 Apr 2013 13:13:04 +0000
+Subject: request: fix resource leakage
+
+It is the responsibility of the UI code to free the "fields" parameter
+after haze_request_fields() has been called. This has to be done with
+purple_request_close() and handled in the close_request() UI operation.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=63326
+---
+diff --git a/src/request.c b/src/request.c
+index dae859d..db54317 100644
+--- a/src/request.c
++++ b/src/request.c
+@@ -101,7 +101,7 @@ haze_request_action (const char *title,
+ }
+ #endif
+
+-struct password_data {
++struct fields_data {
+ PurpleRequestFields *fields;
+ PurpleRequestField *password;
+ GCallback ok_cb;
+@@ -109,21 +109,40 @@ struct password_data {
+ void *user_data;
+ };
+
++static void haze_close_request(PurpleRequestType type, void *ui_handle)
++{
++ struct fields_data *fd = ui_handle;
++
++ purple_request_fields_destroy(fd->fields);
++ g_free(fd);
++}
++
+ void haze_request_password_cb (gpointer user_data,
+ const gchar *password)
+ {
+- struct password_data *pd = user_data;
++ struct fields_data *fd = user_data;
+
+ if (password) {
+- purple_request_field_string_set_value(pd->password, password);
+- ((PurpleRequestFieldsCb)pd->ok_cb)(pd->user_data, pd->fields);
++ purple_request_field_string_set_value(fd->password, password);
++ ((PurpleRequestFieldsCb)fd->ok_cb)(fd->user_data, fd->fields);
+ } else {
+- ((PurpleRequestFieldsCb)pd->cancel_cb)(pd->user_data, pd->fields);
++ ((PurpleRequestFieldsCb)fd->cancel_cb)(fd->user_data, fd->fields);
+ }
+
+- g_free(pd);
++ purple_request_close(PURPLE_REQUEST_FIELDS, fd);
+ }
+
++static gboolean haze_request_fields_destroy(gpointer user_data)
++{
++ purple_request_close(PURPLE_REQUEST_FIELDS, user_data);
++ return FALSE;
++}
++
++/*
++ * We must support purple_account_request_password() which boils down
++ * to purple_request_fields() with certain parameters. I'm not sure
++ * if this the best way of doing this, but it works.
++ */
+ static gpointer
+ haze_request_fields (const char *title,
+ const char *primary,
+@@ -138,33 +157,34 @@ haze_request_fields (const char *title,
+ PurpleConversation *conv,
+ void *user_data)
+ {
+- /*
+- * We must support purple_account_request_password() which boils down
+- * to purple_request_fields() with certain parameters. I'm not sure
+- * if this the best way of doing this, but it works.
+- */
++ struct fields_data *fd = g_new0(struct fields_data, 1);
++
++ /* it is our responsibility to destroy this data */
++ fd->fields = fields;
++
+ if (purple_request_fields_exists(fields, "password") &&
+ purple_request_fields_exists(fields, "remember")) {
+- struct password_data *pd = g_new0(struct password_data, 1);
+
+ DEBUG ("triggering password request");
+
+- pd->fields = fields;
+- pd->password = purple_request_fields_get_field(fields, "password");
+- pd->ok_cb = ok_cb;
+- pd->cancel_cb = cancel_cb;
+- pd->user_data = user_data;
++ fd->password = purple_request_fields_get_field(fields, "password");
++ fd->ok_cb = ok_cb;
++ fd->cancel_cb = cancel_cb;
++ fd->user_data = user_data;
+
+- haze_connection_request_password(account, pd);
++ haze_connection_request_password(account, fd);
+
+ } else {
+ DEBUG ("ignoring request:");
+ DEBUG (" title: %s", (title ? title : "(null)"));
+ DEBUG (" primary: %s", (primary ? primary : "(null)"));
+ DEBUG (" secondary: %s", (secondary ? secondary : "(null)"));
++
++ /* Avoid leaking of "fields" */
++ g_idle_add(haze_request_fields_destroy, fd);
+ }
+
+- return NULL;
++ return fd;
+ }
+
+ #ifdef ENABLE_LEAKY_REQUEST_STUBS
+@@ -204,10 +224,6 @@ haze_request_folder (const char *title,
+ }
+ #endif
+
+-/*
+- void (*close_request)(PurpleRequestType type, void *ui_handle);
+-*/
+-
+ static PurpleRequestUiOps request_uiops =
+ {
+ #ifdef ENABLE_LEAKY_REQUEST_STUBS
+@@ -217,7 +233,8 @@ static PurpleRequestUiOps request_uiops =
+ .request_file = haze_request_file,
+ .request_folder = haze_request_folder,
+ #endif
+- .request_fields = haze_request_fields
++ .request_fields = haze_request_fields,
++ .close_request = haze_close_request
+ };
+
+ PurpleRequestUiOps *
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/net-voip/telepathy-haze/files/003-fix_more_resource_leaks.patch b/net-voip/telepathy-haze/files/003-fix_more_resource_leaks.patch
new file mode 100644
index 000000000000..380af23b2955
--- /dev/null
+++ b/net-voip/telepathy-haze/files/003-fix_more_resource_leaks.patch
@@ -0,0 +1,213 @@
+From 4068d8504b2155168b82144a4d45b138e0579ef2 Mon Sep 17 00:00:00 2001
+From: Stefan Becker <chemobejk@gmail.com>
+Date: Thu, 11 Apr 2013 12:45:34 +0000
+Subject: request: fix more resource leaks
+
+Triggered by Will's review comments.
+
+- check callback pointers to be non-NULL before calling them
+- call cancel_cb also in destroy idle callback
+- reset connection's password request field on closing
+- coding style cleanup
+
+https://bugs.freedesktop.org/show_bug.cgi?id=63326
+---
+diff --git a/src/connection.c b/src/connection.c
+index 6e9121d..424802e 100644
+--- a/src/connection.c
++++ b/src/connection.c
+@@ -452,7 +452,7 @@ _haze_connection_password_manager_prompt_cb (GObject *source,
+
+ if (priv->password_request)
+ {
+- haze_request_password_cb(priv->password_request, NULL);
++ haze_request_password_cb (priv->password_request, NULL);
+ }
+
+ if (base_conn->status != TP_CONNECTION_STATUS_DISCONNECTED)
+@@ -481,7 +481,8 @@ _haze_connection_password_manager_prompt_cb (GObject *source,
+ if (priv->password_request)
+ {
+ haze_request_password_cb (priv->password_request, priv->password);
+- } else
++ }
++ else
+ {
+ purple_account_set_password (self->account, priv->password);
+
+@@ -537,8 +538,9 @@ _haze_connection_start_connecting (TpBaseConnection *base,
+ return TRUE;
+ }
+
+-void haze_connection_request_password (PurpleAccount *account,
+- void *user_data)
++void
++haze_connection_request_password (PurpleAccount *account,
++ void *user_data)
+ {
+ HazeConnection *self = ACCOUNT_GET_HAZE_CONNECTION (account);
+ HazeConnectionPrivate *priv = self->priv;
+@@ -551,6 +553,15 @@ void haze_connection_request_password (PurpleAccount *account,
+ self);
+ }
+
++void
++haze_connection_cancel_password_request (PurpleAccount *account)
++{
++ HazeConnection *self = ACCOUNT_GET_HAZE_CONNECTION (account);
++ HazeConnectionPrivate *priv = self->priv;
++
++ priv->password_request = NULL;
++}
++
+ static void
+ _haze_connection_shut_down (TpBaseConnection *base)
+ {
+diff --git a/src/connection.h b/src/connection.h
+index 2e68935..7fc8668 100644
+--- a/src/connection.h
++++ b/src/connection.h
+@@ -113,6 +113,7 @@ const gchar **haze_connection_get_guaranteed_interfaces (void);
+
+ void haze_connection_request_password (PurpleAccount *account,
+ gpointer user_data);
++void haze_connection_cancel_password_request (PurpleAccount *account);
+
+ G_END_DECLS
+
+diff --git a/src/request.c b/src/request.c
+index db54317..8aa7bc9 100644
+--- a/src/request.c
++++ b/src/request.c
+@@ -102,39 +102,62 @@ haze_request_action (const char *title,
+ #endif
+
+ struct fields_data {
++ PurpleAccount *account;
+ PurpleRequestFields *fields;
+ PurpleRequestField *password;
+- GCallback ok_cb;
+- GCallback cancel_cb;
++ PurpleRequestFieldsCb ok_cb;
++ PurpleRequestFieldsCb cancel_cb;
+ void *user_data;
+ };
+
+-static void haze_close_request(PurpleRequestType type, void *ui_handle)
++static void
++haze_close_request (PurpleRequestType type,
++ void *ui_handle)
+ {
+ struct fields_data *fd = ui_handle;
+
+- purple_request_fields_destroy(fd->fields);
+- g_free(fd);
++ haze_connection_cancel_password_request (fd->account);
++ purple_request_fields_destroy (fd->fields);
++ g_slice_free (struct fields_data, fd);
+ }
+
+-void haze_request_password_cb (gpointer user_data,
+- const gchar *password)
++void
++haze_request_password_cb (gpointer user_data,
++ const gchar *password)
+ {
+ struct fields_data *fd = user_data;
+
+- if (password) {
+- purple_request_field_string_set_value(fd->password, password);
+- ((PurpleRequestFieldsCb)fd->ok_cb)(fd->user_data, fd->fields);
+- } else {
+- ((PurpleRequestFieldsCb)fd->cancel_cb)(fd->user_data, fd->fields);
+- }
+-
+- purple_request_close(PURPLE_REQUEST_FIELDS, fd);
++ if (password)
++ {
++ purple_request_field_string_set_value (fd->password, password);
++ if (fd->ok_cb)
++ {
++ (fd->ok_cb) (fd->user_data, fd->fields);
++ }
++ }
++ else
++ {
++ if (fd->cancel_cb)
++ {
++ (fd->cancel_cb) (fd->user_data, fd->fields);
++ }
++ }
++
++ purple_request_close (PURPLE_REQUEST_FIELDS, fd);
+ }
+
+-static gboolean haze_request_fields_destroy(gpointer user_data)
++static gboolean
++haze_request_fields_destroy (gpointer user_data)
+ {
+- purple_request_close(PURPLE_REQUEST_FIELDS, user_data);
++ struct fields_data *fd = user_data;
++
++ if (fd->cancel_cb)
++ {
++ (fd->cancel_cb) (fd->user_data, fd->fields);
++ }
++
++ purple_request_close (PURPLE_REQUEST_FIELDS, user_data);
++
+ return FALSE;
+ }
+
+@@ -157,32 +180,36 @@ haze_request_fields (const char *title,
+ PurpleConversation *conv,
+ void *user_data)
+ {
+- struct fields_data *fd = g_new0(struct fields_data, 1);
++ struct fields_data *fd = g_slice_new0 (struct fields_data);
+
+ /* it is our responsibility to destroy this data */
+- fd->fields = fields;
++ fd->account = account;
++ fd->fields = fields;
++ fd->cancel_cb = (PurpleRequestFieldsCb) cancel_cb;
++ fd->user_data = user_data;
+
+- if (purple_request_fields_exists(fields, "password") &&
+- purple_request_fields_exists(fields, "remember")) {
++ if (purple_request_fields_exists (fields, "password") &&
++ purple_request_fields_exists (fields, "remember"))
++ {
+
+ DEBUG ("triggering password request");
+
+- fd->password = purple_request_fields_get_field(fields, "password");
+- fd->ok_cb = ok_cb;
+- fd->cancel_cb = cancel_cb;
+- fd->user_data = user_data;
++ fd->password = purple_request_fields_get_field (fields, "password");
++ fd->ok_cb = (PurpleRequestFieldsCb) ok_cb;
+
+- haze_connection_request_password(account, fd);
++ haze_connection_request_password (account, fd);
+
+- } else {
++ }
++ else
++ {
+ DEBUG ("ignoring request:");
+ DEBUG (" title: %s", (title ? title : "(null)"));
+ DEBUG (" primary: %s", (primary ? primary : "(null)"));
+ DEBUG (" secondary: %s", (secondary ? secondary : "(null)"));
+
+- /* Avoid leaking of "fields" */
+- g_idle_add(haze_request_fields_destroy, fd);
+- }
++ /* Avoid leaking of "fields" and "user_data" */
++ g_idle_add (haze_request_fields_destroy, fd);
++ }
+
+ return fd;
+ }
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/net-voip/telepathy-haze/telepathy-haze-0.7.0.ebuild b/net-voip/telepathy-haze/telepathy-haze-0.7.0.ebuild
new file mode 100644
index 000000000000..49a7274d2095
--- /dev/null
+++ b/net-voip/telepathy-haze/telepathy-haze-0.7.0.ebuild
@@ -0,0 +1,38 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-voip/telepathy-haze/telepathy-haze-0.7.0.ebuild,v 1.1 2013/04/21 11:39:40 pacho Exp $
+
+EAPI=5
+PYTHON_COMPAT=( python2_{5,6,7} )
+
+inherit eutils python-single-r1
+
+DESCRIPTION="Telepathy connection manager providing libpurple supported protocols."
+HOMEPAGE="http://developer.pidgin.im/wiki/TelepathyHaze"
+SRC_URI="http://telepathy.freedesktop.org/releases/${PN}/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+#IUSE="test"
+IUSE=""
+
+# Tests failing, see upstream: https://bugs.freedesktop.org/34577
+RESTRICT="test"
+
+RDEPEND="
+ >=net-im/pidgin-2.7
+ >=net-libs/telepathy-glib-0.15.1[${PYTHON_USEDEP}]
+ >=dev-libs/glib-2.22:2
+ >=dev-libs/dbus-glib-0.73
+"
+DEPEND="${RDEPEND}
+ virtual/pkgconfig"
+# test? ( dev-python/twisted-words )"
+
+src_prepare() {
+ # Apply some upstream fixes
+ epatch "${FILESDIR}"/001-handle_purple_account_request_password.patch
+ epatch "${FILESDIR}"/002-fix_resource_leakage.patch
+ epatch "${FILESDIR}"/003-fix_more_resource_leaks.patch
+}