165
169
exit (EXIT_SUCCESS);
175
gchar *x_authority_name;
176
guint16 x_authority_family;
177
guint8 *x_authority_address;
178
gsize x_authority_address_length;
179
gchar *x_authority_number;
180
guint8 *x_authority_data;
181
gsize x_authority_data_length;
183
x_authority_name = read_string ();
184
if (!x_authority_name)
187
read_data (&x_authority_family, sizeof (x_authority_family));
188
read_data (&x_authority_address_length, sizeof (x_authority_address_length));
189
x_authority_address = g_malloc (x_authority_address_length);
190
read_data (x_authority_address, x_authority_address_length);
191
x_authority_number = read_string ();
192
read_data (&x_authority_data_length, sizeof (x_authority_data_length));
193
x_authority_data = g_malloc (x_authority_data_length);
194
read_data (x_authority_data, x_authority_data_length);
196
return x_authority_new (x_authority_family, x_authority_address, x_authority_address_length, x_authority_number, x_authority_name, x_authority_data, x_authority_data_length);
169
200
session_child_run (int argc, char **argv)
187
218
gchar *remote_host_name;
190
XAuthority *xauthority = NULL;
191
gchar *xauth_filename;
220
XAuthority *x_authority = NULL;
221
gchar *x_authority_filename;
192
222
GDBusConnection *bus;
193
gchar *console_kit_cookie;
223
gchar *console_kit_cookie = NULL;
224
gchar *login1_session = NULL;
194
226
const gchar *path;
195
227
GError *error = NULL;
228
const gchar *locale_value;
230
static const gchar * const locale_var_names[] = {
197
242
#if !defined(GLIB_VERSION_2_36)
243
288
tty = read_string ();
244
289
remote_host_name = read_string ();
245
290
xdisplay = read_string ();
246
xauth_name = read_string ();
249
guint16 xauth_family;
250
guint8 *xauth_address;
251
gsize xauth_address_length;
254
gsize xauth_data_length;
256
read_data (&xauth_family, sizeof (xauth_family));
257
read_data (&xauth_address_length, sizeof (xauth_address_length));
258
xauth_address = g_malloc (xauth_address_length);
259
read_data (xauth_address, xauth_address_length);
260
xauth_number = read_string ();
261
read_data (&xauth_data_length, sizeof (xauth_data_length));
262
xauth_data = g_malloc (xauth_data_length);
263
read_data (xauth_data, xauth_data_length);
265
xauthority = xauth_new (xauth_family, xauth_address, xauth_address_length, xauth_number, xauth_name, xauth_data, xauth_data_length);
291
x_authority = read_xauth ();
269
294
result = pam_start (service, username, &conversation, &pam_handle);
283
308
pam_set_item (pam_handle, PAM_TTY, tty);
285
310
#ifdef PAM_XAUTHDATA
288
313
struct pam_xauth_data value;
290
value.name = (char *) xauth_get_authorization_name (xauthority);
291
value.namelen = strlen (xauth_get_authorization_name (xauthority));
292
value.data = (char *) xauth_get_authorization_data (xauthority);
293
value.datalen = xauth_get_authorization_data_length (xauthority);
315
value.name = (char *) x_authority_get_authorization_name (x_authority);
316
value.namelen = strlen (x_authority_get_authorization_name (x_authority));
317
value.data = (char *) x_authority_get_authorization_data (x_authority);
318
value.datalen = x_authority_get_authorization_data_length (x_authority);
294
319
pam_set_item (pam_handle, PAM_XAUTHDATA, &value);
335
360
pam_putenv (pam_handle, g_strdup_printf ("LOGNAME=%s", username));
336
361
pam_putenv (pam_handle, g_strdup_printf ("HOME=%s", user_get_home_directory (user)));
337
362
pam_putenv (pam_handle, g_strdup_printf ("SHELL=%s", user_get_shell (user)));
364
/* Let the greeter and user session inherit the system default locale */
365
for (i = 0; locale_var_names[i] != NULL; i++)
367
if ((locale_value = g_getenv (locale_var_names[i])) != NULL)
369
locale_var = g_strdup_printf ("%s=%s", locale_var_names[i], locale_value);
370
pam_putenv (pam_handle, locale_var);
360
396
/* Get the command to run (blocks) */
361
397
log_filename = read_string ();
362
xauth_filename = read_string ();
401
tty = read_string ();
403
x_authority_filename = read_string ();
407
xdisplay = read_string ();
409
g_object_unref (x_authority);
410
x_authority = read_xauth ();
363
412
read_data (&env_length, sizeof (env_length));
364
413
for (i = 0; i < env_length; i++)
365
414
pam_putenv (pam_handle, read_string ());
420
469
return EXIT_FAILURE;
422
/* Open a Console Kit session */
423
g_variant_builder_init (&ck_parameters, G_VARIANT_TYPE ("(a(sv))"));
424
g_variant_builder_open (&ck_parameters, G_VARIANT_TYPE ("a(sv)"));
425
g_variant_builder_add (&ck_parameters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user)));
426
if (g_strcmp0 (class, XDG_SESSION_CLASS_GREETER) == 0)
427
g_variant_builder_add (&ck_parameters, "(sv)", "session-type", g_variant_new_string ("LoginWindow"));
430
g_variant_builder_add (&ck_parameters, "(sv)", "x11-display", g_variant_new_string (xdisplay));
432
g_variant_builder_add (&ck_parameters, "(sv)", "x11-display-device", g_variant_new_string (tty));
434
if (remote_host_name)
436
g_variant_builder_add (&ck_parameters, "(sv)", "is-local", g_variant_new_boolean (FALSE));
437
g_variant_builder_add (&ck_parameters, "(sv)", "remote-host-name", g_variant_new_string (remote_host_name));
440
g_variant_builder_add (&ck_parameters, "(sv)", "is-local", g_variant_new_boolean (TRUE));
441
console_kit_cookie = ck_open_session (&ck_parameters);
442
write_string (console_kit_cookie);
443
if (console_kit_cookie)
446
value = g_strdup_printf ("XDG_SESSION_COOKIE=%s", console_kit_cookie);
447
pam_putenv (pam_handle, value);
471
if (login1_is_running ())
473
login1_session = login1_get_session_id ();
474
write_string (login1_session);
479
/* Open a Console Kit session */
480
g_variant_builder_init (&ck_parameters, G_VARIANT_TYPE ("(a(sv))"));
481
g_variant_builder_open (&ck_parameters, G_VARIANT_TYPE ("a(sv)"));
482
g_variant_builder_add (&ck_parameters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user)));
483
if (g_strcmp0 (class, XDG_SESSION_CLASS_GREETER) == 0)
484
g_variant_builder_add (&ck_parameters, "(sv)", "session-type", g_variant_new_string ("LoginWindow"));
487
g_variant_builder_add (&ck_parameters, "(sv)", "x11-display", g_variant_new_string (xdisplay));
489
g_variant_builder_add (&ck_parameters, "(sv)", "x11-display-device", g_variant_new_string (tty));
491
if (remote_host_name)
493
g_variant_builder_add (&ck_parameters, "(sv)", "is-local", g_variant_new_boolean (FALSE));
494
g_variant_builder_add (&ck_parameters, "(sv)", "remote-host-name", g_variant_new_string (remote_host_name));
497
g_variant_builder_add (&ck_parameters, "(sv)", "is-local", g_variant_new_boolean (TRUE));
498
console_kit_cookie = ck_open_session (&ck_parameters);
499
write_string (console_kit_cookie);
500
if (console_kit_cookie)
503
value = g_strdup_printf ("XDG_SESSION_COOKIE=%s", console_kit_cookie);
504
pam_putenv (pam_handle, value);
451
509
/* Write X authority */
454
512
gboolean drop_privileges, result;
551
609
memset (&ut, 0, sizeof (ut));
552
610
ut.ut_type = USER_PROCESS;
553
611
ut.ut_pid = child_pid;
554
strncpy (ut.ut_line, tty + strlen ("/dev/"), sizeof (ut.ut_line));
555
strncpy (ut.ut_id, xdisplay, sizeof (ut.ut_id));
613
strncpy (ut.ut_line, tty + strlen ("/dev/"), sizeof (ut.ut_line));
615
strncpy (ut.ut_id, xdisplay, sizeof (ut.ut_id));
556
616
strncpy (ut.ut_user, username, sizeof (ut.ut_user));
558
618
strncpy (ut.ut_host, xdisplay, sizeof (ut.ut_host));
580
640
memset (&ut, 0, sizeof (ut));
581
641
ut.ut_type = DEAD_PROCESS;
582
642
ut.ut_pid = child_pid;
583
strncpy (ut.ut_line, tty + strlen ("/dev/"), sizeof (ut.ut_line));
584
strncpy (ut.ut_id, xdisplay, sizeof (ut.ut_id));
644
strncpy (ut.ut_line, tty + strlen ("/dev/"), sizeof (ut.ut_line));
646
strncpy (ut.ut_id, xdisplay, sizeof (ut.ut_id));
585
647
strncpy (ut.ut_user, username, sizeof (ut.ut_user));
587
649
strncpy (ut.ut_host, xdisplay, sizeof (ut.ut_host));