]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Remove the ill-thought-out select-user and select-guest signals. Get the greeter...
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 15 Jul 2011 01:57:05 +0000 (11:57 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 15 Jul 2011 01:57:05 +0000 (11:57 +1000)
19 files changed:
NEWS
doc/tmpl/greeter.sgml
greeters/gtk/lightdm-example-gtk-greeter.c
liblightdm-gobject/greeter-protocol.h
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/greeter.cpp
liblightdm-qt/QLightDM/greeter.h
src/display-manager.c
src/display.c
src/display.h
src/greeter-protocol.h
src/greeter.c
src/greeter.h
src/ldm-marshal.list
src/pam-session.c
tests/scripts/switch-to-guest.script
tests/scripts/switch-to-user.script
tests/src/test-gobject-greeter.c

diff --git a/NEWS b/NEWS
index b646dba83cb37a4d23e18e791f75a0bb78686e34..685ad10b41589cb808dfb8aea18515ab0bdbad52 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,8 +10,6 @@ Overview of changes in lightdm 0.4.4
     * Enironment is no longer passed through to X servers and sessions, this is
       no longer required now PAM works correctly.
     * liblightdm API changes:
-      - Added two signals: select-user and select-guest.  This requires the
-        greeter to select a user account for logging in.
       - Drop ldm_greeter_get_is_first() - it was added for testing and doesn't
         work well.
     * Fix more errors where authentication messages from previous sessions could
index 3428762aaa220d9561eec30f1c28e8269006654e..63333fdb44acb69b09be3fe92dd0890690b3dc72 100644 (file)
@@ -101,21 +101,6 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
 
 @ldmgreeter: the object which received the signal.
 
-<!-- ##### SIGNAL LdmGreeter::select-guest ##### -->
-<para>
-
-</para>
-
-@ldmgreeter: the object which received the signal.
-
-<!-- ##### SIGNAL LdmGreeter::select-user ##### -->
-<para>
-
-</para>
-
-@ldmgreeter: the object which received the signal.
-@arg1: 
-
 <!-- ##### SIGNAL LdmGreeter::show-message ##### -->
 <para>
 
index 50882c392d88c546f2e74c1dc00a156a5ce99b13..322fb0d3043571ac062cbf32e98455f0e5779b0f 100644 (file)
@@ -365,18 +365,6 @@ user_removed_cb (LdmGreeter *greeter, LdmUser *user)
     gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
 }
 
-static void
-select_user_cb (LdmGreeter *greeter, const gchar *username)
-{
-    // FIXME
-}
-
-static void
-select_guest_cb (LdmGreeter *greeter)
-{
-    // FIXME
-}
-
 static void
 quit_cb (LdmGreeter *greeter, const gchar *username)
 {
@@ -433,7 +421,7 @@ draw_background_cb (GtkWidget *widget, GdkEventExpose *event)
 }
 
 static void
-connect_cb (LdmGreeter *greeter)
+connected_cb (LdmGreeter *greeter)
 {
     GdkWindow *root;
     GdkDisplay *display;
@@ -578,6 +566,8 @@ connect_cb (LdmGreeter *greeter)
                         1, "Other...",
                         2, gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), "stock_person", 64, 0, NULL),
                         -1);
+  
+    // FIXME: Select the requested user if ldm_greeter_get_timed_login_user () && ldm_greeter_get_timed_login_delay () == 0
 
     renderer = gtk_cell_renderer_text_new();
     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
@@ -614,7 +604,7 @@ main(int argc, char **argv)
     g_type_init ();
 
     greeter = ldm_greeter_new ();
-    g_signal_connect (G_OBJECT (greeter), "connected", G_CALLBACK (connect_cb), NULL);    
+    g_signal_connect (G_OBJECT (greeter), "connected", G_CALLBACK (connected_cb), NULL);
     g_signal_connect (G_OBJECT (greeter), "show-prompt", G_CALLBACK (show_prompt_cb), NULL);  
     g_signal_connect (G_OBJECT (greeter), "show-message", G_CALLBACK (show_message_cb), NULL);
     g_signal_connect (G_OBJECT (greeter), "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
@@ -622,8 +612,6 @@ main(int argc, char **argv)
     g_signal_connect (G_OBJECT (greeter), "user-added", G_CALLBACK (user_added_cb), NULL);
     g_signal_connect (G_OBJECT (greeter), "user-changed", G_CALLBACK (user_changed_cb), NULL);
     g_signal_connect (G_OBJECT (greeter), "user-removed", G_CALLBACK (user_removed_cb), NULL);
-    g_signal_connect (G_OBJECT (greeter), "select-user", G_CALLBACK (select_user_cb), NULL);
-    g_signal_connect (G_OBJECT (greeter), "select-guest", G_CALLBACK (select_guest_cb), NULL);
     g_signal_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL);
     ldm_greeter_connect_to_server (greeter);
 
