]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Correctly implement and test autologin timeouts
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 20 Sep 2012 05:33:28 +0000 (17:33 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 20 Sep 2012 05:33:28 +0000 (17:33 +1200)
22 files changed:
NEWS
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/greeter.h
liblightdm-qt/greeter.cpp
src/display.c
src/greeter.c
src/greeter.h
src/seat.c
tests/Makefile.am
tests/scripts/autologin-guest-timeout.conf [new file with mode: 0644]
tests/scripts/autologin-timeout.conf [new file with mode: 0644]
tests/src/test-gobject-greeter.c
tests/src/test-python-greeter
tests/src/test-qt-greeter.cpp
tests/src/test-qt-greeter.h
tests/test-autologin-gobject-guest-timeout [new file with mode: 0755]
tests/test-autologin-gobject-timeout [new file with mode: 0755]
tests/test-autologin-python-guest-timeout [new file with mode: 0755]
tests/test-autologin-python-timeout [new file with mode: 0755]
tests/test-autologin-qt-guest-timeout [new file with mode: 0755]
tests/test-autologin-qt-timeout [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 1ad1f9a7867882f1d74d3b2e28d44a74361d0fca..9db0cfd1d907a85deb6e202e8955356aeea48053 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Overview of changes in lightdm 1.3.5
+
+    * Correctly implement and test autologin timeouts
+
 Overview of changes in lightdm 1.3.4
 
     * Correctly annotate enums in vapi file
index b6d1ba773580a1c3e02b655853c4b75c3c51a1a2..bfd887a913153635035570c3f09eb2264a0f5065 100644 (file)
@@ -832,6 +832,24 @@ lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter)
     write_message (greeter, message, offset);
 }
 
+/**
+ * lightdm_greeter_authenticate_autologin:
+ * @greeter: A #LightDMGreeter
+ *
+ * Starts the authentication procedure for the automatic login user.
+ **/
+void
+lightdm_greeter_authenticate_autologin (LightDMGreeter *greeter)
+{
+    const gchar *user;
+
+    user = lightdm_greeter_get_autologin_user_hint (greeter);
+    if (lightdm_greeter_get_autologin_guest_hint (greeter))
+        lightdm_greeter_authenticate_as_guest (greeter);
+    else if (user)
+        lightdm_greeter_authenticate (greeter, user);
+}
+
 /**
  * lightdm_greeter_authenticate_remote:
  * @greeter: A #LightDMGreeter
index cd26f772b7f8b9843a7c9efdd16b126a30b1c7fb..81f94a26075d58bef4eedf9818fe635f4c1d659c 100644 (file)
@@ -102,6 +102,8 @@ void lightdm_greeter_authenticate (LightDMGreeter *greeter, const gchar *usernam
 
 void lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter);
 
+void lightdm_greeter_authenticate_autologin (LightDMGreeter *greeter);
+
 void lightdm_greeter_authenticate_remote (LightDMGreeter *greeter, const gchar *session, const gchar *username);
 
 void lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response);
index 4c6799e07566cff6645ae745b31a873bb58a9ebe..f2ae12332e6765303aa511d5d814f2c3844df6cd 100644 (file)
@@ -72,6 +72,7 @@ public slots:
     bool connectSync();
     void authenticate(const QString &username=QString());
     void authenticateAsGuest();
+    void authenticateAutologin();
     void authenticateRemote(const QString &session=QString(), const QString &username=QString());
     void respond(const QString &response);
     void cancelAuthentication();
index 2df535b5211d9afd92779539585e47e784320bda..263da22943bac4378d62ec6b8d13bc4e6d54c556 100644 (file)
@@ -119,6 +119,12 @@ void Greeter::authenticateAsGuest()
     lightdm_greeter_authenticate_as_guest(d->ldmGreeter);
 }
 
+void Greeter::authenticateAutologin()
+{
+    Q_D(Greeter);
+    lightdm_greeter_authenticate_autologin(d->ldmGreeter);
+}
+
 void Greeter::authenticateRemote(const QString &session, const QString &username)
 {
     Q_D(Greeter);
index ec001530743f2ef81a77282a89ec9de8c668c805..75f8a069502122678fdf50877614491bd83f6b3a 100644 (file)
@@ -395,7 +395,7 @@ start_greeter (Display *display)
     g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (greeter_authentication_complete_cb), display);
 
     /* Make communication link to greeter that will run on this session */
