]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix authentication greeter issues
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Jul 2011 04:10:22 +0000 (14:10 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Jul 2011 04:10:22 +0000 (14:10 +1000)
greeters/gtk/lightdm-gtk-greeter.c
liblightdm-gobject/greeter.c
liblightdm-qt/greeter.cpp

index 51e55826dde75b7af4802a14957bbc63a8e3f856..e90734f89c4530684c7154da9d4109c5f194c282 100644 (file)
@@ -26,6 +26,7 @@ static GtkWidget *prompt_box;
 static GtkEntry *prompt_entry;
 static GtkComboBox *session_combo;
 static gchar *default_font_name, *default_theme_name;
+static gboolean cancelling = FALSE;
 
 static gchar *
 get_session ()
@@ -70,6 +71,7 @@ start_authentication (const gchar *username)
 {
     gtk_widget_hide (GTK_WIDGET (message_label));
     gtk_label_set_text (message_label, "");
+    cancelling = FALSE;
 
     if (strcmp (username, "*other") == 0)
     {
@@ -154,6 +156,7 @@ void
 cancel_cb (GtkWidget *widget)
 {
     lightdm_greeter_cancel_authentication (greeter);
+    cancelling = TRUE;
 }
 
 static void
@@ -177,8 +180,6 @@ show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType
 static void
 authentication_complete_cb (LightDMGreeter *greeter)
 {
-    gtk_widget_hide (prompt_box);
-    gtk_label_set_text (prompt_label, "");
     gtk_entry_set_text (prompt_entry, "");
 
     gtk_widget_grab_focus (GTK_WIDGET (user_view));
@@ -186,16 +187,27 @@ authentication_complete_cb (LightDMGreeter *greeter)
     if (lightdm_greeter_get_is_authenticated (greeter))
     {
         gchar *session = get_session ();
+
+        gtk_widget_hide (prompt_box);
+
         if (!lightdm_greeter_start_session_sync (greeter, session))
-            gtk_label_set_text (message_label, _("Failed to authenticate"));
+        {
+            gtk_label_set_text (message_label, _("Failed to start session"));
+            gtk_widget_show (GTK_WIDGET (message_label));
+        }
         g_free (session);
     }
+    else if (cancelling)
+    {
+        cancelling = FALSE;
+        gtk_widget_hide (prompt_box);
+    }
     else
-        gtk_label_set_text (message_label, _("Failed to authenticate"));
-
-    gtk_widget_show (GTK_WIDGET (message_label));
-    if (lightdm_greeter_get_hide_users_hint (greeter))
-        lightdm_greeter_authenticate (greeter, NULL);
+    {
+        gtk_label_set_text (message_label, _("Incorrect password, please try again"));
+        gtk_widget_show (GTK_WIDGET (message_label));
+        lightdm_greeter_authenticate (greeter, lightdm_greeter_get_authentication_user (greeter));
+    }
 }
 
 static void
@@ -719,7 +731,7 @@ main(int argc, char **argv)
     gtk_window_resize (panel_window, monitor_geometry.width, allocation.height);
     gtk_window_move (panel_window, monitor_geometry.x, monitor_geometry.y);
 
-    gtk_widget_grab_focus (GTK_WIDGET (user_view));
+    gtk_widget_grab_focus (GTK_WIDGET (login_window));
 
     gtk_main ();
 
index 8a4f6e06e32006a8c18d443616cabb4a05b960e3..12c54d87b93476fd0a66bcfa8168bee72a3830c1 100644 (file)
@@ -144,7 +144,10 @@ write_int (guint8 *buffer, gint buffer_length, guint32 value, gsize *offset)
 static void
 write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset)
 {
-    gint length = strlen (value);
+    gint length = 0;
+
+    if (value)
+        length = strlen (value);
     write_int (buffer, buffer_length, length, offset);
     if (*offset + length >= buffer_length)
         return;
@@ -195,7 +198,10 @@ read_string (guint8 *message, gsize message_length, gsize *offset)
 static guint32
 string_length (const gchar *value)
 {
-    return int_length () + strlen (value);
+    if (value)
+        return int_length () + strlen (value);
+    else
+        return int_length ();
 }
 
 static void
@@ -272,7 +278,6 @@ handle_prompt_authentication (LightDMGreeter *greeter, guint8 *message, gsize me
         g_free (username);
         username = NULL;
     }
-    else
     g_free (priv->authentication_user);
     priv->authentication_user = username;
 
@@ -340,8 +345,8 @@ handle_end_authentication (LightDMGreeter *greeter, guint8 *message, gsize messa
     priv->cancelling_authentication = FALSE;
     priv->is_authenticated = (return_code == 0);
 
-    g_signal_emit (G_OBJECT (greeter), signals[AUTHENTICATION_COMPLETE], 0);
     priv->in_authentication = FALSE;
+    g_signal_emit (G_OBJECT (greeter), signals[AUTHENTICATION_COMPLETE], 0);
 }
 
 static guint8 *
@@ -686,21 +691,23 @@ lightdm_greeter_cancel_autologin (LightDMGreeter *greeter)
 void
 lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username)
 {
-    LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
+    LightDMGreeterPrivate *priv;
     guint8 message[MAX_MESSAGE_LENGTH];
     gsize offset = 0;
 
     g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
 
-    if (!username)
-        username = "";
+    priv = GET_PRIVATE (greeter);
 
     priv->cancelling_authentication = FALSE;
     priv->authenticate_sequence_number++;
     priv->in_authentication = TRUE;  
     priv->is_authenticated = FALSE;
-    g_free (priv->authentication_user);
-    priv->authentication_user = g_strdup (username);
+    if (username != priv->authentication_user)
+    {
+        g_free (priv->authentication_user);
+        priv->authentication_user = g_strdup (username);
+    }
 
     g_debug ("Starting authentication for user %s...", username);
     write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset);
@@ -842,22 +849,21 @@ lightdm_greeter_get_authentication_user (LightDMGreeter *greeter)
 gboolean
 lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session)
 {
-    LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
+    LightDMGreeterPrivate *priv;
     guint8 message[MAX_MESSAGE_LENGTH];
     guint8 *response;
     gsize response_length, offset = 0;
     guint32 id, return_code = 1;
 
     g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
+
+    priv = GET_PRIVATE (greeter);
     g_return_val_if_fail (priv->is_authenticated, FALSE);
 
-    if (!session)
-    {
-        session = "";
-        g_debug ("Starting default session");
-    }
-    else
+    if (session)
         g_debug ("Starting session %s", session);
+    else
+        g_debug ("Starting default session");
 
     write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset);
     write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
index da8651c863930cfd1a6e86c50630cffb76ce0816..9083495e22df0f530777ced995557c4679448b24 100644 (file)
@@ -425,8 +425,8 @@ void Greeter::onRead(int fd)
             d->cancellingAuthentication = false;
             d->isAuthenticated = (returnCode == 0);
             d->authenticationUser = username;
-            emit authenticationComplete();
             d->inAuthentication = false;
+            emit authenticationComplete();
         }
         else
             qDebug () << "Ignoring end authentication with invalid sequence number " << sequenceNumber;