index bccce50087004cbd6ecb00531a08d34e92ced0c5..f4931f7f9302edfc2740e2127c9a79de764fd70e 100644 (file)
@@ -26,9 +26,7 @@ typedef enum
     GREETER_MESSAGE_CONNECTED               = 101,
     GREETER_MESSAGE_QUIT                    = 102,
     GREETER_MESSAGE_PROMPT_AUTHENTICATION   = 103,
-    GREETER_MESSAGE_END_AUTHENTICATION      = 104,
-    GREETER_MESSAGE_SELECT_USER             = 107,
-    GREETER_MESSAGE_SELECT_GUEST            = 108
+    GREETER_MESSAGE_END_AUTHENTICATION      = 104
 } GreeterMessage;
 
 #endif /* _GREETER_PROTOCOL_H_ */
index 87e7bc64e6a95dfe3a627e33b567017ae52ca7a8..669af86f33582cf2a8a8ed61c03a9b8665e49440 100644 (file)
@@ -50,8 +50,6 @@ enum {
     SHOW_MESSAGE,
     AUTHENTICATION_COMPLETE,
     TIMED_LOGIN,
-    SELECT_USER,
-    SELECT_GUEST,
     USER_ADDED,
     USER_CHANGED,
     USER_REMOVED,
@@ -110,7 +108,7 @@ struct _LdmGreeterPrivate
     guint32 authenticate_sequence_number;
     gboolean cancelling_authentication;
 
-    gchar *timed_user;
+    gchar *selected_user;
     gint login_delay;
     guint login_timeout;
     gboolean guest_account_supported;
@@ -140,7 +138,7 @@ timed_login_cb (gpointer data)
     LdmGreeter *greeter = data;
 
     greeter->priv->login_timeout = 0;
-    g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->timed_user);
+    g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->selected_user);
 
     return FALSE;
 }
@@ -245,43 +243,28 @@ handle_connected (LdmGreeter *greeter, gsize *offset)
 {
     greeter->priv->theme = read_string (greeter, offset);
     greeter->priv->default_session = read_string (greeter, offset);
-    greeter->priv->timed_user = read_string (greeter, offset);
+    greeter->priv->selected_user = read_string (greeter, offset);
     greeter->priv->login_delay = read_int (greeter, offset);
     greeter->priv->guest_account_supported = read_int (greeter, offset) != 0;
 
     g_debug ("Connected theme=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
              greeter->priv->theme,
              greeter->priv->default_session,
-             greeter->priv->timed_user, greeter->priv->login_delay,
+             greeter->priv->selected_user, greeter->priv->login_delay,
              greeter->priv->guest_account_supported ? "true" : "false");
 
+    if (greeter->priv->selected_user[0] == '\0')
+        greeter->priv->selected_user = NULL;
+
     /* Set timeout for default login */
-    if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
+    if (greeter->priv->selected_user && greeter->priv->login_delay > 0)
     {
-        g_debug ("Logging in as %s in %d seconds", greeter->priv->timed_user, greeter->priv->login_delay);
+        g_debug ("Logging in as %s in %d seconds", greeter->priv->selected_user, greeter->priv->login_delay);
         greeter->priv->login_timeout = g_timeout_add (greeter->priv->login_delay * 1000, timed_login_cb, greeter);
     }
     g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0);
 }
 
