From 6d3813cdd365bb1b22d7fe31a21cb2ea4052719d Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 27 Aug 2012 17:30:37 +1200 Subject: Run remote sessions when selected from the greeter --- src/display.c | 34 ++++++++++++++++------------------ src/display.h | 2 +- src/greeter.c | 25 ++++++++++++++++++++----- src/greeter.h | 2 +- src/ldm-marshal.list | 2 +- src/seat.c | 2 +- src/session.h | 6 ++++++ 7 files changed, 46 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/display.c b/src/display.c index ae7ebd9c..ec001530 100644 --- a/src/display.c +++ b/src/display.c @@ -35,15 +35,6 @@ enum }; static guint signals[LAST_SIGNAL] = { 0 }; -typedef enum -{ - SESSION_NONE = 0, - SESSION_GREETER_PRE_CONNECT, - SESSION_GREETER, - SESSION_GREETER_AUTHENTICATED, - SESSION_USER -} SessionType; - struct DisplayPrivate { /* Display server */ @@ -62,6 +53,7 @@ struct DisplayPrivate gboolean greeter_is_lock; /* Session requested to log into */ + SessionType user_session_type; gchar *user_session; /* Program to run sessions through */ @@ -220,10 +212,11 @@ display_set_lock_hint (Display *display, gboolean is_lock) } void -display_set_user_session (Display *display, const gchar *session_name) +display_set_user_session (Display *display, SessionType type, const gchar *session_name) { g_return_if_fail (display != NULL); g_free (display->priv->user_session); + display->priv->user_session_type = type; display->priv->user_session = g_strdup (session_name); } @@ -349,7 +342,7 @@ greeter_start_authentication_cb (Greeter *greeter, const gchar *username, Displa } static gboolean -greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display) +greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display) { /* If no session requested, use the previous one */ if (!session_name && !greeter_get_guest_authenticated (greeter)) @@ -357,6 +350,7 @@ greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display * User *user; user = session_get_user (greeter_get_authentication_session (greeter)); + type = SESSION_TYPE_LOCAL; session_name = user_get_xsession (user); } @@ -364,7 +358,7 @@ greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display * if (session_name) { g_debug ("Using session %s", session_name); - display_set_user_session (display, session_name); + display_set_user_session (display, type, session_name); } /* Stop this display if that session already exists and can switch to it */ @@ -474,7 +468,7 @@ autologin_authentication_complete_cb (Session *session, Display *display) if (session_name) { g_debug ("Autologin using session %s", session_name); - display_set_user_session (display, session_name); + display_set_user_session (display, SESSION_TYPE_LOCAL, session_name); } g_signal_emit (display, signals[START_SESSION], 0, &result); @@ -700,12 +694,16 @@ display_start_session (Display *display) user = session_get_user (display->priv->session); - /* Store this session name so we automatically use it next time */ - user_set_xsession (user, display->priv->user_session); - /* Find the command to run for the selected session */ - // FIXME: This is X specific, move into xsession.c - sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory"); + if (display->priv->user_session_type == SESSION_TYPE_LOCAL) + { + sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory"); + + /* Store this session name so we automatically use it next time */ + user_set_xsession (user, display->priv->user_session); + } + else + sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory"); filename = g_strdup_printf ("%s.desktop", display->priv->user_session); path = g_build_filename (sessions_dir, filename, NULL); g_free (sessions_dir); diff --git a/src/display.h b/src/display.h index e6a970b1..23d8c8ba 100644 --- a/src/display.h +++ b/src/display.h @@ -76,7 +76,7 @@ void display_set_show_manual_login_hint (Display *display, gboolean show_manual) void display_set_lock_hint (Display *display, gboolean is_lock); -void display_set_user_session (Display *display, const gchar *session_name); +void display_set_user_session (Display *display, SessionType type, const gchar *session_name); gboolean display_start (Display *display); diff --git a/src/greeter.c b/src/greeter.c index ac5b1b4e..5180fc82 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -49,6 +49,9 @@ struct GreeterPrivate /* Sequence number of current PAM session */ guint32 authentication_sequence_number; + /* Remote session name */ + gchar *remote_session; + /* PAM session being constructed by the greeter */ Session *authentication_session; @@ -295,6 +298,8 @@ authentication_complete_cb (Session *session, Greeter *greeter) static void reset_session (Greeter *greeter) { + g_free (greeter->priv->remote_session); + greeter->priv->remote_session = NULL; if (greeter->priv->authentication_session) { g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); @@ -409,7 +414,8 @@ handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *u return; } - greeter->priv->authentication_sequence_number = sequence_number; + greeter->priv->authentication_sequence_number = sequence_number; + greeter->priv->remote_session = g_strdup (session_name); g_signal_emit (greeter, signals[START_AUTHENTICATION], 0, username, &greeter->priv->authentication_session); if (greeter->priv->authentication_session) { @@ -491,10 +497,18 @@ handle_start_session (Greeter *greeter, const gchar *session) gboolean result; guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; + SessionType session_type = SESSION_TYPE_LOCAL; if (strcmp (session, "") == 0) session = NULL; + /* Use session type chosen in remote session */ + if (greeter->priv->remote_session) + { + session_type = SESSION_TYPE_REMOTE; + session = greeter->priv->remote_session; + } + if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session)) { if (session) @@ -502,7 +516,7 @@ handle_start_session (Greeter *greeter, const gchar *session) else g_debug ("Greeter requests default session"); greeter->priv->start_session = TRUE; - g_signal_emit (greeter, signals[START_SESSION], 0, session, &result); + g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result); } else { @@ -755,7 +769,7 @@ greeter_real_start_authentication (Greeter *greeter, const gchar *username) } static gboolean -greeter_real_start_session (Greeter *greeter, const gchar *session, gboolean is_guest) +greeter_real_start_session (Greeter *greeter, SessionType type, const gchar *session) { return FALSE; } @@ -780,6 +794,7 @@ greeter_finalize (GObject *object) g_free (self->priv->pam_service); g_free (self->priv->read_buffer); g_hash_table_unref (self->priv->hints); + g_free (self->priv->remote_session); if (self->priv->authentication_session) { g_signal_handlers_disconnect_matched (self->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); @@ -828,8 +843,8 @@ greeter_class_init (GreeterClass *klass) G_STRUCT_OFFSET (GreeterClass, start_session), g_signal_accumulator_true_handled, NULL, - ldm_marshal_BOOLEAN__STRING, - G_TYPE_BOOLEAN, 1, G_TYPE_STRING); + ldm_marshal_BOOLEAN__INT_STRING, + G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_STRING); g_type_class_add_private (klass, sizeof (GreeterPrivate)); } diff --git a/src/greeter.h b/src/greeter.h index 88fb2bc8..27801952 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -32,7 +32,7 @@ typedef struct GObjectClass parent_class; void (*connected)(Greeter *greeter); Session *(*start_authentication)(Greeter *greeter, const gchar *username); - gboolean (*start_session)(Greeter *greeter, const gchar *session, gboolean is_guest); + gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session); } GreeterClass; GType greeter_get_type (void); diff --git a/src/ldm-marshal.list b/src/ldm-marshal.list index 57d376b9..9be211ac 100644 --- a/src/ldm-marshal.list +++ b/src/ldm-marshal.list @@ -1,6 +1,6 @@ VOID:INT,POINTER BOOLEAN:VOID -BOOLEAN:STRING +BOOLEAN:INT,STRING BOOLEAN:OBJECT STRING:VOID OBJECT:VOID diff --git a/src/seat.c b/src/seat.c index ad427313..f055f389 100644 --- a/src/seat.c +++ b/src/seat.c @@ -495,7 +495,7 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean use display_set_select_user_hint (display, username, is_guest); if (!session_name) session_name = seat_get_string_property (seat, "user-session"); - display_set_user_session (display, session_name); + display_set_user_session (display, SESSION_TYPE_LOCAL, session_name); seat->priv->displays = g_list_append (seat->priv->displays, display); g_signal_emit (seat, signals[DISPLAY_ADDED], 0, display); diff --git a/src/session.h b/src/session.h index ebf870c2..52a6e9e8 100644 --- a/src/session.h +++ b/src/session.h @@ -43,6 +43,12 @@ typedef struct void (*stopped)(Session *session); } SessionClass; +typedef enum +{ + SESSION_TYPE_LOCAL, + SESSION_TYPE_REMOTE +} SessionType; + #define XDG_SESSION_CLASS_USER "user" #define XDG_SESSION_CLASS_GREETER "greeter" #define XDG_SESSION_CLASS_LOCK_SCREEN "lock-screen" -- cgit v1.2.1