From 4d2130611e4bdcdbe52c924b9af9299ba58519e9 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 24 Aug 2012 17:58:57 +1200 Subject: Working and passing tests --- src/display.c | 10 +++++----- src/greeter.c | 6 +++--- src/seat.c | 1 - src/session.c | 16 +++++++++++++++- src/session.h | 2 +- 5 files changed, 24 insertions(+), 11 deletions(-) (limited to 'src') 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); -- cgit v1.2.1