-static void
-handle_select_user (LdmGreeter *greeter, gsize *offset)
-{
-    gchar *username;
-
-    username = read_string (greeter, offset);
-    g_debug ("Got request to select user %s", username);
-    g_signal_emit (G_OBJECT (greeter), signals[SELECT_USER], 0, username);
-    g_free (username);
-}
-
-static void
-handle_select_guest (LdmGreeter *greeter, gsize *offset)
-{
-    g_debug ("Got request to select guest account");
-    g_signal_emit (G_OBJECT (greeter), signals[SELECT_GUEST], 0);
-}
-
 static void
 handle_prompt_authentication (LdmGreeter *greeter, gsize *offset)
 {
@@ -429,12 +412,6 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     case GREETER_MESSAGE_CONNECTED:
         handle_connected (greeter, &offset);
         break;
-    case GREETER_MESSAGE_SELECT_USER:
-        handle_select_user (greeter, &offset);
-        break;
-    case GREETER_MESSAGE_SELECT_GUEST:
-        handle_select_guest (greeter, &offset);
-        break;
     case GREETER_MESSAGE_PROMPT_AUTHENTICATION:
         handle_prompt_authentication (greeter, &offset);
         break;
@@ -1283,7 +1260,7 @@ const gchar *
 ldm_greeter_get_timed_login_user (LdmGreeter *greeter)
 {
     g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL);
-    return greeter->priv->timed_user;
+    return greeter->priv->selected_user;
 }
 
 /**
@@ -2050,37 +2027,6 @@ ldm_greeter_class_init (LdmGreeterClass *klass)
                       g_cclosure_marshal_VOID__STRING,
                       G_TYPE_NONE, 1, G_TYPE_STRING);
 
-    /**
-     * LdmGreeter::select-user:
-     * @greeter: A #LdmGreeter
-     * @username: A username
-     *
-     * The ::select-user signal gets emitted when the daemon request the greeter to select a user to log in as.
-     **/
-    signals[SELECT_USER] =
-        g_signal_new ("select-user",
-                      G_TYPE_FROM_CLASS (klass),
-                      G_SIGNAL_RUN_LAST,
-                      G_STRUCT_OFFSET (LdmGreeterClass, select_user),
-                      NULL, NULL,
-                      g_cclosure_marshal_VOID__STRING,
-                      G_TYPE_NONE, 1, G_TYPE_STRING);
-
-    /**
-     * LdmGreeter::select-guest:
-     * @greeter: A #LdmGreeter
-     *
-     * The ::select-guest signal gets emitted when the deamon requests the greeter to select the guest account.
-     **/
-    signals[SELECT_GUEST] =
-        g_signal_new ("select-guest",
-                      G_TYPE_FROM_CLASS (klass),
-                      G_SIGNAL_RUN_LAST,
-                      G_STRUCT_OFFSET (LdmGreeterClass, select_guest),
-                      NULL, NULL,
-                      g_cclosure_marshal_VOID__VOID,
-                      G_TYPE_NONE, 0);
-
     /**
      * LdmGreeter::user-added:
      * @greeter: A #LdmGreeter
index fd231872b622b14b3e7d8142b0c37534c89d3e50..c10c4a84b130ed7a6b7144cf1d4e04f6896ad95c 100644 (file)
@@ -60,8 +60,6 @@ struct _LdmGreeterClass
     void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type);
     void (*authentication_complete)(LdmGreeter *greeter);
     void (*timed_login)(LdmGreeter *greeter, const gchar *username);
-    void (*select_user)(LdmGreeter *greeter, const gchar *username);
-    void (*select_guest)(LdmGreeter *greeter);
     void (*user_added)(LdmGreeter *greeter, LdmUser *user);
     void (*user_changed)(LdmGreeter *greeter, LdmUser *user);
     void (*user_removed)(LdmGreeter *greeter, LdmUser *user);
index 92e58b22fa95408d90a86b65c6e67fddff0f405d..1d4916a3e176f81fb4ca16b223c18d6f13b82640 100644 (file)
@@ -44,9 +44,7 @@ typedef enum
     GREETER_MESSAGE_CONNECTED               = 101,
     GREETER_MESSAGE_QUIT                    = 102,
     GREETER_MESSAGE_PROMPT_AUTHENTICATION   = 103,
-    GREETER_MESSAGE_END_AUTHENTICATION      = 104,
-    GREETER_MESSAGE_SELECT_USER             = 107,
-    GREETER_MESSAGE_SELECT_GUEST            = 108
+    GREETER_MESSAGE_END_AUTHENTICATION      = 104
 } GreeterMessage;
 
 #define HEADER_SIZE 8
@@ -398,15 +396,6 @@ void Greeter::onRead(int fd)
         else
             qDebug () << "Ignoring end authentication with invalid sequence number " << sequenceNumber;
         break;
-    case GREETER_MESSAGE_SELECT_USER:
-        username = readString(&offset);
-        qDebug() << "Got request to select user " << username;
-        emit selectUser(username);
-        break;
-    case GREETER_MESSAGE_SELECT_GUEST:
-        qDebug() << "Got request to select guest account";
-        emit selectGuest();
-        break;
     default:
         qDebug() << "Unknown message from server: " << id;
     }
index efa6839d3f833ae460a3580a1e7b6d7c33ce8157..90fbe897c1c402bf5456bb324ce2fd2517ac6d9b 100644 (file)
@@ -90,8 +90,6 @@ namespace QLightDM
        void showError(QString message);
        void authenticationComplete(bool isAuthenticated);
        void timedLogin(QString username);
-       void selectUser(QString username);
-       void selectGuest();
        void quit();
     
     private slots:  
index 042ed01345cd1e9462d12aa71708ed866edfc44e..7f2f1c6487821eb4de1e81e7280fc6ca7e6402e9 100644 (file)
@@ -392,21 +392,21 @@ add_display (DisplayManager *manager, XServer *xserver)
 }
 
 static gboolean
-switch_to_user (DisplayManager *manager, const gchar *username)
+switch_to_user (DisplayManager *manager, const gchar *username, gboolean is_guest)
 {
     GList *link;
-    Display *greeter_display = NULL;
+    Display *display = NULL;
     XServer *xserver;
 
     /* Switch to active display if it exists */
     for (link = manager->priv->displays; link; link = link->next)
     {
-        Display *display = link->data;
+        display = link->data;
  
-        /* If running a greeter can't use this one */
+        /* Shouldn't be any other greeters running, close them if so */
         if (display_get_greeter (display))
         {
-            greeter_display = display;
+            display_stop (display);
             continue;
         }
 
@@ -418,25 +418,16 @@ switch_to_user (DisplayManager *manager, const gchar *username)
         }
     }
 