-    display->priv->greeter = greeter_new (display->priv->session, USER_SERVICE);
+    display->priv->greeter = greeter_new (display->priv->session, USER_SERVICE, AUTOLOGIN_SERVICE);
     g_signal_connect (G_OBJECT (display->priv->greeter), "connected", G_CALLBACK (greeter_connected_cb), display);
     g_signal_connect (G_OBJECT (display->priv->greeter), "start-authentication", G_CALLBACK (greeter_start_authentication_cb), display);
     g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display);
@@ -767,12 +767,12 @@ display_server_ready_cb (DisplayServer *display_server, Display *display)
 
     /* Automatically start requested user session */
     result = FALSE;
-    if (display->priv->autologin_guest)
+    if (display->priv->autologin_timeout == 0 && display->priv->autologin_guest)
     {
         g_debug ("Automatically logging in as guest");
         result = autologin_guest (display, AUTOLOGIN_SERVICE, TRUE);
     }
-    else if (display->priv->autologin_user)
+    else if (display->priv->autologin_timeout == 0 && display->priv->autologin_user)
     {
         g_debug ("Automatically logging in user %s", display->priv->autologin_user);
         result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE);
index 5180fc8226f82e84520f4cf2f66a0adbed1fb470..b936168a87db20ac9117a49d2db8496b261e3956 100644 (file)
@@ -35,6 +35,7 @@ struct GreeterPrivate
 
     /* PAM service to authenticate with */
     gchar *pam_service;
+    gchar *autologin_pam_service;
 
     /* Buffer for data read from greeter */
     guint8 *read_buffer;
@@ -96,13 +97,14 @@ typedef enum
 static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data);
 
 Greeter *
-greeter_new (Session *session, const gchar *pam_service)
+greeter_new (Session *session, const gchar *pam_service, const gchar *autologin_pam_service)
 {
     Greeter *greeter;
 
     greeter = g_object_new (GREETER_TYPE, NULL);
     greeter->priv->session = g_object_ref (session);
     greeter->priv->pam_service = g_strdup (pam_service);
+    greeter->priv->autologin_pam_service = g_strdup (autologin_pam_service);
 
     return greeter;
 }
@@ -314,6 +316,9 @@ reset_session (Greeter *greeter)
 static void
 handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username)
 {
+    const gchar *autologin_username, *service;
+    gboolean is_interactive;
+
     if (username[0] == '\0')
     {
         g_debug ("Greeter start authentication");
@@ -335,8 +340,21 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username)
     g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "got-messages", G_CALLBACK (pam_messages_cb), greeter);
     g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "authentication-complete", G_CALLBACK (authentication_complete_cb), greeter);
 
+    /* Use non-interactive service for autologin user */
+    autologin_username = g_hash_table_lookup (greeter->priv->hints, "autologin-user");
+    if (autologin_username != NULL && g_strcmp0 (username, autologin_username) == 0)
+    {
+        service = greeter->priv->autologin_pam_service;
+        is_interactive = FALSE;
+    }
+    else
+    {
+        service = greeter->priv->pam_service;
+        is_interactive = TRUE;
+    }
+
     /* Run the session process */
-    session_start (greeter->priv->authentication_session, greeter->priv->pam_service, username, TRUE, TRUE, FALSE);
+    session_start (greeter->priv->authentication_session, service, username, TRUE, is_interactive, FALSE);
 }
 
 static void
@@ -792,6 +810,7 @@ greeter_finalize (GObject *object)
     g_signal_handlers_disconnect_matched (self->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);    
     g_object_unref (self->priv->session);
     g_free (self->priv->pam_service);
