]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-server-sasl-handler.c
account-settings: allow to change the service
[empathy.git] / libempathy / empathy-server-sasl-handler.c
index b06d7bf4ca4d5a5d50026930fd2d583efee2b7e2..117d88f03880834291f642f06f26839c112a6f9d 100644 (file)
@@ -37,6 +37,7 @@ enum {
 
 /* signal enum */
 enum {
+  AUTH_PASSWORD_FAILED,
   INVALIDATED,
   LAST_SIGNAL,
 };
@@ -50,6 +51,7 @@ typedef struct {
   GSimpleAsyncResult *result;
 
   gchar *password;
+  gboolean save_password;
 
   GSimpleAsyncResult *async_init_res;
 } EmpathyServerSASLHandlerPriv;
@@ -70,6 +72,25 @@ static const gchar *sasl_statuses[] = {
   "client failed",
 };
 
+static void
+empathy_server_sasl_handler_set_password_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  GError *error = NULL;
+
+  if (!empathy_keyring_set_account_password_finish (TP_ACCOUNT (source), result,
+          &error))
+    {
+      DEBUG ("Failed to set password: %s", error->message);
+      g_clear_error (&error);
+    }
+  else
+    {
+      DEBUG ("Password set successfully.");
+    }
+}
+
 static void
 sasl_status_changed_cb (TpChannel *channel,
     TpSASLStatus status,
@@ -78,6 +99,7 @@ sasl_status_changed_cb (TpChannel *channel,
     gpointer user_data,
     GObject *weak_object)
 {
+  EmpathyServerSASLHandler *self = EMPATHY_SERVER_SASL_HANDLER (weak_object);
   EmpathyServerSASLHandlerPriv *priv = EMPATHY_SERVER_SASL_HANDLER (weak_object)->priv;
 
   /* buh boh */
@@ -91,6 +113,15 @@ sasl_status_changed_cb (TpChannel *channel,
 
   if (status == TP_SASL_STATUS_SERVER_SUCCEEDED)
     {
+      if (priv->save_password)
+        {
+          DEBUG ("Saving password in keyring");
+
+          empathy_keyring_set_account_password_async (priv->account,
+              priv->password, empathy_server_sasl_handler_set_password_cb,
+              NULL);
+        }
+
       DEBUG ("Calling AcceptSASL");
       tp_cli_channel_interface_sasl_authentication_call_accept_sasl (
           priv->channel, -1, NULL, NULL, NULL, NULL);
@@ -101,6 +132,13 @@ sasl_status_changed_cb (TpChannel *channel,
       tp_cli_channel_call_close (priv->channel, -1,
           NULL, NULL, NULL, NULL);
     }
+  else if (status == TP_SASL_STATUS_SERVER_FAILED)
+   {
+     if (!tp_strdiff (error, TP_ERROR_STR_AUTHENTICATION_FAILED))
+       {
+         g_signal_emit (self, signals[AUTH_PASSWORD_FAILED], 0, priv->password);
+       }
+   }
 }
 
 static gboolean
@@ -304,11 +342,18 @@ empathy_server_sasl_handler_class_init (EmpathyServerSASLHandlerClass *klass)
       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
   g_object_class_install_property (oclass, PROP_ACCOUNT, pspec);
 
+  signals[AUTH_PASSWORD_FAILED] = g_signal_new ("auth-password-failed",
+      G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, 0,
+      NULL, NULL,
+      g_cclosure_marshal_generic,
+      G_TYPE_NONE, 1, G_TYPE_STRING);
+
   signals[INVALIDATED] = g_signal_new ("invalidated",
       G_TYPE_FROM_CLASS (klass),
       G_SIGNAL_RUN_LAST, 0,
       NULL, NULL,
-      g_cclosure_marshal_VOID__VOID,
+      g_cclosure_marshal_generic,
       G_TYPE_NONE, 0);
 }
 
@@ -369,25 +414,6 @@ start_mechanism_with_data_cb (TpChannel *proxy,
   DEBUG ("Started mechanism successfully");
 }
 
-static void
-empathy_server_sasl_handler_set_password_cb (GObject *source,
-    GAsyncResult *result,
-    gpointer user_data)
-{
-  GError *error = NULL;
-
-  if (!empathy_keyring_set_account_password_finish (TP_ACCOUNT (source), result,
-          &error))
-    {
-      DEBUG ("Failed to set password: %s", error->message);
-      g_clear_error (&error);
-    }
-  else
-    {
-      DEBUG ("Password set successfully.");
-    }
-}
-
 void
 empathy_server_sasl_handler_provide_password (
     EmpathyServerSASLHandler *handler,
@@ -433,9 +459,11 @@ empathy_server_sasl_handler_provide_password (
     {
       if (may_save_response)
         {
-          DEBUG ("Saving password in keyring");
-          empathy_keyring_set_account_password_async (priv->account, password,
-              empathy_server_sasl_handler_set_password_cb, NULL);
+          g_free (priv->password);
+
+          /* We'll save the password if we manage to connect */
+          priv->password = g_strdup (password);
+          priv->save_password = TRUE;
         }
       else if (tp_proxy_has_interface_by_id (priv->channel,
             EMP_IFACE_QUARK_CHANNEL_INTERFACE_CREDENTIALS_STORAGE))