summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2012-08-24 17:58:57 +1200
committerRobert Ancell <robert.ancell@canonical.com>2012-08-24 17:58:57 +1200
commit4d2130611e4bdcdbe52c924b9af9299ba58519e9 (patch)
tree7c6832f70f69e4709c4c5c51712c881c13c4d5e0
parentebca982677ac2e734eb24c8f10888f2bba6483ba (diff)
downloadlightdm-4d2130611e4bdcdbe52c924b9af9299ba58519e9.tar.gz
Working and passing tests
-rw-r--r--src/display.c10
-rw-r--r--src/greeter.c6
-rw-r--r--src/seat.c1
-rw-r--r--src/session.c16
-rw-r--r--src/session.h2
-rw-r--r--tests/scripts/autologin-guest-logout.conf6
-rw-r--r--tests/scripts/login-guest-logout.conf6
-rw-r--r--tests/scripts/login-remote-session.conf15
-rw-r--r--tests/src/libsystem.c3
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]);
diff --git a/src/seat.c b/src/seat.c
index 685cf3d0..ad427313 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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);