-    /* If there is an existing greeter then switch to that */
-    if (greeter_display)
-    {
-        g_debug ("Switching to greeter session on display %s", xserver_get_address (display_get_xserver (greeter_display)));
-        if (strcmp (username, guest_account_get_username ()) == 0)
-            greeter_select_guest (display_get_greeter (greeter_display));
-        else
-            greeter_select_user (display_get_greeter (greeter_display), username);
-        display_show (greeter_display);
-        return TRUE;
-    }
-
     g_debug ("Starting new display to switch user");
-
+  
     xserver = make_xserver (manager, NULL);
-    greeter_display = add_display (manager, xserver);
-    // FIXME: Add selected user hint
+    display = add_display (manager, xserver);
+    if (is_guest)
+        display_set_default_user (display, NULL, TRUE, FALSE, 0);
+    else if (username)
+        display_set_default_user (display, username, FALSE, TRUE, 0);    
     g_object_unref (xserver);
-    display_start (greeter_display);
+    display_start (display);
 
     return FALSE;
 }
@@ -447,7 +438,7 @@ display_manager_show_greeter (DisplayManager *manager)
     g_return_if_fail (manager != NULL);
 
     g_debug ("Showing greeter");
-    switch_to_user (manager, NULL);
+    switch_to_user (manager, NULL, FALSE);
 }
 
 gboolean
@@ -457,7 +448,7 @@ display_manager_switch_to_user (DisplayManager *manager, const gchar *username)
     g_return_val_if_fail (username != NULL, FALSE);
 
     g_debug ("Switching to user %s", username);
-    return switch_to_user (manager, username);
+    return switch_to_user (manager, username, FALSE);
 }
 
 gboolean
@@ -469,7 +460,7 @@ display_manager_switch_to_guest (DisplayManager *manager)
         return FALSE;
 
     g_debug ("Switching to guest account");
-    return switch_to_user (manager, guest_account_get_username ());
+    return switch_to_user (manager, guest_account_get_username (), TRUE);
 }
 
 static gboolean
@@ -698,14 +689,7 @@ display_manager_start (DisplayManager *manager)
             user_timeout = 0;
 
         if (default_user)
-        {
-            display_set_default_user (display, default_user);
-            display_set_default_user_timeout (display, user_timeout);
-            if (user_timeout == 0)
-                g_debug ("Starting session for user %s", default_user);
-            else
-                g_debug ("Starting session for user %s in %d seconds", default_user, user_timeout);
-        }
+            display_set_default_user (display, default_user, FALSE, FALSE, user_timeout);
 
         /* Stop Plymouth when the X server starts/fails */
         if (replaces_plymouth)
index 8ffb84855df27368c069fae3a4a671408a73a8e0..34aa886eb2916bb6e886ad8d5d3171f0c6dd82b0 100644 (file)
@@ -54,9 +54,6 @@ struct DisplayPrivate
     /* X server */
     XServer *xserver;
 
-    /* Number of times have logged in */
-    gint login_count;
-
     /* User to run greeter as */
     gchar *greeter_user;
 
@@ -82,13 +79,16 @@ struct DisplayPrivate
 
     /* User session process */
     Session *user_session;
+    gboolean using_guest_account;
     guint user_session_timer;
     PAMSession *user_pam_session;
     gchar *user_ck_cookie;
 
-    /* Default login hint */
+    /* User that should be automatically logged in */
     gchar *default_user;
-    gint timeout;
+    gboolean default_user_is_guest;
+    gboolean default_user_requires_password;
+    gint default_user_timeout;
 
     /* Default session */
     gchar *default_session;
@@ -146,12 +146,14 @@ display_get_session_wrapper (Display *display)
 }
 
 void
-display_set_default_user (Display *display, const gchar *username)
+display_set_default_user (Display *display, const gchar *username, gboolean is_guest, gboolean requires_password, gint timeout)
 {
     g_return_if_fail (display != NULL);
-
     g_free (display->priv->default_user);
     display->priv->default_user = g_strdup (username);
+    display->priv->default_user_is_guest = is_guest;
+    display->priv->default_user_requires_password = requires_password;
+    display->priv->default_user_timeout = timeout;
 }
 
 const gchar *
@@ -161,18 +163,18 @@ display_get_default_user (Display *display)
     return display->priv->default_user;
 }
 
-void
-display_set_default_user_timeout (Display *display, gint timeout)
+gboolean
+display_get_default_user_requires_password (Display *display)
 {
-    g_return_if_fail (display != NULL);
-    display->priv->timeout = timeout;  
+    g_return_val_if_fail (display != NULL, FALSE);
+    return display->priv->default_user_requires_password;
 }
 
 gint
 display_get_default_user_timeout (Display *display)
 {
     g_return_val_if_fail (display != NULL, 0);
-    return display->priv->timeout;
+    return display->priv->default_user_timeout;
 }
 
 void
