]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Make SwitchToGuest work
authorRobert Ancell <robert.ancell@canonical.com>
Tue, 5 Jul 2011 02:24:30 +0000 (12:24 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Tue, 5 Jul 2011 02:24:30 +0000 (12:24 +1000)
src/display-manager.c
src/display-manager.h
src/display.c
src/lightdm.c
tests/scripts/switch-to-guest.conf [new file with mode: 0644]
tests/scripts/switch-to-guest.script [new file with mode: 0644]
tests/src/test-runner.c
tests/test-switch-to-guest [new file with mode: 0755]

index 918d6f41263cfdd94e9873c5cdc677b03295a81e..405bc5553e3faf45459cbd0e4130a69c8d054428 100644 (file)
@@ -400,10 +400,11 @@ add_display (DisplayManager *manager, XServer *xserver)
 }
 
 static gboolean
-switch_to_user (DisplayManager *manager, const gchar *username, gboolean start_new_greeter)
+switch_to_user (DisplayManager *manager, const gchar *username)
 {
     GList *link;
     Display *display;
+    XServer *xserver;
 
     for (link = manager->priv->displays; link; link = link->next)
     {
@@ -422,23 +423,21 @@ switch_to_user (DisplayManager *manager, const gchar *username, gboolean start_n
         }
     }
 
-    if (start_new_greeter)
-    {
-        XServer *xserver;
+    if (username)
+        g_debug ("Starting new display for user %s", username);
+    else
+        g_debug ("Starting new display for greeter");
 
-        if (username)
-            g_debug ("Starting new display for user %s", username);
-        else
-            g_debug ("Starting new display for greeter");
+    xserver = make_xserver (manager, NULL);
+    display = add_display (manager, xserver);
+    // FIXME: Add selected user hint
+    g_object_unref (xserver);
 
-        xserver = make_xserver (manager, NULL);
-        display = add_display (manager, xserver);
-        // FIXME: Add selected user hint
-        g_object_unref (xserver);
-        display_start (display);
+    /* Guest account should log in immediately */
+    if (username && g_strcmp0 (username, guest_account_get_username ()) == 0)
+        display_set_default_user (display, username);
 
-        return TRUE;
-    }
+    display_start (display);
 
     return FALSE;
 }
@@ -449,21 +448,21 @@ display_manager_show_greeter (DisplayManager *manager)
     g_return_if_fail (manager != NULL);
 
     g_debug ("Showing greeter");
-    switch_to_user (manager, NULL, TRUE);
+    switch_to_user (manager, NULL);
 }
 
 gboolean
-display_manager_switch_to_user (DisplayManager *manager, const gchar *username, gboolean start_greeter)
+display_manager_switch_to_user (DisplayManager *manager, const gchar *username)
 {
     g_return_val_if_fail (manager != NULL, FALSE);
     g_return_val_if_fail (username != NULL, FALSE);
 
     g_debug ("Switching to user %s", username);
-    return switch_to_user (manager, username, start_greeter);
+    return switch_to_user (manager, username);
 }
 
 gboolean
-display_manager_switch_to_guest (DisplayManager *manager, gboolean start_greeter)
+display_manager_switch_to_guest (DisplayManager *manager)
 {
     g_return_val_if_fail (manager != NULL, FALSE);
   
@@ -471,7 +470,7 @@ display_manager_switch_to_guest (DisplayManager *manager, gboolean start_greeter
         return FALSE;
 
     g_debug ("Switching to guest account");
-    return switch_to_user (manager, guest_account_get_username (), start_greeter);
+    return switch_to_user (manager, guest_account_get_username ());
 }
 
 static gboolean
index b2a8aa780262e7dcc178148417426398e0ed4bdc..e5c19bdbd1ad8b8026f892bbb7bba9dbd23495f6 100644 (file)
@@ -43,9 +43,9 @@ DisplayManager *display_manager_new (void);
 
 void display_manager_show_greeter (DisplayManager *manager);
 
-gboolean display_manager_switch_to_user (DisplayManager *manager, const gchar *username, gboolean start_greeter);
+gboolean display_manager_switch_to_user (DisplayManager *manager, const gchar *username);
 
-gboolean display_manager_switch_to_guest (DisplayManager *manager, gboolean start_greeter);
+gboolean display_manager_switch_to_guest (DisplayManager *manager);
 
 void display_manager_start (DisplayManager *manager);
 
index fc2b22da4adfbe7d103937a216cdd05ea239fed0..fac0b8960232cf8b4b6eb4de95a84c833f0c2ebf 100644 (file)
@@ -506,7 +506,7 @@ really_start_user_session (Display *display)
 
     result = session_start (display->priv->user_session, FALSE);
 
-    /* If a guest account, remove the account on exit */
+    /* Create guest account */
     if (result && g_strcmp0 (user_get_name (session_get_user (display->priv->user_session)), guest_account_get_username ()) == 0)
         guest_account_ref ();
 
@@ -645,6 +645,10 @@ default_session_authentication_result_cb (PAMSession *session, int result, Displ
 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);
index f0db2704a1949a9783da0390fcedc93bed7bf6c7..457396d7edcc4d3745040ee55d4a32e5c96644c2 100644 (file)
@@ -144,7 +144,7 @@ handle_display_manager_call (GDBusConnection       *connection,
             return;
 
         g_variant_get (parameters, "(s)", &username);
-        display_manager_switch_to_user (display_manager, username, TRUE);
+        display_manager_switch_to_user (display_manager, username);
         g_dbus_method_invocation_return_value (invocation, NULL);
         g_free (username);
     }
@@ -153,7 +153,7 @@ handle_display_manager_call (GDBusConnection       *connection,
         if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()")))
             return;
 
-        display_manager_switch_to_guest (display_manager, TRUE);
+        display_manager_switch_to_guest (display_manager);
         g_dbus_method_invocation_return_value (invocation, NULL);
     }
 }
