]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix up allowing logins without a username
authorRobert Ancell <robert.ancell@canonical.com>
Tue, 12 Jul 2011 01:16:55 +0000 (11:16 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Tue, 12 Jul 2011 01:16:55 +0000 (11:16 +1000)
greeters/gtk/lightdm-example-gtk-greeter.c
liblightdm-gobject/greeter.c
src/pam-session.c
tests/Makefile.am
tests/scripts/login-gobject-manual.conf [new file with mode: 0644]
tests/scripts/login-gobject-manual.script [new file with mode: 0644]
tests/src/test-gobject-greeter.c
tests/test-login-gobject-manual [new file with mode: 0755]

index 2e99a87e037ac02925341c2433ba42dd90a2073c..e11e6f2cf8e81072f845b4a0901b0b333e58ad0f 100644 (file)
@@ -72,13 +72,7 @@ start_authentication (const gchar *username)
 
     if (strcmp (username, "*other") == 0)
     {
-        gtk_label_set_text (GTK_LABEL (prompt_label), _("Username:"));
-        gtk_widget_set_sensitive (prompt_entry, TRUE);
-        gtk_entry_set_text (GTK_ENTRY (prompt_entry), "");
-        gtk_entry_set_visibility (GTK_ENTRY (prompt_entry), TRUE);
-        gtk_widget_show (prompt_box);
-        gtk_widget_grab_focus (prompt_entry);
-        return;
+        ldm_greeter_login (greeter, NULL);
     }
     else if (strcmp (username, "*guest") == 0)
     {
index 76574b4cca12461cf9d7bc5ec280c341287b4d67..071406563e37bd35c63cd54036f7d84e983c7fab 100644 (file)
@@ -1277,7 +1277,7 @@ ldm_greeter_login (LdmGreeter *greeter, const char *username)
     gsize offset = 0;
 
     g_return_if_fail (LDM_IS_GREETER (greeter));
-  
+
     if (!username)
         username = "";
 
index da79c9e459fc6d660f1186ba4f55d3c62ae1966e..709d67f022ffcfaa6ad118e49a8cd74c27da6d6b 100644 (file)
@@ -213,8 +213,20 @@ pam_session_start (PAMSession *session, GError **error)
 
     if (use_fake_users)
     {
+        if (session->priv->username == NULL)
+        {
+            struct pam_message **messages;
+            messages = calloc (1, sizeof (struct pam_message *));
+            messages[0] = g_malloc0 (sizeof (struct pam_message));
+            messages[0]->msg_style = PAM_PROMPT_ECHO_ON;
+            messages[0]->msg = g_strdup ("login:");
+            session->priv->messages = (const struct pam_message **) messages;
+            session->priv->num_messages = 1;
+
+            g_signal_emit (G_OBJECT (session), signals[GOT_MESSAGES], 0, session->priv->num_messages, session->priv->messages);         
+        }
         /* Always succeed with autologin, otherwise prompt for a password */
-        if (strcmp (session->priv->service, "lightdm-autologin") == 0 ||
+        else if (strcmp (session->priv->service, "lightdm-autologin") == 0 ||
             g_strcmp0 (session->priv->username, "guest") == 0)
             g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_SUCCESS);
         else
@@ -255,7 +267,17 @@ pam_session_strerror (PAMSession *session, int error)
 const gchar *
 pam_session_get_username (PAMSession *session)
 {
+    const char *username;
+
     g_return_val_if_fail (session != NULL, NULL);
+
+    if (session->priv->pam_handle)
+    {
+        g_free (session->priv->username);
+        pam_get_item (session->priv->pam_handle, PAM_USER, (const void **) &username);
+        session->priv->username = g_strdup (username);
+    }
+
     return session->priv->username;
 }
 
@@ -280,8 +302,6 @@ pam_session_respond (PAMSession *session, struct pam_response *response)
 
     if (use_fake_users)
     {
-        User *user;
-
         if (session->priv->messages)
         {
             int i;
@@ -297,15 +317,36 @@ pam_session_respond (PAMSession *session, struct pam_response *response)
             session->priv->num_messages = 0;
         }
 
-        user = user_get_by_name (session->priv->username);
-        if (user && strcmp (response->resp, "password") == 0)
-            g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_SUCCESS);
+        if (session->priv->username == NULL)
+        {
+            struct pam_message **messages;
+          
+            session->priv->username = g_strdup (response->resp);
+
+            messages = calloc (1, sizeof (struct pam_message *));
+            messages[0] = g_malloc0 (sizeof (struct pam_message));
+            messages[0]->msg_style = PAM_PROMPT_ECHO_OFF;
+            messages[0]->msg = g_strdup ("Password:");
+            session->priv->messages = (const struct pam_message **) messages;
+            session->priv->num_messages = 1;
+
+            g_signal_emit (G_OBJECT (session), signals[GOT_MESSAGES], 0, session->priv->num_messages, session->priv->messages);          
+        }
         else
-            g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_AUTH_ERR);
+        {
+            User *user;
+
+            user = user_get_by_name (session->priv->username);
+            if (user && strcmp (response->resp, "password") == 0)
+                g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_SUCCESS);
+            else
+                g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_AUTH_ERR);
+
+            if (user)
+                g_object_unref (user);
+        }
         g_free (response->resp);
         g_free (response);
