Changeset View
Changeset View
Standalone View
Standalone View
x11/gdm/files/patch-daemon_gdm-session-worker.c
$OpenBSD: patch-daemon_gdm-session-worker_c,v 1.15 2017/03/12 12:58:03 nigel Exp $ | --- daemon/gdm-session-worker.c.orig 2022-01-12 14:15:56 UTC | ||||
+++ daemon/gdm-session-worker.c | |||||
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit) | |||||
From 1ac67f522f5690c27023d98096ca817f12f7eb88 Mon Sep 17 00:00:00 2001 | |||||
From: Ray Strode <rstrode@redhat.com> | |||||
Date: Fri, 12 Jun 2015 13:28:01 -0400 | |||||
Subject: drop consolekit support | |||||
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit) | |||||
From 9be58c9ec9a3a411492a5182ac4b0d51fdc3a323 Mon Sep 17 00:00:00 2001 | |||||
From: Ray Strode <rstrode@redhat.com> | |||||
Date: Fri, 12 Jun 2015 13:48:52 -0400 | |||||
Subject: require logind support | |||||
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit) | |||||
From a9cacb929470eb82582396984c61d5b611bfeb1a Mon Sep 17 00:00:00 2001 | |||||
From: Ray Strode <rstrode@redhat.com> | |||||
Date: Fri, 12 Jun 2015 14:33:40 -0400 | |||||
Subject: session: drop session-type property | |||||
REVERT - OpenBSD does not have a systemd implementation (we need ConsoleKit) | |||||
From 6942fb9b16bab7173bbd295fb19a9770289dbe0e Mon Sep 17 00:00:00 2001 | |||||
From: Tim Lunn <tim@feathertop.org> | |||||
Date: Mon, 11 Apr 2016 23:18:10 +1000 | |||||
Subject: gdm-session: set PAM_TTY when initialising pam | |||||
--- daemon/gdm-session-worker.c.orig 2017-10-31 18:16:51.000000000 +0100 | |||||
+++ daemon/gdm-session-worker.c 2018-01-17 17:38:41.826277000 +0100 | |||||
@@ -28,9 +28,11 @@ | @@ -28,9 +28,11 @@ | ||||
#include <string.h> | #include <string.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <sys/wait.h> | #include <sys/wait.h> | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
#include <sys/ioctl.h> | #include <sys/ioctl.h> | ||||
#include <sys/vt.h> | #include <sys/vt.h> | ||||
#include <sys/kd.h> | #include <sys/kd.h> | ||||
+#endif | +#endif | ||||
#include <errno.h> | #include <errno.h> | ||||
#include <grp.h> | #include <grp.h> | ||||
#include <pwd.h> | #include <pwd.h> | ||||
@@ -49,7 +51,9 @@ | @@ -49,7 +51,9 @@ | ||||
#include <X11/Xauth.h> | #include <X11/Xauth.h> | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
#include <systemd/sd-daemon.h> | #include <systemd/sd-daemon.h> | ||||
+#endif | +#endif | ||||
#ifdef ENABLE_SYSTEMD_JOURNAL | #ifdef ENABLE_SYSTEMD_JOURNAL | ||||
#include <systemd/sd-journal.h> | #include <systemd/sd-journal.h> | ||||
@@ -93,7 +97,7 @@ | @@ -94,7 +98,7 @@ | ||||
#endif | #endif | ||||
#ifndef GDM_SESSION_DEFAULT_PATH | #ifndef GDM_SESSION_DEFAULT_PATH | ||||
-#define GDM_SESSION_DEFAULT_PATH "/usr/local/bin:/usr/bin:/bin" | -#define GDM_SESSION_DEFAULT_PATH "/usr/local/bin:/usr/bin:/bin" | ||||
+#define GDM_SESSION_DEFAULT_PATH "%%LOCALBASE%%/bin:/usr/bin:/bin" | +#define GDM_SESSION_DEFAULT_PATH "%%LOCALBASE%%/bin:/usr/bin:/bin" | ||||
#endif | #endif | ||||
#ifndef GDM_SESSION_ROOT_UID | #ifndef GDM_SESSION_ROOT_UID | ||||
@@ -136,6 +140,10 @@ struct GdmSessionWorkerPrivate | @@ -126,6 +130,10 @@ struct GdmSessionWorkerPrivate | ||||
int exit_code; | int exit_code; | ||||
+#ifdef WITH_CONSOLE_KIT | +#ifdef WITH_CONSOLE_KIT | ||||
+ char *session_cookie; | + char *session_cookie; | ||||
+#endif | +#endif | ||||
+ | + | ||||
pam_handle_t *pam_handle; | pam_handle_t *pam_handle; | ||||
GPid child_pid; | GPid child_pid; | ||||
@@ -150,6 +158,7 @@ struct GdmSessionWorkerPrivate | @@ -140,6 +148,11 @@ struct GdmSessionWorkerPrivate | ||||
char *hostname; | char *hostname; | ||||
char *username; | char *username; | ||||
char *log_file; | char *log_file; | ||||
+#ifdef WITH_CONSOLE_KIT | |||||
+ char *session_type; | + char *session_type; | ||||
+ char *session_class; | |||||
+ char *session_service; | |||||
+#endif | |||||
char *session_id; | char *session_id; | ||||
uid_t uid; | uid_t uid; | ||||
gid_t gid; | gid_t gid; | ||||
@@ -223,6 +232,204 @@ G_DEFINE_TYPE_WITH_CODE (GdmSessionWorker, | @@ -207,6 +220,12 @@ typedef int (* GdmSessionWorkerPamNewMessagesFunc) (in | ||||
G_IMPLEMENT_INTERFACE (GDM_DBUS_TYPE_WORKER, | struct pam_response **, | ||||
worker_interface_init)) | gpointer); | ||||
+#ifdef WITH_CONSOLE_KIT | +#ifdef WITH_CONSOLE_KIT | ||||
+static char * | |||||
+gdm_session_worker_get_environment_variable (GdmSessionWorker *worker, | |||||
+ const char *key); | |||||
+#endif | |||||
+ | |||||
G_DEFINE_TYPE_WITH_CODE (GdmSessionWorker, | |||||
gdm_session_worker, | |||||
GDM_DBUS_TYPE_WORKER_SKELETON, | |||||
@@ -214,6 +233,211 @@ G_DEFINE_TYPE_WITH_CODE (GdmSessionWorker, | |||||
worker_interface_init) | |||||
G_ADD_PRIVATE (GdmSessionWorker)) | |||||
+#ifdef WITH_CONSOLE_KIT | |||||
+static gboolean | +static gboolean | ||||
+open_ck_session (GdmSessionWorker *worker) | +open_ck_session (GdmSessionWorker *worker) | ||||
+{ | +{ | ||||
+ GDBusConnection *system_bus; | + GDBusConnection *system_bus; | ||||
+ GVariantBuilder builder; | + GVariantBuilder builder; | ||||
+ GVariant *parameters; | + GVariant *parameters; | ||||
+ GVariant *in_args; | + GVariant *in_args; | ||||
+ struct passwd *pwent; | + struct passwd *pwent; | ||||
+ GVariant *reply; | + GVariant *reply; | ||||
+ GError *error = NULL; | + GError *error = NULL; | ||||
+ const char *display_name; | + const char *display_name; | ||||
+ const char *display_device; | + const char *display_device; | ||||
+ const char *display_hostname; | + const char *display_hostname; | ||||
+ const char *session_type; | |||||
+ gint32 uid; | + gint32 uid; | ||||
+ | + | ||||
+ g_assert (worker->priv->session_cookie == NULL); | + g_assert (worker->priv->session_cookie == NULL); | ||||
+ | + | ||||
+ if (worker->priv->x11_display_name != NULL) { | + if (worker->priv->x11_display_name != NULL) { | ||||
+ display_name = worker->priv->x11_display_name; | + display_name = worker->priv->x11_display_name; | ||||
+ } else { | + } else { | ||||
+ display_name = ""; | + display_name = ""; | ||||
+ } | + } | ||||
+ if (worker->priv->hostname != NULL) { | + if (worker->priv->hostname != NULL) { | ||||
+ display_hostname = worker->priv->hostname; | + display_hostname = worker->priv->hostname; | ||||
+ } else { | + } else { | ||||
+ display_hostname = ""; | + display_hostname = ""; | ||||
+ } | + } | ||||
+ if (worker->priv->display_device != NULL) { | + if (worker->priv->display_device != NULL) { | ||||
+ display_device = worker->priv->display_device; | + display_device = worker->priv->display_device; | ||||
+ } else { | + } else { | ||||
+ display_device = ""; | + display_device = ""; | ||||
+ } | + } | ||||
+ | + | ||||
+ if (worker->priv->session_type != NULL) { | |||||
+ session_type = worker->priv->session_type; | |||||
+ } else { | |||||
+ session_type = ""; | |||||
+ } | |||||
+ | |||||
+ g_assert (worker->priv->username != NULL); | + g_assert (worker->priv->username != NULL); | ||||
+ | + | ||||
+ gdm_get_pwent_for_name (worker->priv->username, &pwent); | + gdm_get_pwent_for_name (worker->priv->username, &pwent); | ||||
+ if (pwent == NULL) { | + if (pwent == NULL) { | ||||
+ goto out; | + goto out; | ||||
+ } | + } | ||||
+ | + | ||||
+ uid = (gint32) pwent->pw_uid; | + uid = (gint32) pwent->pw_uid; | ||||
Show All 10 Lines | |||||
+ } | + } | ||||
+ | + | ||||
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sv)")); | + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sv)")); | ||||
+ g_variant_builder_add_parsed (&builder, "('unix-user', <%i>)", uid); | + g_variant_builder_add_parsed (&builder, "('unix-user', <%i>)", uid); | ||||
+ g_variant_builder_add_parsed (&builder, "('x11-display-device', <%s>)", display_device); | + g_variant_builder_add_parsed (&builder, "('x11-display-device', <%s>)", display_device); | ||||
+ g_variant_builder_add_parsed (&builder, "('x11-display', <%s>)", display_name); | + g_variant_builder_add_parsed (&builder, "('x11-display', <%s>)", display_name); | ||||
+ g_variant_builder_add_parsed (&builder, "('remote-host-name', <%s>)", display_hostname); | + g_variant_builder_add_parsed (&builder, "('remote-host-name', <%s>)", display_hostname); | ||||
+ g_variant_builder_add_parsed (&builder, "('is-local', <%b>)", worker->priv->display_is_local); | + g_variant_builder_add_parsed (&builder, "('is-local', <%b>)", worker->priv->display_is_local); | ||||
+ g_variant_builder_add_parsed (&builder, "('session-type', <%s>)", session_type); | |||||
+ | + | ||||
+ worker->priv->session_type = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_TYPE"); | |||||
+ if (worker->priv->session_type != NULL) { | |||||
+ g_variant_builder_add_parsed (&builder, "('session-type', <%s>)", worker->priv->session_type); | |||||
+ } | |||||
+ | |||||
+ worker->priv->session_class = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_CLASS"); | |||||
+ if (worker->priv->session_class != NULL) { | |||||
+ g_variant_builder_add_parsed (&builder, "('session-class', <%s>)", worker->priv->session_class); | |||||
+ } | |||||
+ | |||||
+ worker->priv->session_service = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_SERVICE"); | |||||
+ if (worker->priv->session_service != NULL) { | |||||
+ g_variant_builder_add_parsed (&builder, "('session-service', <%s>)", worker->priv->session_service); | |||||
+ } | |||||
+ | |||||
+ parameters = g_variant_builder_end (&builder); | + parameters = g_variant_builder_end (&builder); | ||||
+ in_args = g_variant_new_tuple (¶meters, 1); | + in_args = g_variant_new_tuple (¶meters, 1); | ||||
+ | + | ||||
+ reply = g_dbus_connection_call_sync (system_bus, | + reply = g_dbus_connection_call_sync (system_bus, | ||||
+ "org.freedesktop.ConsoleKit", | + CK_NAME, | ||||
+ "/org/freedesktop/ConsoleKit/Manager", | + CK_MANAGER_PATH, | ||||
+ "org.freedesktop.ConsoleKit.Manager", | + CK_MANAGER_INTERFACE, | ||||
+ "OpenSessionWithParameters", | + "OpenSessionWithParameters", | ||||
+ in_args, | + in_args, | ||||
+ G_VARIANT_TYPE ("(s)"), | + G_VARIANT_TYPE ("(s)"), | ||||
+ G_DBUS_CALL_FLAGS_NONE, | + G_DBUS_CALL_FLAGS_NONE, | ||||
+ -1, | + -1, | ||||
+ NULL, | + NULL, | ||||
+ &error); | + &error); | ||||
+ | + | ||||
Show All 30 Lines | |||||
+ g_warning ("Couldn't create connection to system bus: %s", | + g_warning ("Couldn't create connection to system bus: %s", | ||||
+ error->message); | + error->message); | ||||
+ | + | ||||
+ g_error_free (error); | + g_error_free (error); | ||||
+ goto out; | + goto out; | ||||
+ } | + } | ||||
+ | + | ||||
+ reply = g_dbus_connection_call_sync (system_bus, | + reply = g_dbus_connection_call_sync (system_bus, | ||||
+ "org.freedesktop.ConsoleKit", | + CK_NAME, | ||||
+ "/org/freedesktop/ConsoleKit/Manager", | + CK_MANAGER_PATH, | ||||
+ "org.freedesktop.ConsoleKit.Manager", | + CK_MANAGER_INTERFACE, | ||||
+ "CloseSession", | + "CloseSession", | ||||
+ g_variant_new ("(s)", worker->priv->session_cookie), | + g_variant_new ("(s)", worker->priv->session_cookie), | ||||
+ G_VARIANT_TYPE ("(b)"), | + G_VARIANT_TYPE ("(b)"), | ||||
+ G_DBUS_CALL_FLAGS_NONE, | + G_DBUS_CALL_FLAGS_NONE, | ||||
+ -1, | + -1, | ||||
+ NULL, | + NULL, | ||||
+ &error); | + &error); | ||||
+ | + | ||||
Show All 31 Lines | |||||
+ g_warning ("Couldn't create connection to system bus: %s", | + g_warning ("Couldn't create connection to system bus: %s", | ||||
+ error->message); | + error->message); | ||||
+ | + | ||||
+ g_error_free (error); | + g_error_free (error); | ||||
+ goto out; | + goto out; | ||||
+ } | + } | ||||
+ | + | ||||
+ reply = g_dbus_connection_call_sync (system_bus, | + reply = g_dbus_connection_call_sync (system_bus, | ||||
+ "org.freedesktop.ConsoleKit", | + CK_NAME, | ||||
+ "/org/freedesktop/ConsoleKit/Manager", | + CK_MANAGER_PATH, | ||||
+ "org.freedesktop.ConsoleKit.Manager", | + CK_MANAGER_INTERFACE, | ||||
+ "GetSessionForCookie", | + "GetSessionForCookie", | ||||
+ g_variant_new ("(s)", worker->priv->session_cookie), | + g_variant_new ("(s)", worker->priv->session_cookie), | ||||
+ G_VARIANT_TYPE ("(o)"), | + G_VARIANT_TYPE ("(o)"), | ||||
+ G_DBUS_CALL_FLAGS_NONE, | + G_DBUS_CALL_FLAGS_NONE, | ||||
+ -1, | + -1, | ||||
+ NULL, | + NULL, | ||||
+ &error); | + &error); | ||||
+ | + | ||||
Show All 10 Lines | |||||
+out: | +out: | ||||
+ return session_id; | + return session_id; | ||||
+} | +} | ||||
+#endif | +#endif | ||||
+ | + | ||||
/* adapted from glib script_execute */ | /* adapted from glib script_execute */ | ||||
static void | static void | ||||
script_execute (const gchar *file, | script_execute (const gchar *file, | ||||
@@ -674,7 +881,9 @@ gdm_session_worker_process_pam_message (GdmSessionWork | @@ -670,7 +894,9 @@ gdm_session_worker_process_pam_message (GdmSessionWork | ||||
char *user_answer; | char *user_answer; | ||||
gboolean res; | gboolean res; | ||||
char *utf8_msg; | char *utf8_msg; | ||||
+#ifdef PAM_RADIO_TYPE | +#ifdef PAM_RADIO_TYPE | ||||
char *msg; | char *msg; | ||||
+#endif | +#endif | ||||
if (response != NULL) { | if (response != NULL) { | ||||
*response = NULL; | *response = NULL; | ||||
@@ -878,6 +1087,7 @@ gdm_session_worker_stop_auditor (GdmSessionWorker *wor | @@ -914,6 +1140,7 @@ gdm_session_worker_stop_auditor (GdmSessionWorker *wor | ||||
worker->priv->auditor = NULL; | worker->priv->auditor = NULL; | ||||
} | } | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
static void | static void | ||||
on_release_display (int signal) | on_release_display (int signal) | ||||
{ | { | ||||
@@ -1003,6 +1213,7 @@ jump_to_vt (GdmSessionWorker *worker, | @@ -1056,6 +1283,7 @@ jump_to_vt (GdmSessionWorker *worker, | ||||
close (active_vt_tty_fd); | close (active_vt_tty_fd); | ||||
} | } | ||||
+#endif | +#endif | ||||
static void | static void | ||||
gdm_session_worker_uninitialize_pam (GdmSessionWorker *worker, | gdm_session_worker_set_state (GdmSessionWorker *worker, | ||||
@@ -1033,11 +1244,13 @@ gdm_session_worker_uninitialize_pam (GdmSessionWorker | @@ -1158,7 +1386,9 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | ||||
gdm_session_worker_stop_auditor (worker); | |||||
+#ifdef WITH_SYSTEMD | |||||
if (g_strcmp0 (worker->priv->display_seat_id, "seat0") == 0) { | |||||
if (worker->priv->login_vt != worker->priv->session_vt) { | |||||
jump_to_vt (worker, worker->priv->login_vt); | |||||
} | |||||
} | |||||
+#endif | |||||
worker->priv->login_vt = 0; | |||||
worker->priv->session_vt = 0; | |||||
@@ -1088,6 +1301,7 @@ _get_xauth_for_pam (const char *x11_authority_file) | |||||
} | |||||
#endif | |||||
+#ifdef WITH_SYSTEMD | |||||
static gboolean | |||||
ensure_login_vt (GdmSessionWorker *worker) | |||||
{ | { | ||||
@@ -1099,7 +1313,7 @@ ensure_login_vt (GdmSessionWorker *worker) | |||||
if (fd < 0) { | |||||
g_debug ("GdmSessionWorker: couldn't open VT master: %m"); | |||||
- return FALSE; | |||||
+ return FALSE; | |||||
} | |||||
if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) { | |||||
@@ -1113,6 +1327,7 @@ out: | |||||
close (fd); | |||||
return got_login_vt; | |||||
} | |||||
+#endif | |||||
static gboolean | |||||
gdm_session_worker_initialize_pam (GdmSessionWorker *worker, | |||||
@@ -1129,7 +1344,6 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | |||||
{ | |||||
struct pam_conv pam_conversation; | struct pam_conv pam_conversation; | ||||
int error_code; | int error_code; | ||||
- char tty_string[256]; | +#ifdef WITH_SYSTEMD | ||||
char tty_string[256]; | |||||
+#endif | |||||
g_assert (worker->priv->pam_handle == NULL); | g_assert (worker->priv->pam_handle == NULL); | ||||
@@ -1196,10 +1410,12 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | @@ -1230,6 +1460,10 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | ||||
} | |||||
} | |||||
+#ifdef WITH_SYSTEMD | |||||
/* set seat ID */ | |||||
- if (seat_id != NULL && seat_id[0] != '\0') { | |||||
+ if (seat_id != NULL && seat_id[0] != '\0' && LOGIND_RUNNING()) { | |||||
gdm_session_worker_set_environment_variable (worker, "XDG_SEAT", seat_id); | gdm_session_worker_set_environment_variable (worker, "XDG_SEAT", seat_id); | ||||
} | } | ||||
+#endif | |||||
+#ifdef WITH_CONSOLE_KIT | |||||
+ gdm_session_worker_set_environment_variable (worker, "XDG_SESSION_SERVICE", service); | |||||
+#endif | |||||
+ | |||||
if (strcmp (service, "gdm-launch-environment") == 0) { | if (strcmp (service, "gdm-launch-environment") == 0) { | ||||
gdm_session_worker_set_environment_variable (worker, "XDG_SESSION_CLASS", "greeter"); | gdm_session_worker_set_environment_variable (worker, "XDG_SESSION_CLASS", "greeter"); | ||||
@@ -1208,6 +1424,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | } | ||||
@@ -1237,12 +1471,14 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | |||||
g_debug ("GdmSessionWorker: state SETUP_COMPLETE"); | g_debug ("GdmSessionWorker: state SETUP_COMPLETE"); | ||||
worker->priv->state = GDM_SESSION_WORKER_STATE_SETUP_COMPLETE; | gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE); | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
/* Temporarily set PAM_TTY with the currently active VT (login screen) | /* Temporarily set PAM_TTY with the login VT, | ||||
PAM_TTY will be reset with the users VT right before the user session is opened */ | PAM_TTY will be reset with the users VT right before the user session is opened */ | ||||
ensure_login_vt (worker); | g_snprintf (tty_string, 256, "/dev/tty%d", GDM_INITIAL_VT); | ||||
@@ -1215,6 +1432,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker | |||||
pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string); | pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string); | ||||
if (!display_is_local) | if (!display_is_local) | ||||
worker->priv->password_is_required = TRUE; | worker->priv->password_is_required = TRUE; | ||||
+#endif | +#endif | ||||
out: | out: | ||||
if (error_code != PAM_SUCCESS) { | if (error_code != PAM_SUCCESS) { | ||||
@@ -1509,7 +1727,7 @@ _lookup_passwd_info (const char *username, | @@ -1545,7 +1781,11 @@ _lookup_passwd_info (const char *username, | ||||
if (passwd_entry->pw_shell != NULL && passwd_entry->pw_shell[0] != '\0') { | if (passwd_entry->pw_shell != NULL && passwd_entry->pw_shell[0] != '\0') { | ||||
*shellp = g_strdup (passwd_entry->pw_shell); | *shellp = g_strdup (passwd_entry->pw_shell); | ||||
} else { | } else { | ||||
- *shellp = g_strdup ("/bin/bash"); | - *shellp = g_strdup ("/bin/bash"); | ||||
+#if defined(__OpenBSD__) | |||||
+ *shellp = g_strdup ("/bin/ksh"); | |||||
+#else | |||||
+ *shellp = g_strdup ("/bin/sh"); | + *shellp = g_strdup ("/bin/sh"); | ||||
+#endif | |||||
} | } | ||||
} | } | ||||
ret = TRUE; | ret = TRUE; | ||||
@@ -1762,6 +1980,26 @@ gdm_session_worker_get_environment (GdmSessionWorker * | @@ -1689,6 +1929,20 @@ gdm_session_worker_get_environment (GdmSessionWorker * | ||||
return (const char * const *) pam_getenvlist (worker->priv->pam_handle); | return (const char * const *) pam_getenvlist (worker->priv->pam_handle); | ||||
} | } | ||||
+#ifdef WITH_CONSOLE_KIT | +#ifdef WITH_CONSOLE_KIT | ||||
+static void | +static void | ||||
+register_ck_session (GdmSessionWorker *worker) | +register_ck_session (GdmSessionWorker *worker) | ||||
+{ | +{ | ||||
+#ifdef WITH_SYSTEMD | |||||
+ if (LOGIND_RUNNING()) { | |||||
+ return; | |||||
+ } | |||||
+#endif | |||||
+ | |||||
+ open_ck_session (worker); | + open_ck_session (worker); | ||||
+ | + | ||||
+ if (worker->priv->session_cookie != NULL) { | + if (worker->priv->session_cookie != NULL) { | ||||
+ gdm_session_worker_set_environment_variable (worker, | + gdm_session_worker_set_environment_variable (worker, | ||||
+ "XDG_SESSION_COOKIE", | + "XDG_SESSION_COOKIE", | ||||
+ worker->priv->session_cookie); | + worker->priv->session_cookie); | ||||
+ } | + } | ||||
+} | +} | ||||
+#endif | +#endif | ||||
+ | + | ||||
static gboolean | static gboolean | ||||
run_script (GdmSessionWorker *worker, | run_script (GdmSessionWorker *worker, | ||||
const char *dir) | const char *dir) | ||||
@@ -1792,6 +2030,9 @@ session_worker_child_watch (GPid pid, | @@ -1766,6 +2020,10 @@ session_worker_child_watch (GPid pid, | ||||
: WIFSIGNALED (status) ? WTERMSIG (status) | : WIFSIGNALED (status) ? WTERMSIG (status) | ||||
: -1); | : -1); | ||||
+#ifdef WITH_CONSOLE_KIT | +#ifdef WITH_CONSOLE_KIT | ||||
+ close_ck_session (worker); | + close_ck_session (worker); | ||||
+#endif | +#endif | ||||
+ | |||||
gdm_session_worker_uninitialize_pam (worker, PAM_SUCCESS); | gdm_session_worker_uninitialize_pam (worker, PAM_SUCCESS); | ||||
@@ -1982,6 +2223,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | worker->priv->child_pid = -1; | ||||
@@ -1978,6 +2236,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | |||||
error_code = PAM_SUCCESS; | error_code = PAM_SUCCESS; | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
/* If we're in new vt mode, jump to the new vt now. There's no need to jump for | /* If we're in new vt mode, jump to the new vt now. There's no need to jump for | ||||
* the other two modes: in the logind case, the session will activate itself when | * the other two modes: in the logind case, the session will activate itself when | ||||
* ready, and in the reuse server case, we're already on the correct VT. */ | * ready, and in the reuse server case, we're already on the correct VT. */ | ||||
@@ -1990,6 +2232,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | @@ -1986,6 +2245,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | ||||
jump_to_vt (worker, worker->priv->session_vt); | jump_to_vt (worker, worker->priv->session_vt); | ||||
} | } | ||||
} | } | ||||
+#endif | +#endif | ||||
if (!worker->priv->is_program_session && !run_script (worker, GDMCONFDIR "/PostLogin")) { | if (!worker->priv->is_program_session && !run_script (worker, GDMCONFDIR "/PostLogin")) { | ||||
g_set_error (error, | g_set_error (error, | ||||
@@ -2054,6 +2297,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | @@ -2048,6 +2308,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | ||||
_exit (EXIT_FAILURE); | _exit (EXIT_FAILURE); | ||||
} | } | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
/* Take control of the tty | /* Take control of the tty | ||||
*/ | */ | ||||
if (needs_controlling_terminal) { | if (needs_controlling_terminal) { | ||||
@@ -2061,6 +2305,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | @@ -2055,6 +2316,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | ||||
g_debug ("GdmSessionWorker: could not take control of tty: %m"); | g_debug ("GdmSessionWorker: could not take control of tty: %m"); | ||||
} | } | ||||
} | } | ||||
+#endif | +#endif | ||||
#ifdef HAVE_LOGINCAP | #ifdef HAVE_LOGINCAP | ||||
if (setusercontext (NULL, passwd_entry, passwd_entry->pw_uid, LOGIN_SETALL) < 0) { | if (setusercontext (NULL, passwd_entry, passwd_entry->pw_uid, LOGIN_SETALL) < 0) { | ||||
@@ -2205,11 +2450,13 @@ gdm_session_worker_start_session (GdmSessionWorker *w | @@ -2186,6 +2448,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w | ||||
return TRUE; | return TRUE; | ||||
} | } | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
static gboolean | static gboolean | ||||
set_up_for_new_vt (GdmSessionWorker *worker) | set_up_for_new_vt (GdmSessionWorker *worker) | ||||
{ | { | ||||
int fd; | @@ -2286,6 +2549,7 @@ fail: | ||||
char vt_string[256], tty_string[256]; | |||||
+ struct vt_stat vt_state = { 0 }; | |||||
int session_vt = 0; | |||||
fd = open ("/dev/tty0", O_RDWR | O_NOCTTY); | |||||
@@ -2219,6 +2466,11 @@ set_up_for_new_vt (GdmSessionWorker *worker) | |||||
return FALSE; | |||||
} | |||||
+ if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) { | |||||
+ g_debug ("GdmSessionWorker: couldn't get current VT: %m"); | |||||
+ goto fail; | |||||
+ } | |||||
+ | |||||
if (worker->priv->display_is_initial) { | |||||
session_vt = atoi (GDM_INITIAL_VT); | |||||
} else { | |||||
@@ -2228,6 +2480,7 @@ set_up_for_new_vt (GdmSessionWorker *worker) | |||||
} | |||||
} | |||||
+ worker->priv->login_vt = vt_state.v_active; | |||||
worker->priv->session_vt = session_vt; | |||||
close (fd); | close (fd); | ||||
@@ -2290,6 +2543,7 @@ fail: | |||||
close (fd); | |||||
return FALSE; | return FALSE; | ||||
} | } | ||||
+#endif | +#endif | ||||
static gboolean | static gboolean | ||||
set_up_for_current_vt (GdmSessionWorker *worker, | set_up_for_current_vt (GdmSessionWorker *worker, | ||||
@@ -2357,12 +2611,14 @@ set_up_for_current_vt (GdmSessionWorker *worker, | @@ -2353,12 +2617,14 @@ set_up_for_current_vt (GdmSessionWorker *worker, | ||||
} | } | ||||
#endif | #endif | ||||
+#ifdef WITH_SYSTEMD | +#ifdef WITH_SYSTEMD | ||||
if (g_strcmp0 (worker->priv->display_seat_id, "seat0") == 0) { | if (g_strcmp0 (worker->priv->display_seat_id, "seat0") == 0) { | ||||
g_debug ("GdmSessionWorker: setting XDG_VTNR to current vt"); | g_debug ("GdmSessionWorker: setting XDG_VTNR to current vt"); | ||||
set_xdg_vtnr_to_current_vt (worker); | set_xdg_vtnr_to_current_vt (worker); | ||||
} else { | } else { | ||||
g_debug ("GdmSessionWorker: not setting XDG_VTNR since not seat0"); | g_debug ("GdmSessionWorker: not setting XDG_VTNR since not seat0"); | ||||
} | } | ||||
+#endif | +#endif | ||||
return TRUE; | return TRUE; | ||||
out: | out: | ||||
@@ -2386,6 +2642,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | @@ -2384,6 +2650,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | ||||
return FALSE; | |||||
} | |||||
break; | break; | ||||
+#ifdef WITH_SYSTEMD | |||||
case GDM_SESSION_DISPLAY_MODE_NEW_VT: | case GDM_SESSION_DISPLAY_MODE_NEW_VT: | ||||
case GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED: | case GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED: | ||||
+#ifdef WITH_SYSTEMD | |||||
if (!set_up_for_new_vt (worker)) { | if (!set_up_for_new_vt (worker)) { | ||||
@@ -2396,6 +2653,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | g_set_error (error, | ||||
GDM_SESSION_WORKER_ERROR, | |||||
@@ -2391,6 +2658,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | |||||
"Unable to open VT"); | |||||
return FALSE; | return FALSE; | ||||
} | } | ||||
break; | |||||
+#endif | +#endif | ||||
break; | |||||
} | } | ||||
flags = 0; | @@ -2413,8 +2681,16 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | ||||
@@ -2417,8 +2675,18 @@ gdm_session_worker_open_session (GdmSessionWorker *wo | |||||
g_debug ("GdmSessionWorker: state SESSION_OPENED"); | g_debug ("GdmSessionWorker: state SESSION_OPENED"); | ||||
worker->priv->state = GDM_SESSION_WORKER_STATE_SESSION_OPENED; | gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_SESSION_OPENED); | ||||
+#ifdef WITH_SYSTEMD | +#if defined(WITH_SYSTEMD) | ||||
session_id = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_ID"); | session_id = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_ID"); | ||||
+#endif | +#elif defined(WITH_CONSOLE_KIT) | ||||
+#ifdef WITH_CONSOLE_KIT | |||||
+ register_ck_session (worker); | + register_ck_session (worker); | ||||
+ | |||||
+ if (session_id == NULL) { | + if (session_id == NULL) { | ||||
+ session_id = get_ck_session_id (worker); | + session_id = get_ck_session_id (worker); | ||||
+ } | + } | ||||
+#endif | +#endif | ||||
+ | + | ||||
if (session_id != NULL) { | if (session_id != NULL) { | ||||
g_free (worker->priv->session_id); | g_free (worker->priv->session_id); | ||||
worker->priv->session_id = session_id; | worker->priv->session_id = session_id; | ||||
@@ -2523,6 +2791,19 @@ gdm_session_worker_handle_set_session_name (GdmDBusWor | @@ -2968,6 +3244,7 @@ gdm_session_worker_handle_open (GdmDBusWorker | ||||
} | |||||
static gboolean | |||||
+gdm_session_worker_handle_set_session_type (GdmDBusWorker *object, | |||||
+ GDBusMethodInvocation *invocation, | |||||
+ const char *session_type) | |||||
+{ | |||||
+ GdmSessionWorker *worker = GDM_SESSION_WORKER (object); | |||||
+ g_debug ("GdmSessionWorker: session type set to %s", session_type); | |||||
+ g_free (worker->priv->session_type); | |||||
+ worker->priv->session_type = g_strdup (session_type); | |||||
+ gdm_dbus_worker_complete_set_session_type (object, invocation); | |||||
+ return TRUE; | |||||
+} | |||||
+ | |||||
+static gboolean | |||||
gdm_session_worker_handle_set_session_display_mode (GdmDBusWorker *object, | |||||
GDBusMethodInvocation *invocation, | |||||
const char *str) | |||||
@@ -2949,6 +3230,7 @@ gdm_session_worker_handle_open (GdmDBusWorker | |||||
return TRUE; | return TRUE; | ||||
} | } | ||||
+#ifdef SUPPORTS_PAM_EXTENSIONS | +#ifdef SUPPORTS_PAM_EXTENSIONS | ||||
static char ** | static char ** | ||||
filter_extensions (const char * const *extensions) | filter_extensions (const char * const *extensions) | ||||
{ | { | ||||
@@ -2974,6 +3256,7 @@ filter_extensions (const char * const *extensions) | @@ -2993,6 +3270,7 @@ filter_extensions (const char * const *extensions) | ||||
return filtered_extensions; | return filtered_extensions; | ||||
} | } | ||||
+#endif | +#endif | ||||
static gboolean | static gboolean | ||||
gdm_session_worker_handle_initialize (GdmDBusWorker *object, | gdm_session_worker_handle_initialize (GdmDBusWorker *object, | ||||
@@ -2993,8 +3276,10 @@ gdm_session_worker_handle_initialize (GdmDBusWorker | @@ -3012,8 +3290,10 @@ gdm_session_worker_handle_initialize (GdmDBusWorker | ||||
while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) { | while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) { | ||||
if (g_strcmp0 (key, "service") == 0) { | if (g_strcmp0 (key, "service") == 0) { | ||||
worker->priv->service = g_variant_dup_string (value, NULL); | worker->priv->service = g_variant_dup_string (value, NULL); | ||||
+#ifdef SUPPORTS_PAM_EXTENSIONS | +#ifdef SUPPORTS_PAM_EXTENSIONS | ||||
} else if (g_strcmp0 (key, "extensions") == 0) { | } else if (g_strcmp0 (key, "extensions") == 0) { | ||||
worker->priv->extensions = filter_extensions (g_variant_get_strv (value, NULL)); | worker->priv->extensions = filter_extensions (g_variant_get_strv (value, NULL)); | ||||
+#endif | +#endif | ||||
} else if (g_strcmp0 (key, "username") == 0) { | } else if (g_strcmp0 (key, "username") == 0) { | ||||
worker->priv->username = g_variant_dup_string (value, NULL); | worker->priv->username = g_variant_dup_string (value, NULL); | ||||
} else if (g_strcmp0 (key, "is-program-session") == 0) { | } else if (g_strcmp0 (key, "is-program-session") == 0) { | ||||
@@ -3434,6 +3719,7 @@ worker_interface_init (GdmDBusWorkerIface *interface) | |||||
interface->handle_open = gdm_session_worker_handle_open; | |||||
interface->handle_set_language_name = gdm_session_worker_handle_set_language_name; | |||||
interface->handle_set_session_name = gdm_session_worker_handle_set_session_name; | |||||
+ interface->handle_set_session_type = gdm_session_worker_handle_set_session_type; | |||||
interface->handle_set_session_display_mode = gdm_session_worker_handle_set_session_display_mode; | |||||
interface->handle_set_environment_variable = gdm_session_worker_handle_set_environment_variable; | |||||
interface->handle_start_program = gdm_session_worker_handle_start_program; |