@@ -428,7 +430,7 @@ user_session_stopped_cb (Session *session, Display *display)
     g_signal_handlers_disconnect_matched (display->priv->user_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
 
     /* If a guest account, remove the account on exit */
-    if (g_strcmp0 (user_get_name (session_get_user (session)), guest_account_get_username ()) == 0)
+    if (display->priv->using_guest_account)
         guest_account_unref ();
 
     g_object_unref (display->priv->user_session);
@@ -511,7 +513,7 @@ really_start_user_session (Display *display)
     result = session_start (display->priv->user_session, FALSE);
 
     /* Create guest account */
-    if (result && g_strcmp0 (user_get_name (session_get_user (display->priv->user_session)), guest_account_get_username ()) == 0)
+    if (result && display->priv->using_guest_account)
         guest_account_ref ();
 
     return result;
@@ -531,7 +533,11 @@ start_user_session (Display *display, const gchar *session)
     run_script ("PreSession");
 
     g_debug ("Preparing '%s' session for user %s", session, pam_session_get_username (display->priv->user_pam_session));
-    display->priv->login_count++;
+
+    /* Once logged in, don't autologin again */
+    g_free (display->priv->default_user);
+    display->priv->default_user = NULL;
+    display->priv->default_user_is_guest = FALSE;
 
     /* Load the users login settings (~/.dmrc) */
     dmrc_file = dmrc_load (pam_session_get_username (display->priv->user_pam_session));
@@ -622,13 +628,6 @@ start_user_session (Display *display, const gchar *session)
     return result;
 }
 
-static void
-default_session_pam_message_cb (PAMSession *session, int num_msg, const struct pam_message **msg, Display *display)
-{
-    g_debug ("Aborting automatic login, PAM requests input");
-    pam_session_cancel (session);
-}
-
 static gboolean
 activate_user (Display *display, const gchar *username)
 {
@@ -640,7 +639,26 @@ activate_user (Display *display, const gchar *username)
 }
 
 static void
