enum {
CONNECTED,
- START_AUTHENTICATION,
+ CREATE_SESSION,
START_SESSION,
LAST_SIGNAL
};
reset_session (greeter);
greeter->priv->authentication_sequence_number = sequence_number;
- g_signal_emit (greeter, signals[START_AUTHENTICATION], 0, username, &greeter->priv->authentication_session);
+ g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session);
if (!greeter->priv->authentication_session)
{
send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN);
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);
+ g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session);
if (greeter->priv->authentication_session)
{
g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "got-messages", G_CALLBACK (pam_messages_cb), greeter);
return TRUE;
}
+Session *
+greeter_get_session (Greeter *greeter)
+{
+ g_return_val_if_fail (greeter != NULL, NULL);
+ return greeter->priv->session;
+}
+
gboolean
greeter_get_guest_authenticated (Greeter *greeter)
{
}
gboolean
-greeter_start (Greeter *greeter, const gchar *service, const gchar *username)
+greeter_start (Greeter *greeter)
{
int to_greeter_pipe[2], from_greeter_pipe[2];
gboolean result = FALSE;
fcntl (to_greeter_pipe[1], F_SETFD, FD_CLOEXEC);
fcntl (from_greeter_pipe[0], F_SETFD, FD_CLOEXEC);
- session_set_pam_service (greeter->priv->session, service);
- session_set_username (greeter->priv->session, username);
result = session_start (greeter->priv->session);
/* Close the session ends of the pipe */
}
static Session *
-greeter_real_start_authentication (Greeter *greeter, const gchar *username)
+greeter_real_create_session (Greeter *greeter)
{
return NULL;
}
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- klass->start_authentication = greeter_real_start_authentication;
+ klass->create_session = greeter_real_create_session;
klass->start_session = greeter_real_start_session;
object_class->finalize = greeter_finalize;
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
- signals[START_AUTHENTICATION] =
- g_signal_new ("start-authentication",
+ signals[CREATE_SESSION] =
+ g_signal_new ("create-session",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GreeterClass, start_authentication),
+ G_STRUCT_OFFSET (GreeterClass, create_session),
g_signal_accumulator_first_wins,
NULL,
- ldm_marshal_OBJECT__STRING,
- SESSION_TYPE, 1, G_TYPE_STRING);
+ ldm_marshal_OBJECT__VOID,
+ SESSION_TYPE, 0);
signals[START_SESSION] =
g_signal_new ("start-session",
{
GObjectClass parent_class;
void (*connected)(Greeter *greeter);
- Session *(*start_authentication)(Greeter *greeter, const gchar *username);
+ Session *(*create_session)(Greeter *greeter);
gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
} GreeterClass;
void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value);
+Session *greeter_get_session (Greeter *greeter);
+
gboolean greeter_get_guest_authenticated (Greeter *greeter);
Session *greeter_get_authentication_session (Greeter *greeter);
gboolean greeter_get_start_session (Greeter *greeter);
-gboolean greeter_start (Greeter *greeter, const gchar *service, const gchar *username);
+gboolean greeter_start (Greeter *greeter);
G_END_DECLS
#include "seat.h"
#include "configuration.h"
#include "guest-account.h"
+#include "greeter.h"
enum {
SESSION_ADDED,
/* The sessions on this seat */
GList *sessions;
+ /* Greeter connection */
+ Greeter *greeter;
+
/* TRUE if stopping this seat (waiting for displays to stop) */
gboolean stopping;
g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
- g_object_unref (session);
check_stopped (seat);
+
+ /* If this is the greeter session then start the user session */
+ if (seat->priv->greeter &&
+ session == greeter_get_session (seat->priv->greeter) &&
+ seat->priv->share_display_server)
+ {
+ Session *s;
+ s = greeter_get_authentication_session (seat->priv->greeter);
+ session_run (s);
+ }
+
+ g_object_unref (session);
}
static Session *
if (session_get_display_server (session) == display_server)
{
g_signal_connect (session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
- session_start (session);
+ if (seat->priv->greeter && greeter_get_session (seat->priv->greeter) == session)
+ greeter_start (seat->priv->greeter);
+ else
+ session_start (session);
used_display_server = TRUE;
}
}
}
}
+static Session *
+greeter_create_session_cb (Greeter *greeter, Seat *seat)
+{
+ return create_session (seat, NULL); // FIXME display_server
+}
+
static gchar **
get_session_argv_from_filename (const gchar *filename, const gchar *session_wrapper)
{
return argv;
}
+static gboolean
+greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat)
+{
+ /* If can re-use the display server, stop the greeter first */
+ if (seat->priv->share_display_server)
+ {
+ Session *s;
+ gchar *sessions_dir;
+ gchar **argv;
+
+ s = greeter_get_authentication_session (seat->priv->greeter);
+
+ /* Run on the same display server */
+ session_set_display_server (s, session_get_display_server (greeter_get_session (seat->priv->greeter)));
+
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory");
+ argv = get_session_argv (sessions_dir, session_name, seat_get_string_property (seat, "session-wrapper"));
+ g_free (sessions_dir);
+ session_set_argv (s, argv);
+ g_strfreev (argv);
+
+ seat->priv->sessions = g_list_append (seat->priv->sessions, g_object_ref (s));
+
+ return TRUE;
+ }
+
+ /* Start a new display server for this session */
+
+ return TRUE;
+}
+
static gboolean
seat_real_start (Seat *seat)
{
display_server = create_display_server (seat);
g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
- /* Start new greeter or autologin session */
session = create_session (seat, display_server);
session_set_display_server (session, display_server);
+ /* Autologin or start a greeter */
if (autologin_timeout == 0 && autologin_guest)
{
session_set_pam_service (session, AUTOLOGIN_SERVICE);
wrapper = seat_get_string_property (seat, "session-wrapper");
session_name = user_get_xsession (user);
}
+ else
+ {
+ gchar *greeter_user;
+
+ session_set_pam_service (session, GREETER_SERVICE);
+ greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
+ session_set_username (session, greeter_user);
+ g_free (greeter_user);
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory");
+ wrapper = seat_get_string_property (seat, "session-wrapper");
+
+ seat->priv->greeter = greeter_new (session, USER_SERVICE, AUTOLOGIN_SERVICE);
+ g_signal_connect (seat->priv->greeter, "create-session", G_CALLBACK (greeter_create_session_cb), seat);
+ g_signal_connect (seat->priv->greeter, "start-session", G_CALLBACK (greeter_start_session_cb), seat);
+ }
if (!session_name)
session_name = user_session;