diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2012-08-24 17:58:57 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2012-08-24 17:58:57 +1200 |
commit | 4d2130611e4bdcdbe52c924b9af9299ba58519e9 (patch) | |
tree | 7c6832f70f69e4709c4c5c51712c881c13c4d5e0 | |
parent | ebca982677ac2e734eb24c8f10888f2bba6483ba (diff) | |
download | lightdm-4d2130611e4bdcdbe52c924b9af9299ba58519e9.tar.gz |
Working and passing tests
-rw-r--r-- | src/display.c | 10 | ||||
-rw-r--r-- | src/greeter.c | 6 | ||||
-rw-r--r-- | src/seat.c | 1 | ||||
-rw-r--r-- | src/session.c | 16 | ||||
-rw-r--r-- | src/session.h | 2 | ||||
-rw-r--r-- | tests/scripts/autologin-guest-logout.conf | 6 | ||||
-rw-r--r-- | tests/scripts/login-guest-logout.conf | 6 | ||||
-rw-r--r-- | tests/scripts/login-remote-session.conf | 15 | ||||
-rw-r--r-- | tests/src/libsystem.c | 3 |
9 files changed, 44 insertions, 21 deletions
diff --git a/src/display.c b/src/display.c index 9078c9f5..ae7ebd9c 100644 --- a/src/display.c +++ b/src/display.c @@ -493,7 +493,7 @@ autologin_authentication_complete_cb (Session *session, Display *display) } static gboolean -autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail) +autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail, gboolean is_guest) { display->priv->start_greeter_if_fail = start_greeter_if_fail; @@ -502,7 +502,7 @@ autologin (Display *display, const gchar *username, const gchar *service, gboole display->priv->session = create_session (display); g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (autologin_authentication_complete_cb), display); g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display); - return session_start (display->priv->session, service, username, TRUE, FALSE); + return session_start (display->priv->session, service, username, TRUE, FALSE, is_guest); } static gboolean @@ -518,7 +518,7 @@ autologin_guest (Display *display, const gchar *service, gboolean start_greeter_ return FALSE; } - result = autologin (display, username, service, start_greeter_if_fail); + result = autologin (display, username, service, start_greeter_if_fail, TRUE); g_free (username); return result; @@ -777,12 +777,12 @@ display_server_ready_cb (DisplayServer *display_server, Display *display) else if (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); + result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE); } else if (display->priv->select_user_hint) { g_debug ("Logging in user %s", display->priv->select_user_hint); - result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE); + result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE, FALSE); } /* If no session started, start a greeter */ diff --git a/src/greeter.c b/src/greeter.c index a7cd43a4..ac5b1b4e 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -331,7 +331,7 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username) g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "authentication-complete", G_CALLBACK (authentication_complete_cb), greeter); /* Run the session process */ - session_start (greeter->priv->authentication_session, greeter->priv->pam_service, username, TRUE, TRUE); + session_start (greeter->priv->authentication_session, greeter->priv->pam_service, username, TRUE, TRUE, FALSE); } static void @@ -417,7 +417,7 @@ handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *u g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "authentication-complete", G_CALLBACK (authentication_complete_cb), greeter); /* Run the session process */ - session_start (greeter->priv->authentication_session, service, username, TRUE, TRUE); + session_start (greeter->priv->authentication_session, service, username, TRUE, TRUE, TRUE); } g_free (service); @@ -739,7 +739,7 @@ greeter_start (Greeter *greeter, const gchar *service, const gchar *username) fcntl (to_greeter_pipe[1], F_SETFD, FD_CLOEXEC); fcntl (from_greeter_pipe[0], F_SETFD, FD_CLOEXEC); - result = session_start (greeter->priv->session, service, username, FALSE, FALSE); + result = session_start (greeter->priv->session, service, username, FALSE, FALSE, FALSE); /* Close the session ends of the pipe */ close (to_greeter_pipe[0]); @@ -390,7 +390,6 @@ session_stopped_cb (Session *session, Seat *seat) if (seat->priv->guest_username && strcmp (session_get_username (session), seat->priv->guest_username) == 0) { - guest_account_cleanup (seat->priv->guest_username); g_free (seat->priv->guest_username); seat->priv->guest_username = NULL; } diff --git a/src/session.c b/src/session.c index 3bf34d6f..fd2af4cc 100644 --- a/src/session.c +++ b/src/session.c @@ -22,6 +22,7 @@ #include "session.h" #include "configuration.h" #include "console-kit.h" +#include "guest-account.h" enum { GOT_MESSAGES, @@ -46,6 +47,9 @@ struct SessionPrivate /* User to authenticate as */ gchar *username; + /* TRUE if is a guest account */ + gboolean is_guest; + /* User object that matches the current username */ User *user; @@ -235,6 +239,10 @@ session_watch_cb (GPid pid, gint status, gpointer data) g_signal_emit (G_OBJECT (session), signals[STOPPED], 0); + /* Delete account if it is a guest one */ + if (session->priv->is_guest) + guest_account_cleanup (session->priv->username); + /* Drop our reference on the child process, it has terminated */ g_object_unref (session); } @@ -316,7 +324,7 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data) } gboolean -session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive) +session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive, gboolean is_guest) { int version; int to_child_pipe[2], from_child_pipe[2]; @@ -343,6 +351,11 @@ session_start (Session *session, const gchar *service, const gchar *username, gb fcntl (session->priv->to_child_input, F_SETFD, FD_CLOEXEC); fcntl (session->priv->from_child_output, F_SETFD, FD_CLOEXEC); + /* Create the guest account if it is one */ + session->priv->is_guest = is_guest; + if (is_guest && username == NULL) + username = guest_account_setup (); + /* Remember what username we started with - it will be updated by PAM during authentication */ session->priv->username = g_strdup (username); @@ -353,6 +366,7 @@ session_start (Session *session, const gchar *service, const gchar *username, gb g_debug ("Failed to fork session child process: %s", strerror (errno)); return FALSE; } + if (session->priv->pid == 0) { /* Run us again in session child mode */ diff --git a/src/session.h b/src/session.h index a574726a..ebf870c2 100644 --- a/src/session.h +++ b/src/session.h @@ -66,7 +66,7 @@ void session_set_env (Session *session, const gchar *name, const gchar *value); // FIXME: Remove User *session_get_user (Session *session); -gboolean session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive); +gboolean session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive, gboolean is_guest); const gchar *session_get_username (Session *session); diff --git a/tests/scripts/autologin-guest-logout.conf b/tests/scripts/autologin-guest-logout.conf index cb1146b5..51a6b9ac 100644 --- a/tests/scripts/autologin-guest-logout.conf +++ b/tests/scripts/autologin-guest-logout.conf @@ -28,12 +28,12 @@ autologin-guest=true # Logout of session #?*SESSION :50 LOGOUT -# Guest account removed -#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* - # X server stops #?XSERVER :50 TERMINATE SIGNAL=15 +# Guest account removed +#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* + # X server starts #?XSERVER :50 START #?XSERVER :50 INDICATE-READY diff --git a/tests/scripts/login-guest-logout.conf b/tests/scripts/login-guest-logout.conf index 27723626..1dcf3ceb 100644 --- a/tests/scripts/login-guest-logout.conf +++ b/tests/scripts/login-guest-logout.conf @@ -38,12 +38,12 @@ minimum-display-number=50 # Logout of session #?*SESSION :50 LOGOUT -# Guest account removed -#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* - # X server stops #?XSERVER :50 TERMINATE SIGNAL=15 +# Guest account removed +#?GUEST-ACCOUNT REMOVE USERNAME=guest-.* + # X server starts #?XSERVER :50 START #?XSERVER :50 INDICATE-READY diff --git a/tests/scripts/login-remote-session.conf b/tests/scripts/login-remote-session.conf index 6b9b67a8..b24a89f8 100644 --- a/tests/scripts/login-remote-session.conf +++ b/tests/scripts/login-remote-session.conf @@ -21,23 +21,30 @@ minimum-display-number=50 #?GREETER :50 CONNECT-TO-DAEMON #?GREETER :50 CONNECTED-TO-DAEMON +# Start remote authentication #?*GREETER :50 AUTHENTICATE-REMOTE SESSION=test-remote + +# Guest account created +#?GUEST-ACCOUNT ADD USERNAME=guest-.* + +# Get remote credentials #?GREETER :50 SHOW-PROMPT TEXT="remote-login:" #?*GREETER :50 RESPOND TEXT="remote-user" #?GREETER :50 SHOW-PROMPT TEXT="remote-password:" #?*GREETER :50 RESPOND TEXT="password" -#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=remote-user AUTHENTICATED=TRUE +#?GREETER :50 AUTHENTICATION-COMPLETE USERNAME=guest-.* AUTHENTICATED=TRUE #?*GREETER :50 START-SESSION #?GREETER :50 TERMINATE SIGNAL=15 # Session starts -#?SESSION :50 START USER=remote-user +#?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) -#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?(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/src/libsystem.c b/tests/src/libsystem.c index 693c91e1..9e137339 100644 --- a/tests/src/libsystem.c +++ b/tests/src/libsystem.c @@ -437,6 +437,8 @@ pam_start (const char *service_name, const char *user, const struct pam_conv *co handle->service_name = strdup (service_name); handle->user = user ? strdup (user) : NULL; + handle->authtok = NULL; + handle->ruser = NULL; handle->tty = NULL; handle->conversation.conv = conversation->conv; handle->conversation.appdata_ptr = conversation->appdata_ptr; @@ -523,6 +525,7 @@ pam_authenticate (pam_handle_t *pamh, int flags) free (resp); return PAM_CONV_ERR; } + if (pamh->authtok) free (pamh->authtok); pamh->authtok = strdup (resp[0].resp); |