+    g_free (self->priv->autologin_pam_service);
     g_free (self->priv->read_buffer);
     g_hash_table_unref (self->priv->hints);
     g_free (self->priv->remote_session);
index 27801952594d25d10bb15fbbdc795f10dc2b2de9..548039226d24df20bdf0fbb0531b85f3e6b6729e 100644 (file)
@@ -37,7 +37,7 @@ typedef struct
 
 GType greeter_get_type (void);
 
-Greeter *greeter_new (Session *session, const gchar *pam_service);
+Greeter *greeter_new (Session *session, const gchar *pam_service, const gchar *autologin_pam_service);
 
 void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest);
 
index f055f389d38d97742fdce05d711e8d9612240637..c6db4c73d82710eaa9ed746980b3ed4f5e0e2b70 100644 (file)
@@ -436,7 +436,7 @@ display_stopped_cb (Display *display, Seat *seat)
 }
 
 static gboolean
-switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean use_existing, gboolean is_guest, const gchar *session_name, gboolean is_lock, gboolean autologin)
+switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean use_existing, gboolean is_guest, const gchar *session_name, gboolean is_lock, gboolean autologin, int autologin_timeout)
 {
     Display *display;
     DisplayServer *display_server;
@@ -490,7 +490,7 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean use
     display_set_allow_guest (display, seat_get_allow_guest (seat));
     display_set_greeter_allow_guest (display, seat_get_greeter_allow_guest (seat));
     if (autologin)
-        display_set_autologin_user (display, username, is_guest, 0);
+        display_set_autologin_user (display, username, is_guest, autologin_timeout);
     else
         display_set_select_user_hint (display, username, is_guest);
     if (!session_name)
@@ -516,7 +516,7 @@ seat_switch_to_greeter (Seat *seat)
         return FALSE;
 
     g_debug ("Switching to greeter");
-    return switch_to_user_or_start_greeter (seat, NULL, TRUE, FALSE, NULL, FALSE, FALSE);
+    return switch_to_user_or_start_greeter (seat, NULL, TRUE, FALSE, NULL, FALSE, FALSE, 0);
 }
 
 gboolean
@@ -529,7 +529,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam
         return FALSE;
 
     g_debug ("Switching to user %s", username);
-    return switch_to_user_or_start_greeter (seat, username, TRUE, FALSE, session_name, FALSE, FALSE);
+    return switch_to_user_or_start_greeter (seat, username, TRUE, FALSE, session_name, FALSE, FALSE, 0);
 }
 
 gboolean
@@ -544,7 +544,7 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
         g_debug ("Switching to existing guest account %s", seat->priv->guest_username);
     else
         g_debug ("Switching to new guest account");
-    return switch_to_user_or_start_greeter (seat, seat->priv->guest_username, TRUE, TRUE, session_name, FALSE, TRUE);
+    return switch_to_user_or_start_greeter (seat, seat->priv->guest_username, TRUE, TRUE, session_name, FALSE, TRUE, 0);
 }
 
 gboolean
@@ -556,7 +556,7 @@ seat_lock (Seat *seat, const gchar *username)
         return FALSE;
 
     g_debug ("Locking seat");
-    return switch_to_user_or_start_greeter (seat, username, FALSE, FALSE, NULL, TRUE, FALSE);
+    return switch_to_user_or_start_greeter (seat, username, FALSE, FALSE, NULL, TRUE, FALSE, 0);
 }
 
 void
