]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-auth-factory.c
Merge remote-tracking branch 'origin/gnome-3-8'
[empathy.git] / libempathy / empathy-auth-factory.c
index fb178216d5412c2a77c90020b5346a1d968e6c79..cba4607a3e44af53b9df386e1e96e69d89cf3104 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <config.h>
-
+#include "config.h"
 #include "empathy-auth-factory.h"
 
-#include <telepathy-glib/telepathy-glib.h>
-
-#define DEBUG_FLAG EMPATHY_DEBUG_TLS
-#include "empathy-debug.h"
 #include "empathy-keyring.h"
+#include "empathy-sasl-mechanisms.h"
 #include "empathy-server-sasl-handler.h"
 #include "empathy-server-tls-handler.h"
 #include "empathy-utils.h"
 #include "empathy-goa-auth-handler.h"
 #endif /* HAVE_GOA */
 
-#include "extensions/extensions.h"
+#ifdef HAVE_UOA
+#include "empathy-uoa-auth-handler.h"
+#endif /* HAVE_UOA */
+
+#include "extensions.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_TLS
+#include "empathy-debug.h"
 
 G_DEFINE_TYPE (EmpathyAuthFactory, empathy_auth_factory, TP_TYPE_BASE_CLIENT);
 
@@ -53,6 +56,10 @@ struct _EmpathyAuthFactoryPriv {
   EmpathyGoaAuthHandler *goa_handler;
 #endif /* HAVE_GOA */
 
+#ifdef HAVE_UOA
+  EmpathyUoaAuthHandler *uoa_handler;
+#endif /* HAVE_UOA */
+
   /* If an account failed to connect and user enters a new password to try, we
    * store it in this hash table and will try to use it next time the account
    * attemps to connect.
@@ -473,6 +480,32 @@ goa_claim_cb (GObject *source,
 }
 #endif /* HAVE_GOA */
 
+#ifdef HAVE_UOA
+static void
+uoa_claim_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  ObserveChannelsData *data = user_data;
+  EmpathyAuthFactory *self = data->self;
+  GError *error = NULL;
+
+  if (!tp_channel_dispatch_operation_claim_with_finish (data->dispatch_operation,
+          result, &error))
+    {
+      DEBUG ("Failed to claim: %s", error->message);
+      g_clear_error (&error);
+    }
+  else
+    {
+      empathy_uoa_auth_handler_start (self->priv->uoa_handler,
+          data->channel, data->account);
+    }
+
+  observe_channels_data_free (data);
+}
+#endif /* HAVE_UOA */
+
 static void
 observe_channels (TpBaseClient *client,
     TpAccount *account,
@@ -521,6 +554,20 @@ observe_channels (TpBaseClient *client,
     }
 #endif /* HAVE_GOA */
 
+#ifdef HAVE_UOA
+  /* UOA auth? */
+  if (empathy_uoa_auth_handler_supports (self->priv->uoa_handler, channel, account))
+    {
+      DEBUG ("Supported UOA account (%s), claim SASL channel",
+          tp_proxy_get_object_path (account));
+
+      tp_channel_dispatch_operation_claim_with_async (dispatch_operation,
+          client, uoa_claim_cb, data);
+      tp_observe_channels_context_accept (context);
+      return;
+    }
+#endif /* HAVE_UOA */
+
   /* Password auth? */
   if (empathy_sasl_channel_supports_mechanism (data->channel,
           "X-TELEPATHY-PASSWORD"))
@@ -588,6 +635,10 @@ empathy_auth_factory_init (EmpathyAuthFactory *self)
   self->priv->goa_handler = empathy_goa_auth_handler_new ();
 #endif /* HAVE_GOA */
 
+#ifdef HAVE_UOA
+  self->priv->uoa_handler = empathy_uoa_auth_handler_new ();
+#endif /* HAVE_UOA */
+
   self->priv->retry_passwords = g_hash_table_new_full (NULL, NULL,
       g_object_unref, g_free);
 }
@@ -656,6 +707,10 @@ empathy_auth_factory_dispose (GObject *object)
   g_object_unref (priv->goa_handler);
 #endif /* HAVE_GOA */
 
+#ifdef HAVE_UOA
+  g_object_unref (priv->uoa_handler);
+#endif /* HAVE_UOA */
+
   g_hash_table_unref (priv->retry_passwords);
 
   G_OBJECT_CLASS (empathy_auth_factory_parent_class)->dispose (object);