aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-04-28 19:02:25 +0800
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-04-28 19:02:25 +0800
commitf8a1fac65f1d53d7559e9e03893d7761627e1d43 (patch)
tree892500b1b607ddfbf43c304a4dfb9c64b1bcc56a
parentcc12d897e6f0bc22a0e31e6ba6a37d940061dd07 (diff)
downloadgsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar.gz
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar.bz2
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar.lz
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar.xz
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.tar.zst
gsoc2013-empathy-f8a1fac65f1d53d7559e9e03893d7761627e1d43.zip
Don't tie auth observer lifetime to widget lifetime
When logging in, the auth observer needs the password after the widget has been destroyed. So instead the auth observer now lives forever, and the password is supplied in account_widget_skype_additional_apply_async()
-rw-r--r--libempathy-gtk/empathy-account-widget-skype.c74
1 files changed, 46 insertions, 28 deletions
diff --git a/libempathy-gtk/empathy-account-widget-skype.c b/libempathy-gtk/empathy-account-widget-skype.c
index 2b6a769e8..288fc039a 100644
--- a/libempathy-gtk/empathy-account-widget-skype.c
+++ b/libempathy-gtk/empathy-account-widget-skype.c
@@ -149,7 +149,6 @@ auth_observer_observe_channels (TpSimpleObserver *auth_observer,
TpChannel *channel;
GHashTable *props;
GStrv available_mechanisms;
- GtkWidget *password_entry = user_data;
const char *password = NULL;
gboolean remember;
@@ -157,11 +156,11 @@ auth_observer_observe_channels (TpSimpleObserver *auth_observer,
if (tp_strdiff (
tp_connection_get_connection_manager_name (connection),
"psyke"))
- goto except;
+ goto finally;
/* can only deal with one channel */
if (g_list_length (channels) != 1)
- goto except;
+ goto finally;
channel = channels->data;
props = tp_channel_borrow_immutable_properties (channel);
@@ -172,18 +171,14 @@ auth_observer_observe_channels (TpSimpleObserver *auth_observer,
/* must support X-TELEPATHY-PASSWORD */
if (!tp_strv_contains ((const char * const *) available_mechanisms,
"X-TELEPATHY-PASSWORD"))
- goto except;
+ goto finally;
- /* do we have a password */
- if (g_object_get_data (G_OBJECT (password_entry), "fake-password") == NULL)
- password = gtk_entry_get_text (GTK_ENTRY (password_entry));
+ password = g_object_get_data (G_OBJECT (auth_observer), "password");
+ remember = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (auth_observer),
+ "remember-password"));
if (tp_str_empty (password))
- goto except;
-
- /* do we want to remember it */
- remember = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
- g_object_get_data (G_OBJECT (password_entry), "remember-password")));
+ goto finally;
DEBUG ("claiming auth channel");
@@ -191,12 +186,12 @@ auth_observer_observe_channels (TpSimpleObserver *auth_observer,
auth_observer_claim_cb,
observe_channels_data_new (account, channel, password, remember));
-except:
+finally:
tp_observe_channels_context_accept (context);
}
static TpBaseClient *
-auth_observer_new (GtkWidget *password_entry)
+auth_observer_new (void)
{
TpDBusDaemon *dbus;
TpBaseClient *auth_observer;
@@ -212,7 +207,7 @@ auth_observer_new (GtkWidget *password_entry)
}
auth_observer = tp_simple_observer_new (dbus, FALSE, "Empathy.PsykePreAuth",
- FALSE, auth_observer_observe_channels, password_entry, NULL);
+ FALSE, auth_observer_observe_channels, NULL, NULL);
tp_base_client_set_observer_delay_approvers (auth_observer, TRUE);
tp_base_client_take_observer_filter (auth_observer, tp_asv_new (
@@ -365,7 +360,7 @@ account_widget_build_skype_get_password_saved_cb (TpProxy *account,
gpointer user_data,
GObject *password_entry)
{
- GtkWidget *remember_password;
+ GtkWidget *remember_password = user_data;
gboolean password_saved;
if (in_error != NULL)
@@ -385,9 +380,6 @@ account_widget_build_skype_get_password_saved_cb (TpProxy *account,
!tp_str_empty (gtk_entry_get_text (GTK_ENTRY (password_entry))))
return;
- remember_password =
- GTK_WIDGET (g_object_get_data (password_entry, "remember-password"));
-
gtk_entry_set_text (GTK_ENTRY (password_entry),
password_saved ? "xxxxxxxxxxxx": "");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (remember_password),
@@ -417,7 +409,7 @@ account_widget_build_skype_account_properties_changed_cb (TpProxy *account,
return;
account_widget_build_skype_get_password_saved_cb (account, value, NULL,
- NULL, password_entry);
+ user_data, password_entry);
}
static void
@@ -453,6 +445,26 @@ account_widget_skype_additional_apply_async (EmpathyAccountWidget *self,
TpAccount *account = empathy_account_settings_get_account (priv->settings);
GSimpleAsyncResult *simple = g_simple_async_result_new (G_OBJECT (self),
callback, user_data, NULL);
+ GtkWidget *password_entry, *remember_password;
+ GObject *auth_observer;
+ const char *password = NULL;
+ gboolean remember;
+
+ /* sync the password with the observer */
+ auth_observer = g_object_get_data (G_OBJECT (self), "auth-observer");
+ password_entry = g_object_get_data (G_OBJECT (self), "password-entry");
+ remember_password = g_object_get_data (G_OBJECT (self), "remember-password");
+
+ if (g_object_get_data (G_OBJECT (password_entry), "fake-password") == NULL)
+ password = gtk_entry_get_text (GTK_ENTRY (password_entry));
+
+ remember = gtk_toggle_button_get_active (
+ GTK_TOGGLE_BUTTON (remember_password));
+
+ g_object_set_data_full (auth_observer, "password",
+ g_strdup (password), g_free);
+ g_object_set_data (auth_observer, "remember-password",
+ GUINT_TO_POINTER (remember));
/* we have to forget the password, else psyke won't query for the new one */
emp_cli_account_interface_external_password_storage_call_forget_password (
@@ -782,6 +794,7 @@ void
empathy_account_widget_build_skype (EmpathyAccountWidget *self,
const char *filename)
{
+ static TpBaseClient *auth_observer = NULL;
EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
TpAccount *account = empathy_account_settings_get_account (priv->settings);
GtkWidget *password_entry, *remember_password;
@@ -854,12 +867,17 @@ empathy_account_widget_build_skype (EmpathyAccountWidget *self,
self->ui_details->default_focus = g_strdup ("entry_id");
}
- /* create the Psyke pre-authentication observer --
- * tie the lifetime of the observer to the lifetime of the widget */
- g_object_set_data_full (G_OBJECT (self->ui_details->widget), "auth-observer",
- auth_observer_new (password_entry), g_object_unref);
- g_object_set_data (G_OBJECT (password_entry), "remember-password",
- remember_password);
+ /* create the Psyke pre-authentication observer */
+ if (auth_observer == NULL)
+ {
+ /* the auth observer lives for the lifetime of the process */
+ DEBUG ("Creating Psyke authentication observer");
+ auth_observer = auth_observer_new ();
+ }
+
+ g_object_set_data (G_OBJECT (self), "auth-observer", auth_observer);
+ g_object_set_data (G_OBJECT (self), "password-entry", password_entry);
+ g_object_set_data (G_OBJECT (self), "remember-password", remember_password);
g_object_bind_property (remember_password, "active",
password_entry, "sensitive", G_BINDING_SYNC_CREATE);
@@ -872,10 +890,10 @@ empathy_account_widget_build_skype (EmpathyAccountWidget *self,
EMP_IFACE_ACCOUNT_INTERFACE_EXTERNAL_PASSWORD_STORAGE,
"PasswordSaved",
account_widget_build_skype_get_password_saved_cb,
- NULL, NULL, G_OBJECT (password_entry));
+ remember_password, NULL, G_OBJECT (password_entry));
tp_cli_dbus_properties_connect_to_properties_changed (account,
account_widget_build_skype_account_properties_changed_cb,
- NULL, NULL, G_OBJECT (password_entry), NULL);
+ remember_password, NULL, G_OBJECT (password_entry), NULL);
}
/* if the user changes the password, it's probably no longer a fake