-        if (user)
-            g_object_unref (user);
     }
     else
     {
index 080bfcc5dd90dd00856b1ea48ad22df06c087d50..88f7435e0a8882a7ab744428ba5515b8f7a42ef5 100644 (file)
@@ -8,6 +8,7 @@ TESTS = \
        test-autologin \
        test-autologin-logout \
        test-login-gobject \
+       test-login-gobject-manual \
        test-login-gobject-wrong-password \
        test-login-gobject-invalid-user \
        test-login-gobject-logout \
diff --git a/tests/scripts/login-gobject-manual.conf b/tests/scripts/login-gobject-manual.conf
new file mode 100644 (file)
index 0000000..1ff7512
--- /dev/null
@@ -0,0 +1,10 @@
+[LightDM]
+seats=test-seat
+
+[test-seat]
+display-number=99
+
+[test-greeter-config]
+prompt-username=true
+username=alice
+password=password
diff --git a/tests/scripts/login-gobject-manual.script b/tests/scripts/login-gobject-manual.script
new file mode 100644 (file)
index 0000000..6433ca0
--- /dev/null
@@ -0,0 +1,34 @@
+RUNNER DAEMON-START
+
+# X server starts
+XSERVER :.* START
+XSERVER :.* INDICATE-READY
+XSERVER :.* ACCEPT-CONNECT
+
+# Greeter starts
+GREETER START
+XSERVER :.* ACCEPT-CONNECT
+GREETER CONNECT-XSERVER :.*
+GREETER CONNECT-TO-DAEMON
+GREETER CONNECTED-TO-DAEMON
+
+# Login as alice, but let lightdm prompt for a username
+GREETER LOGIN
+GREETER SHOW-PROMPT TEXT="login:"
+GREETER PROVIDE-SECRET TEXT="alice"
+GREETER SHOW-PROMPT TEXT="Password:"
+GREETER PROVIDE-SECRET TEXT="password"
+GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
+
+# Greeter quits and session starts
+GREETER QUIT
+SESSION START USER=alice
+XSERVER :.* ACCEPT-CONNECT
+SESSION CONNECT-XSERVER
+
+# Cleanup
+*STOP-DAEMON
+# Don't know what order they will terminate
+(SESSION TERMINATE SIGNAL=15|XSERVER :.* TERMINATE SIGNAL=15)
+(SESSION TERMINATE SIGNAL=15|XSERVER :.* TERMINATE SIGNAL=15)
+RUNNER DAEMON-EXIT STATUS=0
index 4018972c3fada39bc383392f966c26530eb1687b..e470051de5ce08e761bc34bc0baf77abb59fda2a 100644 (file)
@@ -23,10 +23,15 @@ connected_cb (LdmGreeter *greeter)
             notify_status ("GREETER LOGIN-GUEST");
             ldm_greeter_login_as_guest (greeter);
         }
+        else if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL))
+        {
+            notify_status ("GREETER LOGIN");
+            ldm_greeter_login (greeter, NULL);
+        }
         else if (username)
         {
-          notify_status ("GREETER LOGIN USERNAME=%s", username);
-          ldm_greeter_login (greeter, username);
+            notify_status ("GREETER LOGIN USERNAME=%s", username);
+            ldm_greeter_login (greeter, username);
         }
 
         g_free (username);
@@ -48,16 +53,29 @@ show_error_cb (LdmGreeter *greeter, const gchar *text)
 static void
 show_prompt_cb (LdmGreeter *greeter, const gchar *text)
 {
-    gchar *password;
+    gchar *username, *password, *response = NULL;
 
     notify_status ("GREETER SHOW-PROMPT TEXT=\"%s\"", text);
 
+    username = g_key_file_get_string (config, "test-greeter-config", "username", NULL);
     password = g_key_file_get_string (config, "test-greeter-config", "password", NULL);
-    if (password)
+
+    if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL))
     {
-        notify_status ("GREETER PROVIDE-SECRET TEXT=\"%s\"", password);
-        ldm_greeter_provide_secret (greeter, password);
+        g_key_file_set_boolean (config, "test-greeter-config", "prompt-username", FALSE);
+        response = username;
     }
+    else if (password)
+        response = password;
+
+    if (response)
+    {
+        notify_status ("GREETER PROVIDE-SECRET TEXT=\"%s\"", response);
+        ldm_greeter_provide_secret (greeter, response);
+    }
+
+    g_free (username);
+    g_free (password);
 }
 
 static void
diff --git a/tests/test-login-gobject-manual b/tests/test-login-gobject-manual
new file mode 100755 (executable)
index 0000000..a33ce95
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/test-runner login-gobject-manual