diff options
Diffstat (limited to 'x11/gdm/files/patch-daemon_gdm-session-worker.c')
-rw-r--r-- | x11/gdm/files/patch-daemon_gdm-session-worker.c | 212 |
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; + |