From f953157c8d559bc8740f0b5814a1761cf483d34e Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 24 Nov 2010 11:08:40 +0000 Subject: connection: use TpSimplePasswordManager to get a password if not given Signed-off-by: Jonny Lamb --- configure.ac | 2 +- src/connection.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/connection.h | 2 ++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 55ad0f8..99fe1dc 100644 --- a/configure.ac +++ b/configure.ac @@ -72,7 +72,7 @@ AC_ARG_ENABLE(leaky-request-stubs, AC_SUBST(ENABLE_LEAKY_REQUEST_STUBS) PKG_CHECK_MODULES(PURPLE,[purple >= 2.7]) -PKG_CHECK_MODULES(TP_GLIB,[telepathy-glib >= 0.11.16]) +PKG_CHECK_MODULES(TP_GLIB,[telepathy-glib >= 0.13.7]) PKG_CHECK_MODULES(GLIB,[glib-2.0 >= 2.22, gobject-2.0]) PKG_CHECK_MODULES(DBUS_GLIB,[dbus-glib-1 >= 0.73]) diff --git a/src/connection.c b/src/connection.c index c5d58aa..9a42a11 100644 --- a/src/connection.c +++ b/src/connection.c @@ -133,6 +133,9 @@ struct _HazeConnectionPrivate */ gboolean disconnecting; + /* Set to TRUE when purple_account_connect has been called. */ + gboolean connect_called; + gboolean dispose_has_run; }; @@ -404,13 +407,53 @@ haze_connection_create_account (HazeConnection *self, return TRUE; } +static void +_haze_connection_password_manager_prompt_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + HazeConnection *self = user_data; + HazeConnectionPrivate *priv = self->priv; + TpBaseConnection *base_conn = (TpBaseConnection *) self; + const GString *password; + GError *error = NULL; + + password = tp_simple_password_manager_prompt_finish ( + TP_SIMPLE_PASSWORD_MANAGER (source), result, &error); + + if (error != NULL) + { + DEBUG ("Simple password manager failed: %s", error->message); + + tp_base_connection_change_status (base_conn, + TP_CONNECTION_STATUS_DISCONNECTED, + TP_CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED); + + /* no need to call purple_account_disconnect because _connect + * was never called */ + + return; + } + + g_free (priv->password); + priv->password = g_strdup (password->str); + + 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; +} + static gboolean _haze_connection_start_connecting (TpBaseConnection *base, GError **error) { HazeConnection *self = HAZE_CONNECTION(base); + HazeConnectionPrivate *priv = self->priv; TpHandleRepoIface *contact_handles = tp_base_connection_get_handles (base, TP_HANDLE_TYPE_CONTACT); + const gchar *password; g_return_val_if_fail (self->account != NULL, FALSE); @@ -426,8 +469,24 @@ _haze_connection_start_connecting (TpBaseConnection *base, * like GMail and MySpace where you need to do an action before connecting * to start receiving the notifications. */ purple_account_set_check_mail(self->account, TRUE); - purple_account_set_enabled(self->account, UI_ID, TRUE); - purple_account_connect(self->account); + + /* check whether we need to pop up an auth channel */ + password = purple_account_get_password (self->account); + + if (password == NULL + && !(priv->prpl_info->options & OPT_PROTO_NO_PASSWORD) + && !(priv->prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL)) + { + /* pop up auth channel */ + tp_simple_password_manager_prompt_async (self->password_manager, + _haze_connection_password_manager_prompt_cb, self); + } + else + { + purple_account_set_enabled(self->account, UI_ID, TRUE); + purple_account_connect (self->account); + priv->connect_called = TRUE; + } return TRUE; } @@ -437,7 +496,7 @@ _haze_connection_shut_down (TpBaseConnection *base) { HazeConnection *self = HAZE_CONNECTION(base); HazeConnectionPrivate *priv = self->priv; - if(!priv->disconnecting) + if(!priv->disconnecting && priv->connect_called) { priv->disconnecting = TRUE; purple_account_disconnect(self->account); @@ -506,6 +565,10 @@ _haze_connection_create_channel_managers (TpBaseConnection *base) g_object_new (HAZE_TYPE_CONTACT_LIST, "connection", self, NULL)); g_ptr_array_add (channel_managers, self->contact_list); + self->password_manager = tp_simple_password_manager_new ( + TP_BASE_CONNECTION (self)); + g_ptr_array_add (channel_managers, self->password_manager); + return channel_managers; } diff --git a/src/connection.h b/src/connection.h index d0bdd2c..f51379a 100644 --- a/src/connection.h +++ b/src/connection.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -66,6 +67,7 @@ struct _HazeConnection { HazeContactList *contact_list; HazeImChannelFactory *im_factory; HazeMediaManager *media_manager; + TpSimplePasswordManager *password_manager; TpContactsMixin contacts; TpPresenceMixin presence; -- cgit v1.2.1