diff --git a/tests/scripts/switch-to-guest.conf b/tests/scripts/switch-to-guest.conf
new file mode 100644 (file)
index 0000000..0fe0d25
--- /dev/null
@@ -0,0 +1,9 @@
+[LightDM]
+
+[GuestAccount]
+enabled=true
+setup-script=test-setup-guest
+cleanup-script=test-cleanup-guest
+
+[test-greeter-config]
+login-guest=true
diff --git a/tests/scripts/switch-to-guest.script b/tests/scripts/switch-to-guest.script
new file mode 100644 (file)
index 0000000..d3d8be7
--- /dev/null
@@ -0,0 +1,45 @@
+RUNNER DAEMON-START
+*WAIT
+
+# Switch to guest, should automatically log in
+*SWITCH-TO-GUEST
+RUNNER SWITCH-TO-GUEST
+XSERVER :.* START
+XSERVER :.* INDICATE-READY
+XSERVER :.* ACCEPT-CONNECT
+SESSION START USER=guest
+XSERVER :.* ACCEPT-CONNECT
+SESSION CONNECT-XSERVER
+
+# Switch again, should not do anything as guest already running
+*SWITCH-TO-GUEST
+RUNNER SWITCH-TO-GUEST
+*WAIT
+
+# Show a new greeter
+*SHOW-GREETER
+RUNNER SHOW-GREETER
+XSERVER :.* START
+XSERVER :.* INDICATE-READY
+XSERVER :.* ACCEPT-CONNECT
+GREETER START
+XSERVER :.* ACCEPT-CONNECT
+GREETER CONNECT-XSERVER :.*
+GREETER CONNECT-TO-DAEMON
+GREETER CONNECTED-TO-DAEMON
+
+# Log in as guest
+GREETER LOGIN-GUEST
+GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
+
+# New display should quit, and first session should be actived
+(GREETER TERMINATE SIGNAL=15|XSERVER :.* TERMINATE SIGNAL=15)
+(GREETER TERMINATE SIGNAL=15|XSERVER :.* TERMINATE SIGNAL=15)
+*WAIT
+
+# 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 f85f45a2efe95031a51e58ed192838f86945b149..69597d73806356fea11c85e4b0d1e7afe4533ccb 100644 (file)
@@ -193,6 +193,21 @@ run_commands ()
             check_status (status_text);
             g_free (status_text);
         }
+        else if (strcmp (name, "SWITCH-TO-GUEST") == 0)
+        {
+            g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
+                                         "org.freedesktop.DisplayManager",
+                                         "/org/freedesktop/DisplayManager",                                         
+                                         "org.freedesktop.DisplayManager",
+                                         "SwitchToGuest",
+                                         g_variant_new ("()"),
+                                         G_VARIANT_TYPE ("()"),
+                                         G_DBUS_CALL_FLAGS_NONE,
+                                         1000,
+                                         NULL,
+                                         NULL);
+            check_status ("RUNNER SWITCH-TO-GUEST");
+        }
         else if (strcmp (name, "STOP-DAEMON") == 0)
         {
             expect_exit = TRUE;
diff --git a/tests/test-switch-to-guest b/tests/test-switch-to-guest
new file mode 100755 (executable)
index 0000000..ba52aa9
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/test-runner switch-to-guest