summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2010-11-24 11:08:40 +0000
committerJonny Lamb <jonny.lamb@collabora.co.uk>2010-11-25 10:09:07 +0000
commitf953157c8d559bc8740f0b5814a1761cf483d34e (patch)
tree053d946eb45397f7cb0234dde8f81ea64e834e1f
parent27d51779b804726e0f415459f2f3e0b786cb0361 (diff)
downloadtelepathy-haze-f953157c8d559bc8740f0b5814a1761cf483d34e.tar.gz
connection: use TpSimplePasswordManager to get a password if not given
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r--configure.ac2
-rw-r--r--src/connection.c69
-rw-r--r--src/connection.h2
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 <telepathy-glib/base-connection.h>
#include <telepathy-glib/contacts-mixin.h>
#include <telepathy-glib/presence-mixin.h>
+#include <telepathy-glib/simple-password-manager.h>
#include <libpurple/account.h>
#include <libpurple/prpl.h>
@@ -66,6 +67,7 @@ struct _HazeConnection {
HazeContactList *contact_list;
HazeImChannelFactory *im_factory;
HazeMediaManager *media_manager;
+ TpSimplePasswordManager *password_manager;
TpContactsMixin contacts;
TpPresenceMixin presence;