-default_session_authentication_result_cb (PAMSession *session, int result, Display *display)
+start_greeter_for_autologin (Display *display)
+{
+    /* Cancel attempt at autologin */
+    pam_session_cancel (display->priv->user_pam_session);
+    g_object_unref (display->priv->user_pam_session);
+    display->priv->user_pam_session = NULL;
+
+    /* Start greeter and select user that failed */
+    start_greeter (display);
+}
+
+static void
+autologin_pam_message_cb (PAMSession *session, int num_msg, const struct pam_message **msg, Display *display)
+{
+    g_debug ("Aborting automatic login and starting greeter, PAM requests input");
+    start_greeter_for_autologin (display);
+}
+
+static void
+autologin_authentication_result_cb (PAMSession *session, int result, Display *display)
 {
     if (result == PAM_SUCCESS)
     {
@@ -653,31 +671,9 @@ default_session_authentication_result_cb (PAMSession *session, int result, Displ
         start_user_session (display, display->priv->default_session);
     }
     else
-    {
-        g_debug ("Failed to authorize default user, starting greeter");
-        start_greeter (display);
-    }
+        start_greeter_for_autologin (display);
 }
   
-static gboolean
-start_autologin_session (Display *display, GError **error)
-{
-    /* Open guest account if necessary */
-    if (g_strcmp0 (display->priv->default_user, guest_account_get_username ()) == 0)
-        guest_account_ref ();
-  
-    /* Run using autologin PAM session, abort if get asked any questions */
-    if (display->priv->user_pam_session)
-        pam_session_end (display->priv->user_pam_session);
-    display->priv->user_pam_session = pam_session_new (display->priv->pam_autologin_service, display->priv->default_user);
-    g_signal_connect (display->priv->user_pam_session, "got-messages", G_CALLBACK (default_session_pam_message_cb), display);
-    g_signal_connect (display->priv->user_pam_session, "authentication-result", G_CALLBACK (default_session_authentication_result_cb), display);
-    if (!pam_session_start (display->priv->user_pam_session, error))
-        return FALSE;
-
-    return TRUE;
-}
-
 static gboolean
 session_timeout_cb (Display *display)
 {
@@ -691,7 +687,7 @@ session_timeout_cb (Display *display)
 }
 
 static void
-greeter_start_session_cb (Greeter *greeter, const gchar *session, Display *display)
+greeter_start_session_cb (Greeter *greeter, const gchar *session, gboolean is_guest, Display *display)
 {
     /* Default session requested */
     if (strcmp (session, "") == 0)
@@ -785,7 +781,10 @@ start_greeter (Display *display)
     display->priv->greeter_ck_cookie = start_ck_session (display, "LoginWindow", user);
 
     display->priv->greeter_session = greeter_new (display->priv->greeter_theme);
-    greeter_set_default_user (display->priv->greeter_session, display->priv->default_user, display->priv->timeout);
+    if (display->priv->default_user)
+        greeter_set_selected_user (display->priv->greeter_session, display->priv->default_user, display->priv->default_user_timeout);
+    else if (display->priv->default_user_is_guest)
+        greeter_set_selected_user (display->priv->greeter_session, guest_account_get_username (), 0);
     greeter_set_default_session (display->priv->greeter_session, display->priv->default_session);
     g_signal_connect (G_OBJECT (display->priv->greeter_session), "start-session", G_CALLBACK (greeter_start_session_cb), display);
     g_signal_connect (G_OBJECT (display->priv->greeter_session), "stopped", G_CALLBACK (greeter_stopped_cb), display);
@@ -855,6 +854,8 @@ xserver_stopped_cb (XServer *server, Display *display)
 static void
 xserver_ready_cb (XServer *xserver, Display *display)
 {
+    const gchar *autologin_user = NULL;
+
     run_script ("Init"); // FIXME: Async
 
     /* Don't run any sessions on local terminals */
@@ -862,18 +863,35 @@ xserver_ready_cb (XServer *xserver, Display *display)
         return;
 
     /* If have user then automatically login the first time */
-    if (display->priv->default_user && display->priv->timeout == 0 && display->priv->login_count == 0)
+    if (display->priv->default_user_is_guest)
+    {
+        autologin_user = guest_account_get_username ();
+        guest_account_ref ();
+    }
+    else if (display->priv->default_user)
+        autologin_user = display->priv->default_user;
+
+    if (autologin_user)
     {
         GError *error = NULL;
-        gboolean result;
+        gchar *pam_service;
+        /* Run using autologin PAM session, abort if get asked any questions */      
+        g_debug ("Automatically logging in user %s", autologin_user);
 
-        g_debug ("Automatically logging in user %s", display->priv->default_user);
-        result = start_autologin_session (display, &error);
-        if (!result)
-            g_warning ("Failed to autologin user %s, starting greeter instead: %s", display->priv->default_user, error->message);
-        g_clear_error (&error);
-        if (result)
+        if (display->priv->default_user_requires_password)
+            pam_service = display->priv->pam_service;
+        else
+            pam_service = display->priv->pam_autologin_service;
+
+        display->priv->user_pam_session = pam_session_new (pam_service, autologin_user);
+        g_signal_connect (display->priv->user_pam_session, "got-messages", G_CALLBACK (autologin_pam_message_cb), display);
+        g_signal_connect (display->priv->user_pam_session, "authentication-result", G_CALLBACK (autologin_authentication_result_cb), display);
+        if (pam_session_start (display->priv->user_pam_session, &error))
             return;
+        else
+            g_warning ("Failed to autologin user %s, starting greeter instead: %s", autologin_user, error->message);
+        g_clear_error (&error);
     }
 
     start_greeter (display);
index 664d18ee03bccd3dd81e69a03b165272a2827af5..01b91a396c0a11fe9f9fec6dd9848841e855a2ac 100644 (file)
@@ -56,11 +56,11 @@ void display_set_session_wrapper (Display *display, const gchar *session_wrapper
 
 const gchar *display_get_session_wrapper (Display *display);
 
-void display_set_default_user (Display *display, const gchar *username);
+void display_set_default_user (Display *display, const gchar *username, gboolean is_guest, gboolean requires_password, gint timeout);
 
 const gchar *display_get_default_user (Display *display);
 
-void display_set_default_user_timeout (Display *display, gint timeout);
+gboolean display_get_default_user_requires_password (Display *display);
 
 gint display_get_default_user_timeout (Display *display);
 
index bccce50087004cbd6ecb00531a08d34e92ced0c5..f4931f7f9302edfc2740e2127c9a79de764fd70e 100644 (file)
@@ -26,9 +26,7 @@ typedef enum
     GREETER_MESSAGE_CONNECTED               = 101,
     GREETER_MESSAGE_QUIT                    = 102,
     GREETER_MESSAGE_PROMPT_AUTHENTICATION   = 103,
-    GREETER_MESSAGE_END_AUTHENTICATION      = 104,
-    GREETER_MESSAGE_SELECT_USER             = 107,
-    GREETER_MESSAGE_SELECT_GUEST            = 108
+    GREETER_MESSAGE_END_AUTHENTICATION      = 104
 } GreeterMessage;
 
 #endif /* _GREETER_PROTOCOL_H_ */
index b001473288a8393822c362580997babeb3384c54..48ccf2577a0a330a672234a6f726c1246da13642 100644 (file)
@@ -45,8 +45,8 @@ struct GreeterPrivate
     /* Default session to use */   
     gchar *default_session;
 
-    /* Default user to log in as, or NULL for no default */
-    gchar *default_user;
+    /* Hint for user to select */
+    gchar *selected_user;
 
     /* Time in seconds to wait until logging in as default user */
     gint autologin_timeout;
@@ -77,12 +77,12 @@ greeter_new (const gchar *theme)
 }
 
 void
-greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout)
+greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout)
 {
     g_return_if_fail (greeter != NULL);
 
-    g_free (greeter->priv->default_user);
-    greeter->priv->default_user = g_strdup (username);
+    g_free (greeter->priv->selected_user);
+    greeter->priv->selected_user = g_strdup (username);
     greeter->priv->autologin_timeout = timeout;
 }
 
