258
258
if (result == PAM_SUCCESS)
260
const gchar *session_name;
260
262
g_debug ("User %s authorized", pam_session_get_username (authentication));
264
session_name = user_get_xsession (pam_session_get_user (authentication));
267
g_debug ("Using session %s", session_name);
268
display_set_user_session (display, session_name);
261
271
started_session = start_user_session (display, authentication);
262
272
if (!started_session)
263
273
g_debug ("Failed to start autologin session");
394
create_session (Display *display, PAMSession *authentication, const gchar *session_name, gboolean is_greeter, const gchar *log_filename)
404
create_session (Display *display, PAMSession *authentication, const gchar *session_name, gboolean is_greeter)
396
406
gchar *sessions_dir, *filename, *path, *command = NULL;
397
407
GKeyFile *session_desktop_file;
398
410
Session *session;
400
412
GError *error = NULL;
402
g_debug ("Starting session %s as user %s logging to %s", session_name, pam_session_get_username (authentication), log_filename);
414
g_debug ("Starting session %s as user %s", session_name, pam_session_get_username (authentication));
404
416
// FIXME: This is X specific, move into xsession.c
442
result = g_shell_parse_argv (command, &argc, &argv, &error);
444
g_debug ("Invalid session command '%s': %s", command, error->message);
445
g_clear_error (&error);
450
/* Convert to full path */
451
path = g_find_program_in_path (argv[0]);
457
command = g_strjoinv (" ", argv);
429
459
if (display->priv->session_wrapper && !is_greeter)
473
/* for a guest session, run command through the wrapper covered by MAC */
474
if (display->priv->autologin_guest)
477
command = g_strdup_printf (LIBEXEC_DIR "/lightdm-guest-session-wrapper %s", command);
478
g_debug("Guest session, running session command through wrapper: %s", command);
443
482
g_signal_emit (display, signals[CREATE_SESSION], 0, &session);
444
483
g_return_val_if_fail (session != NULL, NULL);
450
489
session_set_is_greeter (session, is_greeter);
451
490
session_set_authentication (session, authentication);
452
491
session_set_command (session, command);
454
494
session_set_env (session, "DESKTOP_SESSION", session_name); // FIXME: Apparently deprecated?
455
495
session_set_env (session, "GDMSESSION", session_name); // FIXME: Not cross-desktop
457
session_set_log_file (session, log_filename);
459
497
/* Connect using the session bus */
460
498
if (getuid () != 0)
508
546
greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display)
510
/* Store the session to use, use the default if none was requested */
548
/* If no session requested, use the previous one */
549
if (!session_name && !greeter_get_guest_authenticated (greeter))
553
user = pam_session_get_user (greeter_get_authentication (greeter));
554
session_name = user_get_xsession (user);
557
/* If a session was requested, override the default */
511
558
if (session_name)
513
g_free (display->priv->user_session);
514
display->priv->user_session = g_strdup (session_name);
560
g_debug ("Using session %s", session_name);
561
display_set_user_session (display, session_name);
517
564
/* Stop this display if that session already exists and can switch to it */
541
greeter_pam_messages_cb (PAMSession *authentication, int num_msg, const struct pam_message **msg, Display *display)
543
g_debug ("Greeter user got prompt, aborting authentication");
544
pam_session_cancel (authentication);
548
greeter_authentication_result_cb (PAMSession *authentication, int result, Display *display)
550
gboolean start_result = FALSE;
552
if (result == PAM_SUCCESS)
553
g_signal_emit (display, signals[START_GREETER], 0, &start_result);
555
g_debug ("Greeter user failed authentication");
558
display_stop (display);
562
588
start_greeter_session (Display *display)
565
591
gchar *log_dir, *filename, *log_filename;
566
592
PAMSession *authentication;
568
GError *error = NULL;
593
gboolean start_result;
595
g_return_val_if_fail (display->priv->session == NULL, FALSE);
596
g_return_val_if_fail (display->priv->greeter == NULL, FALSE);
570
598
g_debug ("Starting greeter session");
592
620
display->priv->in_user_session = FALSE;
622
/* Authenticate as the requested user */
623
authentication = pam_session_new (display->priv->pam_service, user_get_name (user));
624
g_object_unref (user);
626
display->priv->session = create_session (display, authentication, display->priv->greeter_session, TRUE);
627
g_object_unref (authentication);
629
if (!display->priv->session)
594
632
log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
595
633
filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (display->priv->display_server));
596
634
log_filename = g_build_filename (log_dir, filename, NULL);
597
635
g_free (log_dir);
598
636
g_free (filename);
600
/* Authenticate as the requested user */
601
authentication = pam_session_new (display->priv->pam_autologin_service, user_get_name (user));
602
g_signal_connect (G_OBJECT (authentication), "got-messages", G_CALLBACK (greeter_pam_messages_cb), display);
603
g_signal_connect (G_OBJECT (authentication), "authentication-result", G_CALLBACK (greeter_authentication_result_cb), display);
604
g_object_unref (user);
606
display->priv->session = create_session (display, authentication, display->priv->greeter_session, TRUE, log_filename);
607
g_object_unref (authentication);
638
g_debug ("Logging to %s", log_filename);
639
session_set_log_file (display->priv->session, log_filename, FALSE);
608
640
g_free (log_filename);
610
if (!display->priv->session)
613
642
display->priv->greeter = greeter_new (display->priv->session);
614
643
g_signal_connect (G_OBJECT (display->priv->greeter), "connected", G_CALLBACK (greeter_connected_cb), display);
615
644
g_signal_connect (G_OBJECT (display->priv->greeter), "start-authentication", G_CALLBACK (greeter_start_authentication_cb), display);
633
662
greeter_set_hint (display->priv->greeter, "has-guest-account", display->priv->allow_guest ? "true" : "false");
634
663
greeter_set_hint (display->priv->greeter, "hide-users", display->priv->greeter_hide_users ? "true" : "false");
636
result = pam_session_authenticate (session_get_authentication (display->priv->session), &error);
638
g_debug ("Error authenticating greeter user: %s", error->message);
639
g_clear_error (&error);
665
start_result = FALSE;
666
g_signal_emit (display, signals[START_GREETER], 0, &start_result);
668
return !start_result;
671
698
gchar *log_filename;
701
g_return_val_if_fail (display->priv->session == NULL, FALSE);
674
703
g_debug ("Starting user session");
676
705
user = pam_session_get_user (authentication);
678
707
/* Update user's xsession setting */
679
708
user_set_xsession (user, display->priv->user_session);
710
display->priv->session = create_session (display, authentication, display->priv->user_session, FALSE);
712
if (!display->priv->session)
681
715
// FIXME: Copy old error file
682
716
log_filename = g_build_filename (user_get_home_directory (user), ".xsession-errors", NULL);
718
/* Delete existing log file if it exists - a bug in 1.0.0 would cause this file to be written as root */
719
unlink (log_filename);
684
display->priv->session = create_session (display, authentication, display->priv->user_session, FALSE, log_filename);
721
g_debug ("Logging to %s", log_filename);
722
session_set_log_file (display->priv->session, log_filename, TRUE);
685
723
g_free (log_filename);
687
if (!display->priv->session)
690
725
g_signal_emit (display, signals[START_SESSION], 0, &result);
730
g_object_unref (display->priv->session);
731
display->priv->session = NULL;