@@ -588,6 +588,7 @@ static gboolean
 seat_real_start (Seat *seat)
 {
     const gchar *autologin_username;
+    int autologin_timeout;
 
     g_debug ("Starting seat");
 
@@ -595,13 +596,14 @@ seat_real_start (Seat *seat)
     autologin_username = seat_get_string_property (seat, "autologin-user");
     if (g_strcmp0 (autologin_username, "") == 0)
         autologin_username = NULL;
+    autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout");
 
     if (autologin_username)
-        return switch_to_user_or_start_greeter (seat, autologin_username, TRUE, FALSE, NULL, FALSE, TRUE);
+        return switch_to_user_or_start_greeter (seat, autologin_username, TRUE, FALSE, NULL, FALSE, TRUE, autologin_timeout);
     else if (seat_get_boolean_property (seat, "autologin-guest"))
-        return switch_to_user_or_start_greeter (seat, NULL, TRUE, TRUE, NULL, FALSE, TRUE);
+        return switch_to_user_or_start_greeter (seat, NULL, TRUE, TRUE, NULL, FALSE, TRUE, autologin_timeout);
     else
-        return switch_to_user_or_start_greeter (seat, NULL, TRUE, FALSE, NULL, FALSE, FALSE);
+        return switch_to_user_or_start_greeter (seat, NULL, TRUE, FALSE, NULL, FALSE, FALSE, 0);
 }
 
 static void
index 9e41117e57d67104d5e534637e3e6d9f55105c26..c03d058c8a6f7b93b4b8a9fb89faaab8f9646e98 100644 (file)
@@ -15,6 +15,10 @@ TESTS = \
        test-autologin-session-crash \
        test-autologin-password \
        test-autologin-new-authtok \
+       test-autologin-gobject-timeout \
+       test-autologin-gobject-guest-timeout \
+       test-autologin-python-timeout \
+       test-autologin-python-guest-timeout \
        test-change-authentication \
        test-restart-authentication \
        test-pam \
@@ -129,6 +133,8 @@ TESTS = \
 
 if COMPILE_LIBLIGHTDM_QT
 TESTS += \
+       test-autologin-qt-timeout \
+       test-autologin-qt-guest-timeout \
        test-login-qt \
        test-login-qt-manual \
        test-login-qt-manual-previous-session \
diff --git a/tests/scripts/autologin-guest-timeout.conf b/tests/scripts/autologin-guest-timeout.conf
new file mode 100644 (file)
index 0000000..330478e
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Check automatically logs in default user
+#
+
+[LightDM]
+minimum-display-number=50
+
+[SeatDefaults]
+autologin-guest=true
+autologin-user-timeout=1
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER :50 START
+#?XSERVER :50 INDICATE-READY
+
+# LightDM connects to X server
+#?XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER :50 START
+#?XSERVER :50 ACCEPT-CONNECT
+#?GREETER :50 CONNECT-XSERVER
+#?GREETER :50 CONNECT-TO-DAEMON
+#?GREETER :50 CONNECTED-TO-DAEMON
+
+# Autologin timer expires
+#?GREETER :50 AUTOLOGIN-TIMER-EXPIRED
+
+# Trigger autologin
+#?*GREETER :50 AUTHENTICATE-AUTOLOGIN
+#?GREETER :50 AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
+#?*GREETER :50 START-SESSION
+#?GREETER :50 TERMINATE SIGNAL=15
+
+# Guest account created
+#?GUEST-ACCOUNT ADD USERNAME=guest-.*
+
+# Guest session starts
+#?SESSION :50 START USER=guest-.*
+#?XSERVER :50 ACCEPT-CONNECT
+#?SESSION :50 CONNECT-XSERVER
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15|GUEST-ACCOUNT REMOVE USERNAME=guest-.*)
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/autologin-timeout.conf b/tests/scripts/autologin-timeout.conf
new file mode 100644 (file)
index 0000000..429c42d
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Check automatically logs in default user
+#
+
+[LightDM]
+minimum-display-number=50
+
+[SeatDefaults]
+autologin-user=have-password1
+autologin-user-timeout=1
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER :50 START
+#?XSERVER :50 INDICATE-READY
+
+# LightDM connects to X server
+#?XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER :50 START
+#?XSERVER :50 ACCEPT-CONNECT
+#?GREETER :50 CONNECT-XSERVER
+#?GREETER :50 CONNECT-TO-DAEMON
+#?GREETER :50 CONNECTED-TO-DAEMON
+
+# Autologin timer expires
+#?GREETER :50 AUTOLOGIN-TIMER-EXPIRED
+
+# Trigger autologin
+#?*GREETER :50 AUTHENTICATE-AUTOLOGIN
+#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*GREETER :50 START-SESSION
+#?GREETER :50 TERMINATE SIGNAL=15
+
+# Session starts
+#?SESSION :50 START USER=have-password1
+#?XSERVER :50 ACCEPT-CONNECT
+#?SESSION :50 CONNECT-XSERVER
+
+# Cleanup
+#?*STOP-DAEMON
+# Don't know what order they will terminate
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
+#?RUNNER DAEMON-EXIT STATUS=0
index e114dd18d31d9d6cecb2d0da3f19c520911694f3..da31796beb395e7919b32de0e0677ed62312c48e 100644 (file)
@@ -38,6 +38,12 @@ authentication_complete_cb (LightDMGreeter *greeter)
                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
 }
 
