summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2012-08-27 17:30:37 +1200
committerRobert Ancell <robert.ancell@canonical.com>2012-08-27 17:30:37 +1200
commit6d3813cdd365bb1b22d7fe31a21cb2ea4052719d (patch)
treedcbff31d8d57bd2e28ec1c5b5413afe913d94469
parent1c62f4b3e37496f335e11057e05a8dfd72882a42 (diff)
downloadlightdm-6d3813cdd365bb1b22d7fe31a21cb2ea4052719d.tar.gz
Run remote sessions when selected from the greeter
-rw-r--r--src/display.c34
-rw-r--r--src/display.h2
-rw-r--r--src/greeter.c25
-rw-r--r--src/greeter.h2
-rw-r--r--src/ldm-marshal.list2
-rw-r--r--src/seat.c2
-rw-r--r--src/session.h6
-rw-r--r--tests/data/remote-sessions/test-remote.desktop2
8 files changed, 47 insertions, 28 deletions
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"
diff --git a/tests/data/remote-sessions/test-remote.desktop b/tests/data/remote-sessions/test-remote.desktop
index 4d486335..60829d44 100644
--- a/tests/data/remote-sessions/test-remote.desktop
+++ b/tests/data/remote-sessions/test-remote.desktop
@@ -1,5 +1,5 @@
[Desktop Entry]
Name=Test Remote Session
Comment=LightDM remote test session
-Exec=test-remote
+Exec=test-session
X-LightDM-PAM-Service=test-remote