@@ -151,12 +151,20 @@ 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;
+  
+    if (value)
+        length = strlen (value);
+    else
+        length = 0;
     write_int (buffer, buffer_length, length, offset);
     if (*offset + length >= buffer_length)
         return;
-    memcpy (buffer + *offset, value, length);
-    *offset += length;
+    if (length > 0)
+    {
+        memcpy (buffer + *offset, value, length);
+        *offset += length;
+    }
 }
 
 static void
@@ -169,7 +177,10 @@ write_header (guint8 *buffer, gint buffer_length, guint32 id, guint32 length, gs
 static guint32
 string_length (const gchar *value)
 {
-    return int_length () + strlen (value);
+    if (value == NULL)
+        return int_length ();
+    else
+        return int_length () + strlen (value);
 }
 
 static void
@@ -189,10 +200,10 @@ handle_connect (Greeter *greeter)
     theme = g_build_filename (theme_dir, greeter->priv->theme, "index.theme", NULL);
     g_free (theme_dir);
 
-    write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length (), &offset);
+    write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->default_session) + string_length (greeter->priv->selected_user) + int_length () + int_length (), &offset);
     write_string (message, MAX_MESSAGE_LENGTH, theme, &offset);
     write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_session, &offset);
-    write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_user ? greeter->priv->default_user : "", &offset);
+    write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->selected_user, &offset);
     write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->autologin_timeout, &offset);
     write_int (message, MAX_MESSAGE_LENGTH, guest_account_get_is_enabled (), &offset);
     write_message (greeter, message, offset);
@@ -394,27 +405,6 @@ handle_cancel_authentication (Greeter *greeter)
     pam_session_cancel (greeter->priv->pam_session);
 }
 
-void
-greeter_select_user (Greeter *greeter, const gchar *username)
-{
-    guint8 message[MAX_MESSAGE_LENGTH];
-    gsize offset = 0;
-
-    write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_USER, string_length (username), &offset);
-    write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
-    write_message (greeter, message, offset);
-}
-
-void
-greeter_select_guest (Greeter *greeter)
-{
-    guint8 message[MAX_MESSAGE_LENGTH];
-    gsize offset = 0;
-
-    write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_GUEST, 0, &offset);
-    write_message (greeter, message, offset);
-}
-
 static gboolean
 quit_greeter_cb (gpointer data)
 {
@@ -452,7 +442,7 @@ handle_start_session (Greeter *greeter, gchar *session)
 
     g_debug ("Greeter start session %s", session);
 
-    g_signal_emit (greeter, signals[START_SESSION], 0, session);
+    g_signal_emit (greeter, signals[START_SESSION], 0, session, greeter->priv->using_guest_account);
 }
 
 static guint32
@@ -638,7 +628,7 @@ greeter_finalize (GObject *object)
     g_free (self->priv->read_buffer);
     g_free (self->priv->theme);
     g_free (self->priv->default_session);
-    g_free (self->priv->default_user);
+    g_free (self->priv->selected_user);
     if (self->priv->using_guest_account)
         guest_account_unref ();
 
@@ -658,8 +648,8 @@ greeter_class_init (GreeterClass *klass)
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (GreeterClass, start_session),
                       NULL, NULL,
-                      g_cclosure_marshal_VOID__STRING,
-                      G_TYPE_NONE, 1, G_TYPE_STRING);
+                      ldm_marshal_VOID__STRING_BOOLEAN,
+                      G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN);
 
     g_type_class_add_private (klass, sizeof (GreeterPrivate));
 }
index 37d90a913941c7d9aaf58faafd42fd238a650797..81635313beda04ce64580683c60d545c861d0e11 100644 (file)
@@ -38,7 +38,7 @@ GType greeter_get_type (void);
 
 Greeter *greeter_new (const gchar *theme);
 
-void greeter_set_default_user (Greeter *greeter, const gchar *username, gint timeout);
+void greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout);
 
 const gchar *greeter_get_theme (Greeter *greeter);
 
@@ -48,10 +48,6 @@ const gchar *greeter_get_default_session (Greeter *greeter);
 
 PAMSession *greeter_get_pam_session (Greeter *greeter);
 
-void greeter_select_user (Greeter *greeter, const gchar *username);
-
-void greeter_select_guest (Greeter *greeter);
-
 void greeter_quit (Greeter *greeter);
 
 G_END_DECLS
index 0d097d13c2811d31a0c90ad79d9e3556afe9cb4d..97d62aee06f65c68e68b804029c8cc946cba8756 100644 (file)
@@ -2,3 +2,4 @@ BOOLEAN:OBJECT
 VOID:INT,POINTER
 VOID:OBJECT,BOOLEAN
 BOOLEAN:STRING
+VOID:STRING,BOOLEAN
index 33b1209075503e0081061f954c53c90e35548952..f73d009d65ea445ff93b0236bb4670ca40ce44b3 100644 (file)
@@ -404,9 +404,8 @@ pam_session_cancel (PAMSession *session)
     {
         g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_RESULT], 0, PAM_CONV_ERR);
     }
