summaryrefslogtreecommitdiff
path: root/x11/gdm/files/patch-daemon_gdm-session-worker.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11/gdm/files/patch-daemon_gdm-session-worker.c')
-rw-r--r--x11/gdm/files/patch-daemon_gdm-session-worker.c212
1 files changed, 105 insertions, 107 deletions
diff --git a/x11/gdm/files/patch-daemon_gdm-session-worker.c b/x11/gdm/files/patch-daemon_gdm-session-worker.c
index 23d9aaa34d46..faf8c99c5392 100644
--- a/x11/gdm/files/patch-daemon_gdm-session-worker.c
+++ b/x11/gdm/files/patch-daemon_gdm-session-worker.c
@@ -1,4 +1,4 @@
---- daemon/gdm-session-worker.c.orig 2022-03-21 18:12:40 UTC
+--- daemon/gdm-session-worker.c.orig 2024-09-16 13:28:26 UTC
+++ daemon/gdm-session-worker.c
@@ -28,9 +28,11 @@
#include <string.h>
@@ -12,17 +12,18 @@
#include <errno.h>
#include <grp.h>
#include <pwd.h>
-@@ -49,7 +51,9 @@
-
+@@ -53,8 +55,10 @@
#include <X11/Xauth.h>
+ #endif
+#ifdef WITH_SYSTEMD
#include <systemd/sd-daemon.h>
+ #include <systemd/sd-login.h>
+#endif
#ifdef ENABLE_SYSTEMD_JOURNAL
#include <systemd/sd-journal.h>
-@@ -126,6 +130,10 @@ struct GdmSessionWorkerPrivate
+@@ -130,6 +134,10 @@ struct _GdmSessionWorker
int exit_code;
@@ -33,7 +34,7 @@
pam_handle_t *pam_handle;
GPid child_pid;
-@@ -140,6 +148,11 @@ struct GdmSessionWorkerPrivate
+@@ -144,6 +152,11 @@ struct _GdmSessionWorker
char *hostname;
char *username;
char *log_file;
@@ -45,7 +46,7 @@
char *session_id;
uid_t uid;
gid_t gid;
-@@ -207,6 +220,12 @@ typedef int (* GdmSessionWorkerPamNewMessagesFunc) (in
+@@ -213,12 +226,223 @@ typedef int (* GdmSessionWorkerPamNewMessagesFunc) (in
struct pam_response **,
gpointer);
@@ -58,9 +59,8 @@
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))
+ G_IMPLEMENT_INTERFACE (GDM_DBUS_TYPE_WORKER,
+ worker_interface_init))
+#ifdef WITH_CONSOLE_KIT
+static gboolean
@@ -78,27 +78,27 @@
+ const char *display_hostname;
+ gint32 uid;
+
-+ g_assert (worker->priv->session_cookie == NULL);
++ g_assert (worker->session_cookie == NULL);
+
-+ if (worker->priv->x11_display_name != NULL) {
-+ display_name = worker->priv->x11_display_name;
++ if (worker->x11_display_name != NULL) {
++ display_name = worker->x11_display_name;
+ } else {
+ display_name = "";
+ }
-+ if (worker->priv->hostname != NULL) {
-+ display_hostname = worker->priv->hostname;
++ if (worker->hostname != NULL) {
++ display_hostname = worker->hostname;
+ } else {
+ display_hostname = "";
+ }
-+ if (worker->priv->display_device != NULL) {
-+ display_device = worker->priv->display_device;
++ if (worker->display_device != NULL) {
++ display_device = worker->display_device;
+ } else {
+ display_device = "";
+ }
+
-+ g_assert (worker->priv->username != NULL);
++ g_assert (worker->username != NULL);
+
-+ gdm_get_pwent_for_name (worker->priv->username, &pwent);
++ gdm_get_pwent_for_name (worker->username, &pwent);
+ if (pwent == NULL) {
+ goto out;
+ }
@@ -121,21 +121,21 @@
+ 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, "('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->display_is_local);
+
-+ 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->session_type = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_TYPE");
++ if (worker->session_type != NULL) {
++ g_variant_builder_add_parsed (&builder, "('session-type', <%s>)", worker->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->session_class = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_CLASS");
++ if (worker->session_class != NULL) {
++ g_variant_builder_add_parsed (&builder, "('session-class', <%s>)", worker->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);
++ worker->session_service = gdm_session_worker_get_environment_variable (worker, "XDG_SESSION_SERVICE");
++ if (worker->session_service != NULL) {
++ g_variant_builder_add_parsed (&builder, "('session-service', <%s>)", worker->session_service);
+ }
+
+ parameters = g_variant_builder_end (&builder);
@@ -159,12 +159,12 @@
+ goto out;
+ }
+
-+ g_variant_get (reply, "(s)", &worker->priv->session_cookie);
++ g_variant_get (reply, "(s)", &worker->session_cookie);
+
+ g_variant_unref (reply);
+
+out:
-+ return worker->priv->session_cookie != NULL;
++ return worker->session_cookie != NULL;
+}
+
+static void
@@ -175,7 +175,7 @@
+ GError *error = NULL;
+ gboolean was_closed;
+
-+ if (worker->priv->session_cookie == NULL) {
++ if (worker->session_cookie == NULL) {
+ return;
+ }
+
@@ -195,7 +195,7 @@
+ CK_MANAGER_PATH,
+ CK_MANAGER_INTERFACE,
+ "CloseSession",
-+ g_variant_new ("(s)", worker->priv->session_cookie),
++ g_variant_new ("(s)", worker->session_cookie),
+ G_VARIANT_TYPE ("(b)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
@@ -217,7 +217,7 @@
+ g_variant_unref (reply);
+
+out:
-+ g_clear_pointer (&worker->priv->session_cookie,
++ g_clear_pointer (&worker->session_cookie,
+ (GDestroyNotify) g_free);
+}
+
@@ -245,7 +245,7 @@
+ CK_MANAGER_PATH,
+ CK_MANAGER_INTERFACE,
+ "GetSessionForCookie",
-+ g_variant_new ("(s)", worker->priv->session_cookie),
++ g_variant_new ("(s)", worker->session_cookie),
+ G_VARIANT_TYPE ("(o)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
@@ -270,25 +270,15 @@
/* adapted from glib script_execute */
static void
script_execute (const gchar *file,
-@@ -670,7 +894,9 @@ gdm_session_worker_process_pam_message (GdmSessionWork
- char *user_answer;
- gboolean res;
- char *utf8_msg;
-+#ifdef PAM_RADIO_TYPE
- char *msg;
-+#endif
-
- if (response != NULL) {
- *response = NULL;
-@@ -914,6 +1140,7 @@ gdm_session_worker_stop_auditor (GdmSessionWorker *wor
- worker->priv->auditor = NULL;
+@@ -972,6 +1196,7 @@ gdm_session_worker_stop_auditor (GdmSessionWorker *wor
+ worker->auditor = NULL;
}
+#ifdef WITH_SYSTEMD
static void
on_release_display (int signal)
{
-@@ -1056,6 +1283,7 @@ jump_to_vt (GdmSessionWorker *worker,
+@@ -1114,6 +1339,7 @@ jump_to_vt (GdmSessionWorker *worker,
close (active_vt_tty_fd);
}
@@ -296,7 +286,7 @@
static void
gdm_session_worker_set_state (GdmSessionWorker *worker,
-@@ -1158,7 +1386,9 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
+@@ -1216,7 +1442,9 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
{
struct pam_conv pam_conversation;
int error_code;
@@ -304,9 +294,9 @@
char tty_string[256];
+#endif
- g_assert (worker->priv->pam_handle == NULL);
-
-@@ -1230,6 +1460,10 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
+ g_assert (service != NULL);
+ g_assert (worker->pam_handle == NULL);
+@@ -1297,6 +1525,10 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
gdm_session_worker_set_environment_variable (worker, "XDG_SEAT", seat_id);
}
@@ -317,36 +307,34 @@
if (strcmp (service, "gdm-launch-environment") == 0) {
gdm_session_worker_set_environment_variable (worker, "XDG_SESSION_CLASS", "greeter");
}
-@@ -1237,12 +1471,14 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
+@@ -1304,13 +1536,6 @@ gdm_session_worker_initialize_pam (GdmSessionWorker
g_debug ("GdmSessionWorker: state SETUP_COMPLETE");
gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_SETUP_COMPLETE);
-+#ifdef WITH_SYSTEMD
- /* Temporarily set PAM_TTY with the login VT,
- PAM_TTY will be reset with the users VT right before the user session is opened */
- g_snprintf (tty_string, 256, "/dev/tty%d", GDM_INITIAL_VT);
- pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string);
+- if (g_strcmp0 (seat_id, "seat0") == 0 && worker->seat0_has_vts) {
+- /* Temporarily set PAM_TTY with the login VT,
+- PAM_TTY will be reset with the users VT right before the user session is opened */
+- g_snprintf (tty_string, 256, "/dev/tty%d", GDM_INITIAL_VT);
+- pam_set_item (worker->pam_handle, PAM_TTY, tty_string);
+- }
+-
if (!display_is_local)
- worker->priv->password_is_required = TRUE;
-+#endif
+ worker->password_is_required = TRUE;
- out:
- if (error_code != PAM_SUCCESS) {
-@@ -1545,7 +1781,11 @@ _lookup_passwd_info (const char *username,
+@@ -1621,7 +1846,11 @@ _lookup_passwd_info (const char *username,
if (passwd_entry->pw_shell != NULL && passwd_entry->pw_shell[0] != '\0') {
*shellp = g_strdup (passwd_entry->pw_shell);
} else {
-- *shellp = g_strdup ("/bin/bash");
-+#if defined(__OpenBSD__)
-+ *shellp = g_strdup ("/bin/ksh");
-+#else
++#if defined(__FreeBSD__)
+ *shellp = g_strdup ("/bin/sh");
++#else
+ *shellp = g_strdup ("/bin/bash");
+#endif
}
}
ret = TRUE;
-@@ -1689,6 +1929,20 @@ gdm_session_worker_get_environment (GdmSessionWorker *
- return (const char * const *) pam_getenvlist (worker->priv->pam_handle);
+@@ -1760,6 +1989,20 @@ gdm_session_worker_get_environment (GdmSessionWorker *
+ return (const char * const *) pam_getenvlist (worker->pam_handle);
}
+#ifdef WITH_CONSOLE_KIT
@@ -355,10 +343,10 @@
+{
+ open_ck_session (worker);
+
-+ if (worker->priv->session_cookie != NULL) {
++ if (worker->session_cookie != NULL) {
+ gdm_session_worker_set_environment_variable (worker,
+ "XDG_SESSION_COOKIE",
-+ worker->priv->session_cookie);
++ worker->session_cookie);
+ }
+}
+#endif
@@ -366,7 +354,7 @@
static gboolean
run_script (GdmSessionWorker *worker,
const char *dir)
-@@ -1766,6 +2020,10 @@ session_worker_child_watch (GPid pid,
+@@ -1837,6 +2080,10 @@ session_worker_child_watch (GPid pid,
: WIFSIGNALED (status) ? WTERMSIG (status)
: -1);
@@ -376,8 +364,8 @@
+
gdm_session_worker_uninitialize_pam (worker, PAM_SUCCESS);
- worker->priv->child_pid = -1;
-@@ -1978,6 +2236,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
+ worker->child_pid = -1;
+@@ -2037,6 +2284,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
error_code = PAM_SUCCESS;
@@ -385,15 +373,15 @@
/* 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
* ready, and in the reuse server case, we're already on the correct VT. */
-@@ -1986,6 +2245,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
- jump_to_vt (worker, worker->priv->session_vt);
+@@ -2045,6 +2293,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
+ jump_to_vt (worker, worker->session_vt);
}
}
+#endif
- if (!worker->priv->is_program_session && !run_script (worker, GDMCONFDIR "/PostLogin")) {
+ if (!worker->is_program_session && !run_script (worker, GDMCONFDIR "/PostLogin")) {
g_set_error (error,
-@@ -2048,6 +2308,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
+@@ -2107,6 +2356,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
_exit (EXIT_FAILURE);
}
@@ -401,7 +389,7 @@
/* Take control of the tty
*/
if (needs_controlling_terminal) {
-@@ -2055,6 +2316,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
+@@ -2114,6 +2364,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
g_debug ("GdmSessionWorker: could not take control of tty: %m");
}
}
@@ -409,7 +397,7 @@
#ifdef HAVE_LOGINCAP
if (setusercontext (NULL, passwd_entry, passwd_entry->pw_uid, LOGIN_SETALL) < 0) {
-@@ -2186,6 +2448,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
+@@ -2242,6 +2493,7 @@ gdm_session_worker_start_session (GdmSessionWorker *w
return TRUE;
}
@@ -417,7 +405,7 @@
static gboolean
set_up_for_new_vt (GdmSessionWorker *worker)
{
-@@ -2286,6 +2549,7 @@ fail:
+@@ -2341,6 +2593,7 @@ fail:
close (fd);
return FALSE;
}
@@ -425,38 +413,38 @@
static gboolean
set_up_for_current_vt (GdmSessionWorker *worker,
-@@ -2353,12 +2617,14 @@ set_up_for_current_vt (GdmSessionWorker *worker,
+@@ -2410,12 +2663,14 @@ set_up_for_current_vt (GdmSessionWorker *worker,
}
#endif
+#ifdef WITH_SYSTEMD
- if (g_strcmp0 (worker->priv->display_seat_id, "seat0") == 0) {
+ if (g_strcmp0 (worker->display_seat_id, "seat0") == 0 && worker->seat0_has_vts) {
g_debug ("GdmSessionWorker: setting XDG_VTNR to current vt");
set_xdg_vtnr_to_current_vt (worker);
} else {
- g_debug ("GdmSessionWorker: not setting XDG_VTNR since not seat0");
+ g_debug ("GdmSessionWorker: not setting XDG_VTNR since no VTs on seat");
}
+#endif
return TRUE;
- out:
-@@ -2384,6 +2650,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo
- break;
- case GDM_SESSION_DISPLAY_MODE_NEW_VT:
- case GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED:
+ }
+@@ -2440,6 +2695,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo
+ break;
+ case GDM_SESSION_DISPLAY_MODE_NEW_VT:
+ case GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED:
+#ifdef WITH_SYSTEMD
- if (!set_up_for_new_vt (worker)) {
- 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;
- }
+ if (!set_up_for_new_vt (worker)) {
+ g_set_error (error,
+ GDM_SESSION_WORKER_ERROR,
+@@ -2447,6 +2703,7 @@ gdm_session_worker_open_session (GdmSessionWorker *wo
+ "Unable to open VT");
+ return FALSE;
+ }
+#endif
- break;
+ break;
+ }
}
-
-@@ -2413,8 +2681,16 @@ gdm_session_worker_open_session (GdmSessionWorker *wo
+@@ -2470,8 +2727,16 @@ gdm_session_worker_open_session (GdmSessionWorker *wo
g_debug ("GdmSessionWorker: state SESSION_OPENED");
gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_SESSION_OPENED);
@@ -471,9 +459,9 @@
+#endif
+
if (session_id != NULL) {
- g_free (worker->priv->session_id);
- worker->priv->session_id = session_id;
-@@ -2968,6 +3244,7 @@ gdm_session_worker_handle_open (GdmDBusWorker
+ g_free (worker->session_id);
+ worker->session_id = g_steal_pointer (&session_id);
+@@ -3022,6 +3287,7 @@ gdm_session_worker_handle_open (GdmDBusWorker
return TRUE;
}
@@ -481,22 +469,32 @@
static char **
filter_extensions (const char * const *extensions)
{
-@@ -2993,6 +3270,7 @@ filter_extensions (const char * const *extensions)
+@@ -3045,6 +3311,7 @@ filter_extensions (const char * const *extensions)
- return filtered_extensions;
+ return g_steal_pointer (&filtered_extensions);
}
+#endif
static gboolean
gdm_session_worker_handle_initialize (GdmDBusWorker *object,
-@@ -3012,8 +3290,10 @@ gdm_session_worker_handle_initialize (GdmDBusWorker
+@@ -3064,8 +3331,10 @@ gdm_session_worker_handle_initialize (GdmDBusWorker
while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) {
if (g_strcmp0 (key, "service") == 0) {
- worker->priv->service = g_variant_dup_string (value, NULL);
+ worker->service = g_variant_dup_string (value, NULL);
+#ifdef SUPPORTS_PAM_EXTENSIONS
} else if (g_strcmp0 (key, "extensions") == 0) {
- worker->priv->extensions = filter_extensions (g_variant_get_strv (value, NULL));
+ worker->extensions = filter_extensions (g_variant_get_strv (value, NULL));
+#endif
} else if (g_strcmp0 (key, "username") == 0) {
- worker->priv->username = g_variant_dup_string (value, NULL);
+ worker->username = g_variant_dup_string (value, NULL);
} else if (g_strcmp0 (key, "is-program-session") == 0) {
+@@ -3089,7 +3358,9 @@ gdm_session_worker_handle_initialize (GdmDBusWorker
+ }
+ }
+
++#ifdef WITH_SYSTEMD
+ worker->seat0_has_vts = sd_seat_can_tty ("seat0");
++#endif
+
+ worker->pending_invocation = invocation;
+