+static void
+autologin_timer_expired_cb (LightDMGreeter *greeter)
+{
+    status_notify ("GREETER %s AUTOLOGIN-TIMER-EXPIRED", getenv ("DISPLAY"));
+}
+
 static void
 signal_cb (int signum)
 {
@@ -65,6 +71,11 @@ request_cb (const gchar *request)
         lightdm_greeter_authenticate_as_guest (greeter);
     g_free (r);
 
+    r = g_strdup_printf ("GREETER %s AUTHENTICATE-AUTOLOGIN", getenv ("DISPLAY"));
+    if (strcmp (request, r) == 0)
+        lightdm_greeter_authenticate_autologin (greeter);
+    g_free (r);
+
     r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
     if (g_str_has_prefix (request, r))
         lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
@@ -213,6 +224,7 @@ 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, "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL);
 
     status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
     if (!lightdm_greeter_connect_sync (greeter, NULL))
index 87aa6c7a1fc165579b365a4ea77fb20664e53063..cc1fe1beedee8e678f2bbc4ee8b82248d761492c 100755 (executable)
@@ -45,14 +45,18 @@ def request_cb (channel, condition):
     if request.startswith (r):
         greeter.authenticate (request[len(r):])
 
-    r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY')
-    if request.startswith (r):
-        greeter.authenticate_remote (request[len(r):], None)
-
     r = 'GREETER %s AUTHENTICATE-GUEST' % os.getenv ('DISPLAY')
     if request == r:
         greeter.authenticate_as_guest ()
 
+    r = 'GREETER %s AUTHENTICATE-AUTOLOGIN' % os.getenv ('DISPLAY')
+    if request == r:
+        greeter.authenticate_autologin ()
+
+    r = 'GREETER %s AUTHENTICATE-REMOTE SESSION=' % os.getenv ('DISPLAY')
+    if request.startswith (r):
+        greeter.authenticate_remote (request[len(r):], None)
+
     r = 'GREETER %s RESPOND TEXT=\"' % os.getenv ('DISPLAY')
     if request.startswith (r):
         greeter.respond (request[len (r):-1])
@@ -149,10 +153,14 @@ def authentication_complete_cb (greeter):
     else:
         status_notify ('GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s' % (os.getenv ('DISPLAY'), is_authenticated))
 
+def autologin_timer_expired_cb (greeter):
+    status_notify ('GREETER %s AUTOLOGIN-TIMER-EXPIRED' % os.getenv ('DISPLAY'))
+
 greeter = LightDM.Greeter ()
 greeter.connect ('show-message', show_message_cb)
 greeter.connect ('show-prompt', show_prompt_cb)
 greeter.connect ('authentication-complete', authentication_complete_cb)
+greeter.connect ('autologin-timer-expired', autologin_timer_expired_cb)
 
 status_notify ('GREETER %s CONNECT-TO-DAEMON' % os.getenv ('DISPLAY'))
 if not greeter.connect_sync ():
@@ -164,6 +172,6 @@ status_notify ('GREETER %s CONNECTED-TO-DAEMON' % os.getenv ('DISPLAY'))
 if greeter.get_select_user_hint () is not None:
     status_notify ('GREETER %s SELECT-USER-HINT USERNAME=%s' % (os.getenv ('DISPLAY'), greeter.get_select_user_hint ()))
 if greeter.get_lock_hint ():
-        status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
+    status_notify ('GREETER %s LOCK-HINT' % os.getenv ('DISPLAY'));
 
 loop.run ()
index 1019a6ab7e04f98194c3c6fd38f0f844afdb8f9e..4beda20464ecf64b2419270b6cd36a60fc161d26 100644 (file)
@@ -19,6 +19,7 @@ TestGreeter::TestGreeter ()
     connect (this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)), SLOT(showMessage(QString, QLightDM::Greeter::MessageType)));
     connect (this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)), SLOT(showPrompt(QString, QLightDM::Greeter::PromptType)));
     connect (this, SIGNAL(authenticationComplete()), SLOT(authenticationComplete()));