-    else
+    else if (session->priv->authentication_thread)
     {
-        g_return_if_fail (session->priv->authentication_thread != NULL);
         session->priv->cancel = TRUE;
         g_async_queue_push (session->priv->authentication_response_queue, GINT_TO_POINTER (-1));
     }
index c7db3949e440eb984160f86fac36ba6c37947087..f24a58f49d8fbe3d59e994238aebed89ba8d23d1 100644 (file)
@@ -21,14 +21,18 @@ GREETER CONNECTED-TO-DAEMON
 *SWITCH-TO-GUEST
 RUNNER SWITCH-TO-GUEST
 
-# Existing greeter does the action
-GREETER LOGIN-GUEST
-GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
+# Existing X server and greeter stops
+XSERVER :50 TERMINATE SIGNAL=15
+GREETER TERMINATE SIGNAL=15
 
-# Greeter quits, guest session starts
-GREETER QUIT
+# New X server starts
+XSERVER :51 START
+XSERVER :51 INDICATE-READY
+XSERVER :51 ACCEPT-CONNECT
+
+# Guest session starts
 SESSION START USER=guest
-XSERVER :50 ACCEPT-CONNECT
+XSERVER :51 ACCEPT-CONNECT
 SESSION CONNECT-XSERVER
 
 # Switch again, should not do anything as guest already running
@@ -39,6 +43,6 @@ RUNNER SWITCH-TO-GUEST
 # Cleanup
 *STOP-DAEMON
 # Don't know what order they will terminate
-(SESSION TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-(SESSION TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+(SESSION TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+(SESSION TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
 RUNNER DAEMON-EXIT STATUS=0
index 5602000f6191561469282b85694e0048a56cd18e..f2d926132a68a32a1ac93277ae5b62e0458bdbf3 100644 (file)
@@ -21,13 +21,29 @@ GREETER CONNECTED-TO-DAEMON
 *SWITCH-TO-USER USERNAME=alice
 RUNNER SWITCH-TO-USER USERNAME=alice
 
-# Existing greeter does the action
-GREETER LOGIN USERNAME=alice
+# Existing X server and greeter stops
+XSERVER :50 TERMINATE SIGNAL=15
+GREETER TERMINATE SIGNAL=15
+
+# New X server starts
+XSERVER :51 START
+XSERVER :51 INDICATE-READY
+XSERVER :51 ACCEPT-CONNECT
+
+# New greeter starts
+GREETER START
+XSERVER :51 ACCEPT-CONNECT
+GREETER CONNECT-XSERVER :51
+GREETER CONNECT-TO-DAEMON
+GREETER CONNECTED-TO-DAEMON
+
+# Alice is automatically selected
+GREETER LOGIN-SELECTED USERNAME=alice
 GREETER SHOW-PROMPT TEXT="Password:"
 
 # Cleanup
 *STOP-DAEMON
 # Don't know what order they will terminate
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+(GREETER TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
+(GREETER TERMINATE SIGNAL=15|XSERVER :51 TERMINATE SIGNAL=15)
 RUNNER DAEMON-EXIT STATUS=0
index 55ec03f79691a952ee7b46c197aff214a8233593..5afac623565adcaa0d52bb941e2b83b5e4ea34a8 100644 (file)
@@ -25,6 +25,14 @@ connected_cb (LdmGreeter *greeter)
         xcb_flush (connection);
     }
 
+    /* Automatically log in as requested user */
+    if (ldm_greeter_get_timed_login_user (greeter) && ldm_greeter_get_timed_login_delay (greeter) == 0)
+    {
+        notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_timed_login_user (greeter));
+        ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter));
+        return;
+    }
+
     login_lock = g_build_filename (g_getenv ("LIGHTDM_TEST_HOME_DIR"), ".greeter-logged-in", NULL);
     f = fopen (login_lock, "r");
     if (f == NULL)
@@ -105,20 +113,6 @@ authentication_complete_cb (LdmGreeter *greeter)
         ldm_greeter_start_default_session (greeter);
 }
 
-static void
-select_user_cb (LdmGreeter *greeter, const gchar *username)
-{
-    notify_status ("GREETER LOGIN USERNAME=%s", username);
-    ldm_greeter_login (greeter, username);
-}
-
-static void
-select_guest_cb (LdmGreeter *greeter)
-{
-    notify_status ("GREETER LOGIN-GUEST");
-    ldm_greeter_login_as_guest (greeter);
-}
-
 static void
 quit_cb (LdmGreeter *greeter)
 {
@@ -164,8 +158,6 @@ main (int argc, char **argv)
     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
-    g_signal_connect (greeter, "select-user", G_CALLBACK (select_user_cb), NULL);
-    g_signal_connect (greeter, "select-guest", G_CALLBACK (select_guest_cb), NULL);
     g_signal_connect (greeter, "quit", G_CALLBACK (quit_cb), NULL);
 
     notify_status ("GREETER CONNECT-TO-DAEMON");