13
12
#include <config.h>
14
14
#include <stdlib.h>
15
15
#include <string.h>
16
18
#include <gio/gdesktopappinfo.h>
18
20
#include "display.h"
19
#include "configuration.h"
21
#include "display-glue.h"
22
#include "pam-session.h"
20
24
#include "ldm-marshal.h"
25
#include "ck-connector.h"
27
/* Length of time in milliseconds to wait for a session to load */
28
#define USER_SESSION_TIMEOUT 5000
30
/* Length of time in milliseconds to wait for a greeter to quit */
31
#define GREETER_QUIT_TIMEOUT 1000
36
42
static guint signals[LAST_SIGNAL] = { 0 };
47
SESSION_GREETER_PRE_CONNECT,
49
SESSION_GREETER_AUTHENTICATED,
38
53
struct DisplayPrivate
41
DisplayServer *display_server;
44
gchar *greeter_session;
46
/* TRUE if the user list should be shown */
47
gboolean greeter_hide_users;
49
/* TRUE if a manual login option should be shown */
50
gboolean greeter_show_manual_login;
52
/* TRUE if a remote login option should be shown */
53
gboolean greeter_show_remote_login;
55
/* TRUE if the greeter is a lock screen */
56
gboolean greeter_is_lock;
58
/* Session requested to log into */
59
SessionType user_session_type;
60
/* Number of times have logged in */
63
/* Language to use in greeter/sessions */
64
gchar *default_language;
66
/* Layout to use in greeter/sessions */
67
gchar *default_layout;
69
/* User to run greeter as */
62
75
/* Program to run sessions through */
63
76
gchar *session_wrapper;
65
/* TRUE if in a user session */
66
gboolean in_user_session;
68
/* TRUE if have got an X server / started a greeter */
74
/* Communication link to greeter */
77
/* User that should be automatically logged in */
78
gchar *autologin_user;
79
gboolean autologin_guest;
80
gint autologin_timeout;
82
/* TRUE if start greeter if fail to login */
83
gboolean start_greeter_if_fail;
85
/* Hint to select user in greeter */
86
gchar *select_user_hint;
87
gboolean select_guest_hint;
89
/* TRUE if allowed to log into guest account */
92
/* TRUE if greeter is to show the guest account */
93
gboolean greeter_allow_guest;
95
/* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
78
/* PAM service to authenticate against */
81
/* Greeter session process */
82
Session *greeter_session;
83
gboolean greeter_connected;
84
guint greeter_quit_timeout;
85
PAMSession *greeter_pam_session;
86
CkConnector *greeter_ck_session;
88
gboolean supports_transitions;
90
/* User session process */
91
Session *user_session;
92
guint user_session_timer;
93
PAMSession *user_pam_session;
94
CkConnector *user_ck_session;
96
/* Current D-Bus call context */
97
DBusGMethodInvocation *dbus_context;
99
/* Default login hint */
103
/* Default session */
104
gchar *default_session;
102
/* PAM services to use */
103
#define GREETER_SERVICE "lightdm-greeter"
104
#define USER_SERVICE "lightdm"
105
#define AUTOLOGIN_SERVICE "lightdm-autologin"
107
107
G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
109
static void greeter_session_stopped_cb (Session *session, Display *display);
110
static void user_session_stopped_cb (Session *session, Display *display);
109
static void start_greeter (Display *display);
111
// FIXME: Remove the index, it is an external property
113
display_new (DisplayServer *display_server)
115
Display *display = g_object_new (DISPLAY_TYPE, NULL);
117
display->priv->display_server = g_object_ref (display_server);
123
display_get_display_server (Display *display)
125
g_return_val_if_fail (display != NULL, NULL);
126
return display->priv->display_server;
130
display_get_username (Display *display)
132
g_return_val_if_fail (display != NULL, NULL);
134
if (!display->priv->session || !display->priv->in_user_session)
137
return session_get_username (display->priv->session);
141
display_get_session (Display *display)
143
g_return_val_if_fail (display != NULL, NULL);
144
return display->priv->session;
148
display_set_greeter_session (Display *display, const gchar *greeter_session)
150
g_return_if_fail (display != NULL);
151
g_free (display->priv->greeter_session);
152
display->priv->greeter_session = g_strdup (greeter_session);
113
display_new (gint index)
115
Display *self = g_object_new (DISPLAY_TYPE, NULL);
117
self->priv->index = index;
118
self->priv->pam_service = g_strdup (DEFAULT_PAM_SERVICE);
124
display_get_index (Display *display)
126
return display->priv->index;
156
130
display_set_session_wrapper (Display *display, const gchar *session_wrapper)
158
g_return_if_fail (display != NULL);
159
132
g_free (display->priv->session_wrapper);
160
display->priv->session_wrapper = g_strdup (session_wrapper);
164
display_set_allow_guest (Display *display, gboolean allow_guest)
166
g_return_if_fail (display != NULL);
167
display->priv->allow_guest = allow_guest;
171
display_set_greeter_allow_guest (Display *display, gboolean greeter_allow_guest)
173
g_return_if_fail (display != NULL);
174
display->priv->greeter_allow_guest = greeter_allow_guest;
178
display_set_autologin_user (Display *display, const gchar *username, gboolean is_guest, gint timeout)
180
g_return_if_fail (display != NULL);
181
g_free (display->priv->autologin_user);
182
display->priv->autologin_user = g_strdup (username);
183
display->priv->autologin_guest = is_guest;
184
display->priv->autologin_timeout = timeout;
188
display_set_select_user_hint (Display *display, const gchar *username, gboolean is_guest)
190
g_return_if_fail (display != NULL);
191
g_free (display->priv->select_user_hint);
192
display->priv->select_user_hint = g_strdup (username);
193
display->priv->select_guest_hint = is_guest;
197
display_set_hide_users_hint (Display *display, gboolean hide_users)
199
g_return_if_fail (display != NULL);
200
display->priv->greeter_hide_users = hide_users;
204
display_set_show_manual_login_hint (Display *display, gboolean show_manual_login)
206
g_return_if_fail (display != NULL);
207
display->priv->greeter_show_manual_login = show_manual_login;
211
display_set_show_remote_login_hint (Display *display, gboolean show_remote_login)
213
g_return_if_fail (display != NULL);
214
display->priv->greeter_show_remote_login = show_remote_login;
218
display_set_lock_hint (Display *display, gboolean is_lock)
220
g_return_if_fail (display != NULL);
221
display->priv->greeter_is_lock = is_lock;
225
display_set_user_session (Display *display, SessionType type, const gchar *session_name)
227
g_return_if_fail (display != NULL);
228
g_free (display->priv->user_session);
229
display->priv->user_session_type = type;
230
display->priv->user_session = g_strdup (session_name);
133
display->priv->session_wrapper = g_strdup (session_wrapper);
137
display_get_session_wrapper (Display *display)
139
return display->priv->session_wrapper;
143
display_set_default_user (Display *display, const gchar *username)
145
g_free (display->priv->default_user);
146
display->priv->default_user = g_strdup (username);
150
display_get_default_user (Display *display)
152
return display->priv->default_user;
156
display_set_default_user_timeout (Display *display, gint timeout)
158
display->priv->timeout = timeout;
162
display_get_default_user_timeout (Display *display)
164
return display->priv->timeout;
168
display_set_greeter_user (Display *display, const gchar *username)
170
g_free (display->priv->greeter_user);
171
if (username && username[0] != '\0')
172
display->priv->greeter_user = g_strdup (username);
174
display->priv->greeter_user = NULL;
178
display_get_greeter_user (Display *display)
180
return display->priv->greeter_user;
184
display_get_session_user (Display *display)
186
if (display->priv->user_session)
187
return pam_session_get_username (display->priv->user_pam_session);
193
display_set_greeter_theme (Display *display, const gchar *greeter_theme)
195
g_free (display->priv->greeter_theme);
196
display->priv->greeter_theme = g_strdup (greeter_theme);
200
display_get_greeter_theme (Display *display)
202
return display->priv->greeter_theme;
206
display_set_default_language (Display *display, const gchar *language)
208
g_free (display->priv->default_language);
209
display->priv->default_language = g_strdup (language);
213
display_get_default_language (Display *display)
215
return display->priv->default_language;
219
display_set_default_layout (Display *display, const gchar *layout)
221
g_free (display->priv->default_layout);
222
display->priv->default_layout = g_strdup (layout);
226
display_get_default_layout (Display *display)
228
return display->priv->default_layout;
232
display_set_default_session (Display *display, const gchar *session)
234
g_free (display->priv->default_session);
235
display->priv->default_session = g_strdup (session);
239
display_get_default_session (Display *display)
241
return display->priv->default_session;
245
display_set_pam_service (Display *display, const gchar *service)
247
g_free (display->priv->pam_service);
248
display->priv->pam_service = g_strdup (service);
252
display_get_pam_service (Display *display)
254
return display->priv->pam_service;
258
display_set_xserver (Display *display, XServer *xserver)
260
if (display->priv->xserver)
261
g_object_unref (display->priv->xserver);
262
display->priv->xserver = g_object_ref (xserver);
266
display_get_xserver (Display *display)
268
return display->priv->xserver;
271
static struct passwd *
272
get_user_info (const gchar *username)
274
struct passwd *user_info;
277
user_info = getpwnam (username);
281
g_warning ("Unable to get information on user %s: User does not exist", username);
283
g_warning ("Unable to get information on user %s: %s", username, strerror (errno));
290
start_ck_session (Display *display, const gchar *session_type, const gchar *username)
292
CkConnector *session;
294
char *display_device = NULL;
295
const gchar *address, *hostname = "";
296
struct passwd *user_info;
297
gboolean is_local = TRUE;
300
session = ck_connector_new ();
302
user_info = get_user_info (username);
306
if (xserver_get_vt (display->priv->xserver) >= 0)
307
display_device = g_strdup_printf ("/dev/tty%d", xserver_get_vt (display->priv->xserver));
309
dbus_error_init (&error);
310
address = xserver_get_address (display->priv->xserver);
311
result = ck_connector_open_session_with_parameters (session, &error,
312
"unix-user", &user_info->pw_uid,
313
"session-type", &session_type,
314
"x11-display", &address,
315
"x11-display-device", display_device ? &display_device : NULL,
316
"remote-host-name", &hostname,
317
"is-local", &is_local,
319
g_free (display_device);
323
g_warning ("Failed to open CK session: %s: %s", error.name, error.message);
324
ck_connector_unref (session);
234
display_set_is_ready (Display *display)
236
if (display->priv->is_ready)
239
display->priv->is_ready = TRUE;
240
g_signal_emit (display, signals[READY], 0);
244
switch_to_user (Display *display, User *user)
247
g_signal_emit (display, signals[SWITCH_TO_USER], 0, user, &result);
252
switch_to_guest (Display *display)
255
g_signal_emit (display, signals[SWITCH_TO_GUEST], 0, &result);
260
get_guest_username (Display *display)
263
g_signal_emit (display, signals[GET_GUEST_USERNAME], 0, &username);
268
create_session (Display *display)
272
g_signal_emit (display, signals[CREATE_SESSION], 0, &session);
332
end_ck_session (CkConnector *session)
276
/* Connect using the session bus */
279
if (g_getenv ("DBUS_SESSION_BUS_ADDRESS"))
280
session_set_env (session, "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
281
session_set_env (session, "LDM_BUS", "SESSION");
282
if (g_getenv ("LD_PRELOAD"))
283
session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
284
if (g_getenv ("LD_LIBRARY_PATH"))
285
session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
286
if (g_getenv ("PATH"))
287
session_set_env (session, "PATH", g_getenv ("PATH"));
290
/* Variables required for regression tests */
291
if (g_getenv ("LIGHTDM_TEST_ROOT"))
293
session_set_env (session, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT"));
294
session_set_env (session, "DBUS_SYSTEM_BUS_ADDRESS", g_getenv ("DBUS_SYSTEM_BUS_ADDRESS"));
295
session_set_env (session, "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
296
session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
297
session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
298
session_set_env (session, "GI_TYPELIB_PATH", g_getenv ("GI_TYPELIB_PATH"));
305
destroy_session (Display *display)
307
if (!display->priv->session)
310
g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
311
session_stop (display->priv->session);
312
g_object_unref (display->priv->session);
313
display->priv->session = NULL;
317
greeter_authentication_complete_cb (Session *session, Display *display)
319
gboolean result = FALSE;
321
if (display->priv->stopping)
324
if (session_get_is_authenticated (session))
326
g_debug ("Greeter authorized");
327
g_signal_emit (display, signals[START_GREETER], 0, &result);
331
g_debug ("Greeter failed authentication");
335
g_debug ("Greeter failed to start");
336
display_stop (display);
341
greeter_connected_cb (Greeter *greeter, Display *display)
343
// FIXME: Should wait for greeter to signal completely ready if it supports it
344
g_debug ("Greeter connected, display is ready");
345
display_set_is_ready (display);
349
greeter_start_authentication_cb (Greeter *greeter, const gchar *username, Display *display)
351
return create_session (display);
355
greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display)
357
/* If no session requested, use the previous one */
358
if (!session_name && !greeter_get_guest_authenticated (greeter))
362
user = session_get_user (greeter_get_authentication_session (greeter));
363
type = SESSION_TYPE_LOCAL;
364
session_name = user_get_xsession (user);
367
/* If a session was requested, override the default */
370
g_debug ("Using session %s", session_name);
371
display_set_user_session (display, type, session_name);
374
/* Stop this display if that session already exists and can switch to it */
375
if (greeter_get_guest_authenticated (greeter))
377
if (switch_to_guest (display))
380
/* Set to login as guest */
381
display_set_autologin_user (display, NULL, TRUE, 0);
385
if (switch_to_user (display, session_get_user (greeter_get_authentication_session (display->priv->greeter))))
389
/* Stop the greeter, the session will start when the greeter has quit */
390
g_debug ("Stopping greeter");
391
session_stop (display->priv->session);
397
start_greeter (Display *display)
402
destroy_session (display);
403
display->priv->session = create_session (display);
404
session_set_class (display->priv->session, XDG_SESSION_CLASS_GREETER);
405
g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (greeter_authentication_complete_cb), display);
407
/* Make communication link to greeter that will run on this session */
408
display->priv->greeter = greeter_new (display->priv->session, USER_SERVICE, AUTOLOGIN_SERVICE);
409
g_signal_connect (G_OBJECT (display->priv->greeter), "connected", G_CALLBACK (greeter_connected_cb), display);
410
g_signal_connect (G_OBJECT (display->priv->greeter), "start-authentication", G_CALLBACK (greeter_start_authentication_cb), display);
411
g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display);
412
if (display->priv->autologin_timeout)
414
gchar *value = g_strdup_printf ("%d", display->priv->autologin_timeout);
415
greeter_set_hint (display->priv->greeter, "autologin-timeout", value);
417
if (display->priv->autologin_user)
418
greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
419
else if (display->priv->autologin_guest)
420
greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
422
if (display->priv->select_user_hint)
423
greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
424
else if (display->priv->select_guest_hint)
425
greeter_set_hint (display->priv->greeter, "select-guest", "true");
426
greeter_set_hint (display->priv->greeter, "default-session", display->priv->user_session);
427
greeter_set_allow_guest (display->priv->greeter, display->priv->allow_guest);
428
greeter_set_hint (display->priv->greeter, "has-guest-account", (display->priv->allow_guest && display->priv->greeter_allow_guest) ? "true" : "false");
429
greeter_set_hint (display->priv->greeter, "hide-users", display->priv->greeter_hide_users ? "true" : "false");
430
greeter_set_hint (display->priv->greeter, "show-manual-login", display->priv->greeter_show_manual_login ? "true" : "false");
431
greeter_set_hint (display->priv->greeter, "show-remote-login", display->priv->greeter_show_remote_login ? "true" : "false");
432
if (display->priv->greeter_is_lock)
433
greeter_set_hint (display->priv->greeter, "lock-screen", "true");
435
/* Run greeter as unprivileged user */
439
user = accounts_get_current_user ();
440
greeter_user = g_strdup (user_get_name (user));
441
g_object_unref (user);
445
greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
448
g_warning ("Greeter must not be run as root");
449
display_stop (display);
454
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (greeter_session_stopped_cb), display);
455
result = greeter_start (display->priv->greeter, GREETER_SERVICE, greeter_user);
456
g_free (greeter_user);
459
display_stop (display);
465
autologin_authentication_complete_cb (Session *session, Display *display)
467
gboolean result = FALSE;
469
if (display->priv->stopping)
472
if (session_get_is_authenticated (session))
474
const gchar *session_name;
476
g_debug ("Autologin user %s authorized", session_get_username (session));
478
session_name = user_get_xsession (session_get_user (session));
481
g_debug ("Autologin using session %s", session_name);
482
display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
485
g_signal_emit (display, signals[START_SESSION], 0, &result);
489
g_debug ("Autologin failed authentication");
493
if (display->priv->start_greeter_if_fail)
494
start_greeter (display);
496
display_stop (display);
501
autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail, gboolean is_guest)
503
display->priv->start_greeter_if_fail = start_greeter_if_fail;
505
display->priv->in_user_session = TRUE;
506
destroy_session (display);
507
display->priv->session = create_session (display);
508
g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (autologin_authentication_complete_cb), display);
509
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
510
return session_start (display->priv->session, service, username, TRUE, FALSE, is_guest);
514
autologin_guest (Display *display, const gchar *service, gboolean start_greeter_if_fail)
519
username = get_guest_username (display);
522
g_debug ("Can't autologin guest, no guest account");
526
result = autologin (display, username, service, start_greeter_if_fail, TRUE);
533
get_session_command (const gchar *filename, const gchar *session_wrapper)
535
GKeyFile *session_desktop_file;
538
gchar *command = NULL, **argv, *path;
336
ck_connector_close_session (session, NULL); // FIXME: Handle errors
337
ck_connector_unref (session);
341
run_script (const gchar *script)
347
end_user_session (Display *display, gboolean clean_exit)
349
run_script ("PostSession");
351
g_signal_emit (display, signals[END_SESSION], 0, display->priv->user_session);
353
if (display->priv->user_session_timer)
355
g_source_remove (display->priv->user_session_timer);
356
display->priv->user_session_timer = 0;
359
g_object_unref (display->priv->user_session);
360
display->priv->user_session = NULL;
362
pam_session_end (display->priv->user_pam_session);
363
g_object_unref (display->priv->user_pam_session);
364
display->priv->user_pam_session = NULL;
366
end_ck_session (display->priv->user_ck_session);
367
display->priv->user_ck_session = NULL;
370
g_warning ("Session exited unexpectedly");
372
xserver_disconnect_clients (display->priv->xserver);
376
user_session_exited_cb (Session *session, gint status, Display *display)
378
end_user_session (display, status == 0);
382
user_session_killed_cb (Session *session, gint status, Display *display)
384
end_user_session (display, FALSE);
387
static void set_env_from_pam_session (Session *session, PAMSession *pam_session)
391
pam_env = pam_session_get_envlist (pam_session);
395
for (i = 0; pam_env[i]; i++)
397
g_debug ("pam_env[%d]=%s", i, pam_env[i]);
398
gchar **pam_env_vars = g_strsplit (pam_env[i], "=", 2);
399
if (pam_env_vars && pam_env_vars[0] && pam_env_vars[1])
400
session_set_env (session, pam_env_vars[0], pam_env_vars[1]);
402
g_warning ("Can't parse PAM environment variable %s", pam_env[i]);
403
g_strfreev (pam_env_vars);
405
g_strfreev (pam_env);
410
start_user_session (Display *display, const gchar *session, const gchar *language)
412
gchar *filename, *path;
413
struct passwd *user_info;
414
GKeyFile *dmrc_file, *session_desktop_file;
415
gboolean have_dmrc = FALSE, result;
539
416
GError *error = NULL;
541
/* Read the command from the .desktop file */
418
run_script ("PreSession");
420
g_debug ("Launching '%s' session for user %s", session, pam_session_get_username (display->priv->user_pam_session));
421
display->priv->login_count++;
423
/* Load the users login settings (~/.dmrc) */
424
dmrc_file = g_key_file_new ();
425
user_info = get_user_info (pam_session_get_username (display->priv->user_pam_session));
428
/* Load from the user directory, if this fails (e.g. the user directory
429
* is not yet mounted) then load from the cache */
430
path = g_build_filename (user_info->pw_dir, ".dmrc", NULL);
431
have_dmrc = g_key_file_load_from_file (dmrc_file, path, G_KEY_FILE_KEEP_COMMENTS, NULL);
435
/* If no .dmrc, then load from the cache */
438
filename = g_strdup_printf ("%s.dmrc", user_info->pw_name);
439
path = g_build_filename (CACHE_DIR, "dmrc", filename, NULL);
441
if (!g_key_file_load_from_file (dmrc_file, path, G_KEY_FILE_KEEP_COMMENTS, &error))
442
g_warning ("Failed to load .dmrc file %s: %s", path, error->message);
443
g_clear_error (&error);
447
/* Update the .dmrc with changed settings */
448
g_key_file_set_string (dmrc_file, "Desktop", "Session", session);
450
g_key_file_set_string (dmrc_file, "Desktop", "Language", language);
451
else if (!g_key_file_has_key (dmrc_file, "Desktop", "Language", NULL))
452
g_key_file_set_string (dmrc_file, "Desktop", "Language", display->priv->default_language);
453
if (!g_key_file_has_key (dmrc_file, "Desktop", "Layout", NULL))
454
g_key_file_set_string (dmrc_file, "Desktop", "Layout", display->priv->default_layout);
456
filename = g_strdup_printf ("%s.desktop", session);
457
path = g_build_filename (XSESSIONS_DIR, filename, NULL);
542
460
session_desktop_file = g_key_file_new ();
543
result = g_key_file_load_from_file (session_desktop_file, filename, G_KEY_FILE_NONE, &error);
545
g_debug ("Failed to load session file %s: %s", filename, error->message);
461
result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error);
465
g_warning ("Failed to load session file %s: %s:", path, error->message);
546
466
g_clear_error (&error);
549
command = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
551
g_debug ("No command in session file %s", filename);
470
gchar *session_command;
472
session_command = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
473
if (!session_command)
474
g_warning ("No command in session file %s", path);
476
display->priv->supports_transitions = g_key_file_get_boolean (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Supports-Transitions", NULL);
480
gchar *session_language, *layout;
484
if (display->priv->session_wrapper)
486
gchar *old_command = session_command;
487
session_command = g_strdup_printf ("%s '%s'", display->priv->session_wrapper, session_command);
488
g_free (old_command);
490
display->priv->user_session = session_new (pam_session_get_username (display->priv->user_pam_session), session_command);
492
session_language = g_key_file_get_string (dmrc_file, "Desktop", "Language", NULL);
494
layout = g_key_file_get_string (dmrc_file, "Desktop", "Layout", NULL);
496
g_signal_connect (G_OBJECT (display->priv->user_session), "exited", G_CALLBACK (user_session_exited_cb), display);
497
g_signal_connect (G_OBJECT (display->priv->user_session), "killed", G_CALLBACK (user_session_killed_cb), display);
498
session_set_env (display->priv->user_session, "DISPLAY", xserver_get_address (display->priv->xserver));
499
if (display->priv->user_ck_session)
500
session_set_env (display->priv->user_session, "XDG_SESSION_COOKIE", ck_connector_get_cookie (display->priv->user_ck_session));
501
session_set_env (display->priv->user_session, "DESKTOP_SESSION", session); // FIXME: Apparently deprecated?
502
session_set_env (display->priv->user_session, "GDMSESSION", session); // FIXME: Not cross-desktop
503
session_set_env (display->priv->user_session, "PATH", "/usr/local/bin:/usr/bin:/bin");
504
session_set_env (display->priv->user_session, "LANG", session_language);
505
session_set_env (display->priv->user_session, "GDM_LANG", session_language); // FIXME: Not cross-desktop
506
session_set_env (display->priv->user_session, "GDM_KEYBOARD_LAYOUT", layout); // FIXME: Not cross-desktop
507
set_env_from_pam_session (display->priv->user_session, display->priv->user_pam_session);
509
g_signal_emit (display, signals[START_SESSION], 0, display->priv->user_session);
511
session_start (display->priv->user_session);
513
data = g_key_file_to_data (dmrc_file, &length, NULL);
515
/* Update the users .dmrc */
518
path = g_build_filename (user_info->pw_dir, ".dmrc", NULL);
519
g_file_set_contents (path, data, length, NULL);
520
chown (path, user_info->pw_uid, user_info->pw_gid);
524
/* Update the .dmrc cache */
525
path = g_build_filename (CACHE_DIR, "dmrc", NULL);
526
g_mkdir_with_parents (path, 0700);
528
filename = g_strdup_printf ("%s.dmrc", pam_session_get_username (display->priv->user_pam_session));
529
path = g_build_filename (CACHE_DIR, "dmrc", filename, NULL);
530
g_file_set_contents (path, data, length, NULL);
534
g_free (session_language);
538
g_free (session_command);
553
541
g_key_file_free (session_desktop_file);
558
/* If configured, run sessions through a wrapper */
542
g_key_file_free (dmrc_file);
546
start_default_session (Display *display, const gchar *session, const gchar *language)
548
/* Don't need to check authentication, just authorize */
549
if (display->priv->user_pam_session)
550
pam_session_end (display->priv->user_pam_session);
551
display->priv->user_pam_session = pam_session_new (display->priv->pam_service, display->priv->default_user);
552
pam_session_authorize (display->priv->user_pam_session);
554
display->priv->user_ck_session = start_ck_session (display, "", pam_session_get_username (display->priv->user_pam_session));
555
start_user_session (display, session, language);
559
end_greeter_session (Display *display, gboolean clean_exit)
561
gboolean greeter_connected;
563
if (display->priv->greeter_quit_timeout)
561
argv = g_malloc (sizeof (gchar *) * 3);
562
path = g_find_program_in_path (session_wrapper);
563
argv[0] = path ? path : g_strdup (session_wrapper);
565
g_source_remove (display->priv->greeter_quit_timeout);
566
display->priv->greeter_quit_timeout = 0;
569
/* Split command into an array listing and make command absolute */
570
result = g_shell_parse_argv (command, &argc, &argv, &error);
572
g_debug ("Invalid session command '%s': %s", command, error->message);
569
g_signal_emit (display, signals[END_GREETER], 0, display->priv->greeter_session);
571
greeter_connected = display->priv->greeter_connected;
573
g_object_unref (display->priv->greeter_session);
574
display->priv->greeter_session = NULL;
575
display->priv->greeter_connected = FALSE;
577
pam_session_end (display->priv->greeter_pam_session);
578
g_object_unref (display->priv->greeter_pam_session);
579
display->priv->greeter_pam_session = NULL;
581
end_ck_session (display->priv->greeter_ck_session);
582
display->priv->greeter_ck_session = NULL;
585
g_warning ("Greeter failed");
586
else if (!greeter_connected)
587
g_warning ("Greeter quit before connecting");
588
else if (!display->priv->user_session)
589
g_warning ("Greeter quit before session started");
593
// FIXME: Issue with greeter, don't want to start a new one, report error to user
597
greeter_session_exited_cb (Session *session, gint status, Display *display)
599
end_greeter_session (display, status == 0);
603
greeter_session_killed_cb (Session *session, gint status, Display *display)
605
end_greeter_session (display, FALSE);
609
start_greeter (Display *display)
612
GError *error = NULL;
614
theme = load_theme (display->priv->greeter_theme, &error);
616
g_warning ("Failed to find theme %s: %s", display->priv->greeter_theme, error->message);
573
617
g_clear_error (&error);
577
path = g_find_program_in_path (argv[0]);
588
greeter_session_stopped_cb (Session *session, Display *display)
590
gboolean result = FALSE;
592
g_debug ("Greeter quit");
594
g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
595
g_object_unref (display->priv->session);
596
display->priv->session = NULL;
598
if (display->priv->stopping)
600
display_stop (display);
604
if (!display->priv->display_server)
607
/* Start the session for the authenticated user */
608
if (greeter_get_start_session (display->priv->greeter))
610
/* If guest, then start a new autologin guest session (so can setup account) */
611
if (greeter_get_guest_authenticated (display->priv->greeter))
612
result = autologin_guest (display, AUTOLOGIN_SERVICE, FALSE);
613
/* Otherwise, use the session the greeter has authenticated */
622
gchar *username = NULL;
624
g_debug ("Starting greeter %s as user %s", display->priv->greeter_theme,
625
display->priv->greeter_user ? display->priv->greeter_user : "<current>");
627
command = theme_get_command (theme);
629
if (display->priv->greeter_user)
630
username = display->priv->greeter_user;
616
destroy_session (display);
617
display->priv->session = g_object_ref (greeter_get_authentication_session (display->priv->greeter));
618
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
619
display->priv->in_user_session = TRUE;
620
g_signal_emit (display, signals[START_SESSION], 0, &result);
625
/* Destroy the greeter */
626
g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
627
g_object_unref (display->priv->greeter);
628
display->priv->greeter = NULL;
632
g_debug ("Failed to start greeter");
633
display_stop (display);
638
display_start_greeter (Display *display)
640
gchar *log_dir, *filename, *log_filename, *sessions_dir, *path;
643
/* Log the output of the greeter to a system location */
644
log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
645
filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (display->priv->display_server));
646
log_filename = g_build_filename (log_dir, filename, NULL);
649
g_debug ("Logging to %s", log_filename);
650
session_set_log_file (display->priv->session, log_filename);
651
g_free (log_filename);
653
/* Load the greeter session information */
654
sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
655
filename = g_strdup_printf ("%s.desktop", display->priv->greeter_session);
656
path = g_build_filename (sessions_dir, filename, NULL);
657
g_free (sessions_dir);
659
argv = get_session_command (path, NULL);
664
session_run (display->priv->session, argv);
633
struct passwd *user_info;
634
user_info = getpwuid (getuid ());
637
g_warning ("Unable to determine current username: %s", strerror (errno));
640
username = user_info->pw_name;
643
display->priv->greeter_pam_session = pam_session_new (display->priv->pam_service, username);
644
pam_session_authorize (display->priv->greeter_pam_session);
646
display->priv->greeter_ck_session = start_ck_session (display,
650
display->priv->greeter_connected = FALSE;
651
display->priv->greeter_session = session_new (username, command);
652
g_signal_connect (G_OBJECT (display->priv->greeter_session), "exited", G_CALLBACK (greeter_session_exited_cb), display);
653
g_signal_connect (G_OBJECT (display->priv->greeter_session), "killed", G_CALLBACK (greeter_session_killed_cb), display);
654
session_set_env (display->priv->greeter_session, "DISPLAY", xserver_get_address (display->priv->xserver));
655
if (display->priv->greeter_ck_session)
656
session_set_env (display->priv->greeter_session, "XDG_SESSION_COOKIE", ck_connector_get_cookie (display->priv->greeter_ck_session));
657
set_env_from_pam_session (display->priv->greeter_session, display->priv->greeter_pam_session);
659
g_signal_emit (display, signals[START_GREETER], 0, display->priv->greeter_session);
661
session_start (display->priv->greeter_session);
664
g_key_file_free (theme);
668
#define TYPE_MESSAGE dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID)
671
pam_messages_cb (PAMSession *session, int num_msg, const struct pam_message **msg, Display *display)
675
DBusGMethodInvocation *context;
677
/* Respond to d-bus query with messages */
678
request = g_ptr_array_new ();
679
for (i = 0; i < num_msg; i++)
681
GValue value = { 0 };
683
g_value_init (&value, TYPE_MESSAGE);
684
g_value_take_boxed (&value, dbus_g_type_specialized_construct (TYPE_MESSAGE));
685
// FIXME: Need to convert to UTF-8
686
dbus_g_type_struct_set (&value, 0, msg[i]->msg_style, 1, msg[i]->msg, G_MAXUINT);
687
g_ptr_array_add (request, g_value_get_boxed (&value));
690
context = display->priv->dbus_context;
691
display->priv->dbus_context = NULL;
692
dbus_g_method_return (context, 0, request);
696
authenticate_result_cb (PAMSession *session, int result, Display *display)
699
DBusGMethodInvocation *context;
701
g_debug ("Authenticate result for user %s: %s", pam_session_get_username (display->priv->user_pam_session), pam_session_strerror (display->priv->user_pam_session, result));
703
if (result == PAM_SUCCESS)
705
run_script ("PostLogin");
706
pam_session_authorize (session);
709
/* Respond to D-Bus request */
710
request = g_ptr_array_new ();
711
context = display->priv->dbus_context;
712
display->priv->dbus_context = NULL;
714
dbus_g_method_return (context, result, request);
718
session_started_cb (PAMSession *session, Display *display)
720
display->priv->user_ck_session = start_ck_session (display, "", pam_session_get_username (display->priv->user_pam_session));
724
display_connect (Display *display,
726
const gchar **language, const gchar **layout, const gchar **session,
727
const gchar **username, gint *delay, GError *error)
729
if (!display->priv->greeter_connected)
731
display->priv->greeter_connected = TRUE;
732
g_debug ("Greeter connected");
735
*theme = g_build_filename (THEME_DIR, display->priv->greeter_theme, "index.theme", NULL);
736
*language = g_strdup (display->priv->default_language);
737
*layout = g_strdup (display->priv->default_layout);
738
*session = g_strdup (display->priv->default_session);
739
*username = g_strdup (display->priv->default_user);
740
*delay = display->priv->timeout;
746
display_start_authentication (Display *display, const gchar *username, DBusGMethodInvocation *context)
748
GError *error = NULL;
750
// FIXME: Only allow calls from the correct greeter
752
if (!display->priv->greeter_session || display->priv->user_session)
754
dbus_g_method_return_error (context, NULL);
758
/* Abort existing authentication */
759
if (display->priv->user_pam_session)
761
g_signal_handlers_disconnect_matched (display->priv->user_pam_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
762
pam_session_end (display->priv->user_pam_session);
763
if (display->priv->dbus_context)
764
dbus_g_method_return_error (display->priv->dbus_context, NULL);
766
g_object_unref (display->priv->user_pam_session);
769
g_debug ("Greeter start authentication for %s", username);
771
/* Store D-Bus request to respond to */
772
display->priv->dbus_context = context;
774
display->priv->user_pam_session = pam_session_new (display->priv->pam_service, username);
775
g_signal_connect (G_OBJECT (display->priv->user_pam_session), "got-messages", G_CALLBACK (pam_messages_cb), display);
776
g_signal_connect (G_OBJECT (display->priv->user_pam_session), "authentication-result", G_CALLBACK (authenticate_result_cb), display);
777
g_signal_connect (G_OBJECT (display->priv->user_pam_session), "started", G_CALLBACK (session_started_cb), display);
779
if (!pam_session_start (display->priv->user_pam_session, &error))
781
g_warning ("Failed to start authentication: %s", error->message);
782
display->priv->dbus_context = NULL;
783
dbus_g_method_return_error (context, NULL);
786
g_clear_error (&error);
792
display_continue_authentication (Display *display, gchar **secrets, DBusGMethodInvocation *context)
795
const struct pam_message **messages;
796
struct pam_response *response;
797
int i, j, n_secrets = 0;
800
if (!display->priv->greeter_connected)
802
dbus_g_method_return_error (context, NULL);
806
/* Not in authorization */
807
if (display->priv->user_pam_session == NULL)
809
dbus_g_method_return_error (context, NULL);
813
/* Already in another call */
814
if (display->priv->dbus_context != NULL)
816
dbus_g_method_return_error (context, NULL);
820
// FIXME: Only allow calls from the correct greeter
822
num_messages = pam_session_get_num_messages (display->priv->user_pam_session);
823
messages = pam_session_get_messages (display->priv->user_pam_session);
825
/* Check correct number of responses */
826
for (i = 0; i < num_messages; i++)
828
int msg_style = messages[i]->msg_style;
829
if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON)
832
if (g_strv_length (secrets) != n_secrets)
834
pam_session_end (display->priv->user_pam_session);
835
// FIXME: Throw error
839
g_debug ("Continue authentication");
842
response = calloc (num_messages, sizeof (struct pam_response));
843
for (i = 0, j = 0; i < num_messages; i++)
845
int msg_style = messages[i]->msg_style;
846
if (msg_style == PAM_PROMPT_ECHO_OFF || msg_style == PAM_PROMPT_ECHO_ON)
848
response[i].resp = strdup (secrets[j]); // FIXME: Need to convert from UTF-8
853
display->priv->dbus_context = context;
854
pam_session_respond (display->priv->user_pam_session, response);
860
quit_greeter_cb (gpointer data)
862
Display *display = data;
863
g_warning ("Greeter did not quit, sending kill signal");
864
session_stop (display->priv->greeter_session);
865
display->priv->greeter_quit_timeout = 0;
870
quit_greeter (Display *display)
872
g_signal_emit (display, signals[QUIT_GREETER], 0);
873
if (display->priv->greeter_quit_timeout)
874
g_source_remove (display->priv->greeter_quit_timeout);
875
display->priv->greeter_quit_timeout = g_timeout_add (GREETER_QUIT_TIMEOUT, quit_greeter_cb, display);
879
session_timeout_cb (Display *display)
881
g_warning ("Session has not indicated it is ready, stopping greeter anyway");
883
/* Stop the greeter */
884
quit_greeter (display);
886
display->priv->user_session_timer = 0;
670
user_session_stopped_cb (Session *session, Display *display)
672
g_debug ("User session quit");
674
g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
675
g_object_unref (display->priv->session);
676
display->priv->session = NULL;
678
/* This display has ended */
679
display_stop (display);
683
prepend_argv (gchar ***argv, const gchar *value)
685
gchar **old_argv, **new_argv;
689
new_argv = g_malloc (sizeof (gchar *) * (g_strv_length (*argv) + 2));
690
new_argv[0] = g_strdup (value);
691
for (i = 0; old_argv[i]; i++)
692
new_argv[i + 1] = old_argv[i];
693
new_argv[i + 1] = NULL;
700
display_start_session (Display *display)
703
gchar *filename, *sessions_dir, *path;
706
user = session_get_user (display->priv->session);
708
/* Find the command to run for the selected session */
709
if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
891
display_login (Display *display, gchar *username, gchar *session, gchar *language, GError *error)
893
if (display->priv->user_session != NULL)
711
sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
713
/* Store this session name so we automatically use it next time */
714
user_set_xsession (user, display->priv->user_session);
895
g_warning ("Ignoring request to log in when already logged in");
717
sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
718
filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
719
path = g_build_filename (sessions_dir, filename, NULL);
720
g_free (sessions_dir);
722
argv = get_session_command (path, display->priv->session_wrapper);
899
g_debug ("Greeter login for user %s on session %s", username, session);
727
session_set_env (display->priv->session, "DESKTOP_SESSION", display->priv->user_session); // FIXME: Apparently deprecated?
728
session_set_env (display->priv->session, "GDMSESSION", display->priv->user_session); // FIXME: Not cross-desktop
730
/* Run a guest session through the wrapper covered by MAC */
731
if (display->priv->autologin_guest)
733
gchar *wrapper = g_build_filename (PKGLIBEXEC_DIR, "lightdm-guest-session-wrapper", NULL);
734
g_debug ("Running guest session through wrapper: %s", wrapper);
735
prepend_argv (&argv, wrapper);
739
g_debug ("Starting session %s as user %s", display->priv->user_session, session_get_username (display->priv->session));
741
session_run (display->priv->session, argv);
744
// FIXME: Wait for session to indicate it is ready (maybe)
745
display_set_is_ready (display);
751
display_server_stopped_cb (DisplayServer *server, Display *display)
753
g_debug ("Display server stopped");
755
g_signal_handlers_disconnect_matched (display->priv->display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
756
g_object_unref (display->priv->display_server);
757
display->priv->display_server = NULL;
759
/* Stop this display, it will be restarted by the seat if necessary */
760
display_stop (display);
764
display_server_ready_cb (DisplayServer *display_server, Display *display)
766
gboolean result = FALSE;
768
g_signal_emit (display, signals[DISPLAY_SERVER_READY], 0, &result);
771
display_stop (display);
901
/* Default session requested */
902
if (strcmp (session, "") == 0)
903
session = display->priv->default_session;
905
/* Default language requested */
906
if (strcmp (language, "") == 0)
909
if (display->priv->default_user && strcmp (username, display->priv->default_user) == 0)
910
start_default_session (display, session, language);
911
else if (display->priv->user_pam_session &&
912
pam_session_get_in_session (display->priv->user_pam_session) &&
913
strcmp (username, pam_session_get_username (display->priv->user_pam_session)) == 0)
914
start_user_session (display, session, language);
917
g_warning ("Ignoring request for login with unauthenticated user");
921
/* Stop session, waiting for user session to indicate it is ready (if supported) */
922
// FIXME: Hard-coded timeout
923
if (display->priv->supports_transitions)
924
display->priv->user_session_timer = g_timeout_add (USER_SESSION_TIMEOUT, (GSourceFunc) session_timeout_cb, display);
926
quit_greeter (display);
932
xserver_exit_cb (XServer *server, Display *display)
934
g_object_unref (display->priv->xserver);
935
display->priv->xserver = NULL;
936
g_signal_emit (display, signals[EXITED], 0);
940
xserver_ready_cb (XServer *xserver, Display *display)
942
run_script ("Init"); // FIXME: Async
775
944
/* Don't run any sessions on local terminals */
776
if (!display_server_get_start_local_sessions (display_server))
945
if (xserver_get_server_type (xserver) == XSERVER_TYPE_LOCAL_TERMINAL)
779
/* Automatically start requested user session */
781
if (display->priv->autologin_timeout == 0 && display->priv->autologin_guest)
783
g_debug ("Automatically logging in as guest");
784
result = autologin_guest (display, AUTOLOGIN_SERVICE, TRUE);
786
else if (display->priv->autologin_timeout == 0 && display->priv->autologin_user)
788
g_debug ("Automatically logging in user %s", display->priv->autologin_user);
789
result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE);
791
else if (display->priv->select_user_hint)
793
g_debug ("Logging in user %s", display->priv->select_user_hint);
794
result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE, FALSE);
797
/* If no session started, start a greeter */
800
g_debug ("Starting greeter");
801
result = start_greeter (display);
804
/* If nothing started, then the display can't work */
806
display_stop (display);
948
/* If have user then automatically login the first time */
949
if (display->priv->default_user && display->priv->timeout == 0 && display->priv->login_count == 0)
950
start_default_session (display, display->priv->default_session, NULL);
952
start_greeter (display);
810
956
display_start (Display *display)
812
g_return_val_if_fail (display != NULL, FALSE);
814
g_signal_connect (G_OBJECT (display->priv->display_server), "ready", G_CALLBACK (display_server_ready_cb), display);
815
g_signal_connect (G_OBJECT (display->priv->display_server), "stopped", G_CALLBACK (display_server_stopped_cb), display);
817
if (!display_server_start (display->priv->display_server))
824
display_stop (Display *display)
826
g_return_if_fail (display != NULL);
828
if (display->priv->stopped)
831
if (!display->priv->stopping)
833
g_debug ("Stopping display");
834
display->priv->stopping = TRUE;
837
/* Stop the session first */
838
if (display->priv->session)
840
session_stop (display->priv->session);
841
if (display->priv->session && !session_get_is_stopped (display->priv->session))
843
g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
844
g_object_unref (display->priv->session);
845
display->priv->session = NULL;
848
/* Stop the display server after that */
849
if (display->priv->display_server)
851
display_server_stop (display->priv->display_server);
852
if (display->priv->display_server && !display_server_get_is_stopped (display->priv->display_server))
854
g_signal_handlers_disconnect_matched (display->priv->display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
855
g_object_unref (display->priv->display_server);
856
display->priv->display_server = NULL;
859
display->priv->stopped = TRUE;
860
g_debug ("Display stopped");
861
g_signal_emit (display, signals[STOPPED], 0);
865
display_get_is_ready (Display *display)
867
g_return_val_if_fail (display != NULL, FALSE);
869
return display->priv->is_ready;
873
display_lock (Display *display)
875
g_return_if_fail (display != NULL);
877
if (!display->priv->session)
880
g_debug ("Locking display");
882
session_lock (display->priv->session);
886
display_unlock (Display *display)
888
g_return_if_fail (display != NULL);
890
if (!display->priv->session)
893
g_debug ("Unlocking display");
895
session_unlock (display->priv->session);
899
display_real_switch_to_user (Display *display, User *user)
905
display_real_switch_to_guest (Display *display)
911
display_real_get_guest_username (Display *display)
958
g_return_val_if_fail (display->priv->xserver != NULL, FALSE);
959
g_signal_connect (G_OBJECT (display->priv->xserver), "ready", G_CALLBACK (xserver_ready_cb), display);
960
g_signal_connect (G_OBJECT (display->priv->xserver), "exited", G_CALLBACK (xserver_exit_cb), display);
961
return xserver_start (display->priv->xserver);
917
965
display_init (Display *display)
919
967
display->priv = G_TYPE_INSTANCE_GET_PRIVATE (display, DISPLAY_TYPE, DisplayPrivate);
968
if (strcmp (GREETER_USER, "") != 0)
969
display->priv->greeter_user = g_strdup (GREETER_USER);
970
display->priv->greeter_theme = g_strdup (GREETER_THEME);
971
display->priv->default_language = getenv ("LANG") ? g_strdup (getenv ("LANG")) : g_strdup ("C");
972
display->priv->default_layout = g_strdup ("us"); // FIXME: Is there a better default to get?
973
display->priv->default_session = g_strdup (DEFAULT_SESSION);