83
101
/* Console kit cookie */
84
102
gchar *console_kit_cookie;
105
gchar *login1_session;
86
107
/* Environment to set in child */
110
/* Command to run in child */
113
/* True if have run command */
114
gboolean command_run;
116
/* TRUE if stopping this session */
90
120
/* Maximum length of a string to pass between daemon and session */
91
121
#define MAX_STRING_LENGTH 65535
93
G_DEFINE_TYPE (Session, session, G_TYPE_OBJECT);
123
static void session_logger_iface_init (LoggerInterface *iface);
125
G_DEFINE_TYPE_WITH_CODE (Session, session, G_TYPE_OBJECT,
126
G_IMPLEMENT_INTERFACE (
127
LOGGER_TYPE, session_logger_iface_init));
132
return g_object_new (SESSION_TYPE, NULL);
136
session_set_session_type (Session *session, const gchar *session_type)
138
g_return_if_fail (session != NULL);
139
g_free (session->priv->session_type);
140
session->priv->session_type = g_strdup (session_type);
144
session_get_session_type (Session *session)
146
g_return_val_if_fail (session != NULL, NULL);
147
return session->priv->session_type;
151
session_set_pam_service (Session *session, const gchar *pam_service)
153
g_return_if_fail (session != NULL);
154
g_free (session->priv->pam_service);
155
session->priv->pam_service = g_strdup (pam_service);
159
session_set_username (Session *session, const gchar *username)
161
g_return_if_fail (session != NULL);
162
g_free (session->priv->username);
163
session->priv->username = g_strdup (username);
167
session_set_do_authenticate (Session *session, gboolean do_authenticate)
169
g_return_if_fail (session != NULL);
170
session->priv->do_authenticate = do_authenticate;
174
session_set_is_interactive (Session *session, gboolean is_interactive)
176
g_return_if_fail (session != NULL);
177
session->priv->is_interactive = is_interactive;
181
session_set_is_guest (Session *session, gboolean is_guest)
183
g_return_if_fail (session != NULL);
184
session->priv->is_guest = is_guest;
188
session_get_is_guest (Session *session)
190
g_return_val_if_fail (session != NULL, FALSE);
191
return session->priv->is_guest;
96
195
session_set_log_file (Session *session, const gchar *filename)
142
265
session->priv->remote_host_name = g_strdup (remote_host_name);
269
find_env_entry (Session *session, const gchar *name)
273
for (link = session->priv->env; link; link = link->next)
275
const gchar *entry = link->data;
277
if (g_str_has_prefix (entry, name) && entry[strlen (name)] == '=')
146
285
session_set_env (Session *session, const gchar *name, const gchar *value)
148
g_return_if_fail (session != NULL);
149
session->priv->env = g_list_append (session->priv->env, g_strdup_printf ("%s=%s", name, value));
290
g_return_if_fail (session != NULL);
291
g_return_if_fail (value != NULL);
293
entry = g_strdup_printf ("%s=%s", name, value);
295
link = find_env_entry (session, name);
302
session->priv->env = g_list_append (session->priv->env, entry);
306
session_unset_env (Session *session, const gchar *name)
310
g_return_if_fail (session != NULL);
312
link = find_env_entry (session, name);
317
session->priv->env = g_list_remove_link (session->priv->env, link);
321
session_set_argv (Session *session, gchar **argv)
323
g_return_if_fail (session != NULL);
324
session->priv->argv = g_strdupv (argv);
181
356
write_data (session, value, sizeof (char) * length);
360
write_xauth (Session *session, XAuthority *x_authority)
367
write_string (session, NULL);
371
write_string (session, x_authority_get_authorization_name (session->priv->x_authority));
372
family = x_authority_get_family (session->priv->x_authority);
373
write_data (session, &family, sizeof (family));
374
length = x_authority_get_address_length (session->priv->x_authority);
375
write_data (session, &length, sizeof (length));
376
write_data (session, x_authority_get_address (session->priv->x_authority), length);
377
write_string (session, x_authority_get_number (session->priv->x_authority));
378
length = x_authority_get_authorization_data_length (session->priv->x_authority);
379
write_data (session, &length, sizeof (length));
380
write_data (session, x_authority_get_authorization_data (session->priv->x_authority), length);
185
384
read_from_child (Session *session, void *buf, size_t count)
188
387
n_read = read (session->priv->from_child_output, buf, count);
190
g_warning ("Error reading from session: %s", strerror (errno));
389
l_warning (session, "Error reading from session: %s", strerror (errno));
220
419
Session *session = data;
222
session->priv->pid = 0;
224
421
if (WIFEXITED (status))
225
g_debug ("Session %d exited with return value %d", pid, WEXITSTATUS (status));
422
l_debug (session, "Exited with return value %d", WEXITSTATUS (status));
226
423
else if (WIFSIGNALED (status))
227
g_debug ("Session %d terminated with signal %d", pid, WTERMSIG (status));
424
l_debug (session, "Terminated with signal %d", WTERMSIG (status));
426
/* do this as late as possible for log messages prefix */
427
session->priv->pid = 0;
229
429
/* If failed during authentication then report this as an authentication failure */
230
430
if (session->priv->authentication_started && !session->priv->authentication_complete)
232
g_debug ("Session %d failed during authentication", pid);
432
l_debug (session, "Failed during authentication");
233
433
session->priv->authentication_complete = TRUE;
234
434
session->priv->authentication_result = PAM_CONV_ERR;
235
435
g_free (session->priv->authentication_result_string);
236
436
session->priv->authentication_result_string = g_strdup ("Authentication stopped before completion");
237
g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_COMPLETE], 0);
437
g_signal_emit (G_OBJECT (session), signals[AUTHENTICATION_COMPLETE], 0);
240
440
g_signal_emit (G_OBJECT (session), signals[STOPPED], 0);
311
511
for (i = 0; i < session->priv->messages_length; i++)
313
513
struct pam_message *m = &session->priv->messages[i];
314
read_from_child (session, &m->msg_style, sizeof (m->msg_style));
514
read_from_child (session, &m->msg_style, sizeof (m->msg_style));
315
515
m->msg = read_string_from_child (session);
318
g_debug ("Session %d got %d message(s) from PAM", session->priv->pid, session->priv->messages_length);
518
l_debug (session, "Got %d message(s) from PAM", session->priv->messages_length);
320
520
g_signal_emit (G_OBJECT (session), signals[GOT_MESSAGES], 0);
327
session_start (Session *session, const gchar *service, const gchar *username, gboolean do_authenticate, gboolean is_interactive, gboolean is_guest)
527
session_start (Session *session)
529
g_return_val_if_fail (session != NULL, FALSE);
530
return SESSION_GET_CLASS (session)->start (session);
534
session_get_is_started (Session *session)
536
return session->priv->pid != 0;
540
session_real_start (Session *session)
330
543
int to_child_pipe[2], from_child_pipe[2];
331
544
int to_child_output, from_child_input;
333
g_return_val_if_fail (session != NULL, FALSE);
334
g_return_val_if_fail (service != NULL, FALSE);
335
546
g_return_val_if_fail (session->priv->pid == 0, FALSE);
548
if (session->priv->display_server)
549
display_server_connect_session (session->priv->display_server, session);
337
551
/* Create pipes to talk to the child */
338
552
if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0)
391
605
/* Close the ends of the pipes we don't need */
392
606
close (to_child_output);
393
607
close (from_child_input);
395
609
/* Indicate what version of the protocol we are using */
397
611
write_data (session, &version, sizeof (version));
399
613
/* Send configuration */
400
write_string (session, service);
401
write_string (session, username);
402
write_data (session, &do_authenticate, sizeof (do_authenticate));
403
write_data (session, &is_interactive, sizeof (is_interactive));
614
write_string (session, session->priv->pam_service);
615
write_string (session, session->priv->username);
616
write_data (session, &session->priv->do_authenticate, sizeof (session->priv->do_authenticate));
617
write_data (session, &session->priv->is_interactive, sizeof (session->priv->is_interactive));
404
618
write_string (session, session->priv->class);
405
619
write_string (session, session->priv->tty);
406
620
write_string (session, session->priv->remote_host_name);
407
621
write_string (session, session->priv->xdisplay);
408
if (session->priv->xauthority)
413
write_string (session, xauth_get_authorization_name (session->priv->xauthority));
414
family = xauth_get_family (session->priv->xauthority);
415
write_data (session, &family, sizeof (family));
416
length = xauth_get_address_length (session->priv->xauthority);
417
write_data (session, &length, sizeof (length));
418
write_data (session, xauth_get_address (session->priv->xauthority), length);
419
write_string (session, xauth_get_number (session->priv->xauthority));
420
length = xauth_get_authorization_data_length (session->priv->xauthority);
421
write_data (session, &length, sizeof (length));
422
write_data (session, xauth_get_authorization_data (session->priv->xauthority), length);
425
write_string (session, NULL);
427
g_debug ("Started session %d with service '%s', username '%s'", session->priv->pid, service, username);
622
write_xauth (session, session->priv->x_authority);
624
l_debug (session, "Started with service '%s', username '%s'", session->priv->pam_service, session->priv->username);
514
session_run (Session *session, gchar **argv)
711
session_run (Session *session)
713
g_return_if_fail (session->priv->display_server != NULL);
714
return SESSION_GET_CLASS (session)->run (session);
718
session_real_run (Session *session)
517
gchar *command, *filename;
721
gchar *command, *x_authority_filename;
520
724
g_return_if_fail (session != NULL);
725
g_return_if_fail (!session->priv->command_run);
521
726
g_return_if_fail (session_get_is_authenticated (session));
523
command = g_strjoinv (" ", argv);
524
g_debug ("Session %d running command %s", session->priv->pid, command);
727
g_return_if_fail (session->priv->argv != NULL);
728
g_return_if_fail (session->priv->pid != 0);
730
display_server_connect_session (session->priv->display_server, session);
732
session->priv->command_run = TRUE;
734
command = g_strjoinv (" ", session->priv->argv);
735
l_debug (session, "Running command %s", command);
525
736
g_free (command);
527
738
/* Create authority location */
528
if (session->priv->xauth_use_system_location)
739
if (session->priv->x_authority_use_system_location)
530
741
gchar *run_dir, *dir;
532
run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory");
743
run_dir = config_get_string (config_get_instance (), "LightDM", "run-directory");
533
744
dir = g_build_filename (run_dir, session->priv->username, NULL);
534
745
g_free (run_dir);
536
747
if (g_mkdir_with_parents (dir, S_IRWXU) < 0)
537
g_warning ("Failed to set create system authority dir %s: %s", dir, strerror (errno));
748
l_warning (session, "Failed to set create system authority dir %s: %s", dir, strerror (errno));
538
749
if (getuid () == 0)
540
751
if (chown (dir, user_get_uid (session_get_user (session)), user_get_gid (session_get_user (session))) < 0)
541
g_warning ("Failed to set ownership of user authority dir: %s", strerror (errno));
752
l_warning (session, "Failed to set ownership of user authority dir: %s", strerror (errno));
544
filename = g_build_filename (dir, "xauthority", NULL);
755
x_authority_filename = g_build_filename (dir, "xauthority", NULL);
548
filename = g_build_filename (user_get_home_directory (session_get_user (session)), ".Xauthority", NULL);
759
x_authority_filename = g_build_filename (user_get_home_directory (session_get_user (session)), ".Xauthority", NULL);
761
if (session->priv->log_filename)
762
l_debug (session, "Logging to %s", session->priv->log_filename);
550
763
write_string (session, session->priv->log_filename);
551
write_string (session, filename);
764
write_string (session, session->priv->tty);
765
write_string (session, x_authority_filename);
766
g_free (x_authority_filename);
767
write_string (session, session->priv->xdisplay);
768
write_xauth (session, session->priv->x_authority);
553
769
argc = g_list_length (session->priv->env);
554
770
write_data (session, &argc, sizeof (argc));
555
771
for (link = session->priv->env; link; link = link->next)
556
772
write_string (session, (gchar *) link->data);
557
argc = g_strv_length (argv);
773
argc = g_strv_length (session->priv->argv);
558
774
write_data (session, &argc, sizeof (argc));
559
775
for (i = 0; i < argc; i++)
560
write_string (session, argv[i]);
776
write_string (session, session->priv->argv[i]);
562
session->priv->console_kit_cookie = read_string_from_child (session);
778
if (login1_is_running ())
779
session->priv->login1_session = read_string_from_child (session);
780
if (!session->priv->login1_session)
781
session->priv->console_kit_cookie = read_string_from_child (session);
566
785
session_lock (Session *session)
568
787
g_return_if_fail (session != NULL);
569
788
if (getuid () == 0)
570
ck_lock_session (session->priv->console_kit_cookie);
790
if (session->priv->login1_session)
791
login1_lock_session (session->priv->login1_session);
792
else if (session->priv->console_kit_cookie)
793
ck_lock_session (session->priv->console_kit_cookie);
574
798
session_unlock (Session *session)
576
800
g_return_if_fail (session != NULL);
577
801
if (getuid () == 0)
578
ck_unlock_session (session->priv->console_kit_cookie);
803
if (session->priv->login1_session)
804
login1_unlock_session (session->priv->login1_session);
805
else if (session->priv->console_kit_cookie)
806
ck_unlock_session (session->priv->console_kit_cookie);
582
811
session_stop (Session *session)
584
813
g_return_if_fail (session != NULL);
815
if (session->priv->stopping)
817
session->priv->stopping = TRUE;
819
return SESSION_GET_CLASS (session)->stop (session);
823
session_real_stop (Session *session)
825
g_return_if_fail (session != NULL);
586
827
if (session->priv->pid > 0)
588
g_debug ("Session %d: Sending SIGTERM", session->priv->pid);
829
l_debug (session, "Sending SIGTERM");
589
830
kill (session->priv->pid, SIGTERM);
590
831
// FIXME: Handle timeout
834
g_signal_emit (G_OBJECT (session), signals[STOPPED], 0);
595
session_get_is_stopped (Session *session)
838
session_get_is_stopping (Session *session)
597
g_return_val_if_fail (session != NULL, TRUE);
598
return session->priv->pid == 0;
840
g_return_val_if_fail (session != NULL, FALSE);
841
return session->priv->stopping;
602
845
session_init (Session *session)
604
847
session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate);
848
session->priv->log_filename = g_strdup (".xsession-errors");