summaryrefslogtreecommitdiff
path: root/src
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 /src
parentebca982677ac2e734eb24c8f10888f2bba6483ba (diff)
downloadlightdm-4d2130611e4bdcdbe52c924b9af9299ba58519e9.tar.gz
Working and passing tests
Diffstat (limited to 'src')
-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
5 files changed, 24 insertions, 11 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);