};
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 */
gboolean greeter_is_lock;
/* Session requested to log into */
+ SessionType user_session_type;
gchar *user_session;
/* Program to run sessions through */
}
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);
}
}
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))
User *user;
user = session_get_user (greeter_get_authentication_session (greeter));
+ type = SESSION_TYPE_LOCAL;
session_name = user_get_xsession (user);
}
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 */
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);
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);
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);
/* 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;
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);
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)
{
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)
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
{
}
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;
}
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);
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));
}
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);
VOID:INT,POINTER
BOOLEAN:VOID
-BOOLEAN:STRING
+BOOLEAN:INT,STRING
BOOLEAN:OBJECT
STRING:VOID
OBJECT:VOID
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);
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"
[Desktop Entry]
Name=Test Remote Session
Comment=LightDM remote test session
-Exec=test-remote
+Exec=test-session
X-LightDM-PAM-Service=test-remote