+    connect (this, SIGNAL(autologinTimerExpired()), SLOT(autologinTimerExpired()));
 }
 
 void TestGreeter::showMessage (QString text, QLightDM::Greeter::MessageType type)
@@ -41,6 +42,11 @@ void TestGreeter::authenticationComplete ()
         status_notify ("GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s", getenv ("DISPLAY"), isAuthenticated () ? "TRUE" : "FALSE");
 }
 
+void TestGreeter::autologinTimerExpired ()
+{
+    status_notify ("GREETER %s AUTOLOGIN-TIMER-EXPIRED", getenv ("DISPLAY"));
+}
+
 static void
 signal_cb (int signum)
 {
@@ -68,6 +74,11 @@ request_cb (const gchar *request)
         greeter->authenticateAsGuest ();
     g_free (r);
 
+    r = g_strdup_printf ("GREETER %s AUTHENTICATE-AUTOLOGIN", getenv ("DISPLAY"));
+    if (strcmp (request, r) == 0)
+        greeter->authenticateAutologin ();
+    g_free (r);
+
     r = g_strdup_printf ("GREETER %s AUTHENTICATE-REMOTE SESSION=", getenv ("DISPLAY"));
     if (g_str_has_prefix (request, r))
         greeter->authenticateRemote (request + strlen (r), NULL);
index 16fd9b26969dc428f9210be05cfd497c20cf3bcc..222e40fafb1ad99024fa968279a5b9a1e352b119 100644 (file)
@@ -11,4 +11,5 @@ private slots:
     void showMessage(QString text, QLightDM::Greeter::MessageType type);
     void showPrompt(QString text, QLightDM::Greeter::PromptType type);
     void authenticationComplete();
+    void autologinTimerExpired();
 };
diff --git a/tests/test-autologin-gobject-guest-timeout b/tests/test-autologin-gobject-guest-timeout
new file mode 100755 (executable)
index 0000000..cad4609
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-guest-timeout test-gobject-greeter
diff --git a/tests/test-autologin-gobject-timeout b/tests/test-autologin-gobject-timeout
new file mode 100755 (executable)
index 0000000..322f155
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-timeout test-gobject-greeter
diff --git a/tests/test-autologin-python-guest-timeout b/tests/test-autologin-python-guest-timeout
new file mode 100755 (executable)
index 0000000..3be0c1e
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-guest-timeout test-python-greeter
diff --git a/tests/test-autologin-python-timeout b/tests/test-autologin-python-timeout
new file mode 100755 (executable)
index 0000000..82da3be
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-timeout test-python-greeter
diff --git a/tests/test-autologin-qt-guest-timeout b/tests/test-autologin-qt-guest-timeout
new file mode 100755 (executable)
index 0000000..ba71d6b
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-guest-timeout test-qt-greeter
diff --git a/tests/test-autologin-qt-timeout b/tests/test-autologin-qt-timeout
new file mode 100755 (executable)
index 0000000..d26e044
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner autologin-timeout test-qt-greeter