--- a/daemon/gdm-launch-environment.c +++ b/daemon/gdm-launch-environment.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -69,15 +71,8 @@ char *session_name; GPid pid; - GdmDynamicUserStore *dyn_user_store; - char *preferred_user_name; - char *user_disp_name; - char *user_member_of; - char *dyn_user_name; - uid_t dyn_uid; - char *dyn_user_home; - - char *dconf_profile; + char *user_name; + char *session_id; char *display_seat_id; char *display_hostname; @@ -93,6 +88,7 @@ PROP_USER_DISP_NAME, PROP_USER_MEMBER_OF, PROP_DCONF_PROFILE, + PROP_USER_NAME, PROP_SESSION_NAME, N_PROPS }; @@ -300,10 +296,10 @@ g_strdup (g_getenv (optional_environment[i]))); } - if (launch_environment->dconf_profile != NULL) { - g_hash_table_insert (hash, g_strdup ("DCONF_PROFILE"), g_strdup (launch_environment->dconf_profile)); - - is_initial_setup = strcmp (launch_environment->dconf_profile, INITIAL_SETUP_DCONF_PROFILE) == 0; + if (launch_environment->user_name != NULL) { + g_hash_table_insert (hash, g_strdup ("DCONF_PROFILE"), g_strdup (launch_environment->user_name)); + + is_initial_setup = g_strcmp0 (launch_environment->session_name, INITIAL_SETUP_SESSION) == 0; if (!is_initial_setup) { /* gvfs is needed for fetching remote avatars in the initial setup. Disable it otherwise. */ @@ -317,16 +313,28 @@ if (debug) g_hash_table_insert (hash, g_strdup ("GNOME_SESSION_DEBUG"), g_strdup ("1")); - g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (launch_environment->dyn_user_name)); - g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (launch_environment->dyn_user_name)); - g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (launch_environment->dyn_user_name)); + g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (launch_environment->user_name)); + g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (launch_environment->user_name)); + g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (launch_environment->user_name)); g_hash_table_insert (hash, g_strdup ("GDM_VERSION"), g_strdup (VERSION)); g_hash_table_remove (hash, "MAIL"); - g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (launch_environment->dyn_user_home)); - g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (launch_environment->dyn_user_home)); - g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (NOLOGIN_PATH)); + { + struct passwd *pw; + g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/")); + g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/")); + g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh")); + gdm_get_pwent_for_name (launch_environment->user_name, &pw); + if (pw != NULL) { + if (pw->pw_dir != NULL && pw->pw_dir[0] != '\0') { + g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pw->pw_dir)); + g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pw->pw_dir)); + } + if (pw->pw_shell != NULL && pw->pw_shell[0] != '\0') + g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pw->pw_shell)); + } + } if (start_session && launch_environment->display_seat_id != NULL) { char *seat_id; @@ -337,10 +345,17 @@ g_hash_table_insert (hash, g_strdup ("GDM_SEAT_ID"), g_strdup (seat_id)); - if (!is_initial_setup && - setup_seat_persist_dirs(seat_id, launch_environment->dyn_uid, &config_dir, &state_dir)) { - g_hash_table_insert (hash, g_strdup ("XDG_CONFIG_HOME"), config_dir); - g_hash_table_insert (hash, g_strdup ("XDG_STATE_HOME"), state_dir); + { + struct passwd *pw_seat; + uid_t seat_uid = 0; + gdm_get_pwent_for_name (launch_environment->user_name, &pw_seat); + if (pw_seat != NULL) + seat_uid = pw_seat->pw_uid; + if (!is_initial_setup && + setup_seat_persist_dirs(seat_id, seat_uid, &config_dir, &state_dir)) { + g_hash_table_insert (hash, g_strdup ("XDG_CONFIG_HOME"), config_dir); + g_hash_table_insert (hash, g_strdup ("XDG_STATE_HOME"), state_dir); + } } } @@ -379,10 +394,15 @@ g_autofree char *environment_conf = NULL; g_autoptr(GFile) file = NULL; g_autoptr(GFileOutputStream) file_stream = NULL; - uid_t uid = launch_environment->dyn_uid; + struct passwd *pwent; + uid_t uid; gid_t gid = GID_NOBODY; - config_dir = g_build_filename (launch_environment->dyn_user_home, ".config", NULL); + if (!gdm_get_pwent_for_name (launch_environment->user_name, &pwent) || pwent == NULL) + return NULL; + uid = pwent->pw_uid; + + config_dir = g_build_filename (pwent->pw_dir, ".config", NULL); if (!gdm_ensure_dir (config_dir, uid, gid, 0700, FALSE, error)) return NULL; @@ -505,7 +525,7 @@ gdm_session_setup_for_program (launch_environment->session, GDM_SESSION_LAUNCH_ENVIRONMENT_SERVICE, - launch_environment->dyn_user_name, + launch_environment->user_name, log_path); } @@ -536,26 +556,7 @@ uid_t *uid, GError **error) { - if (launch_environment->dyn_uid != 0) { - *uid = launch_environment->dyn_uid; - return TRUE; - } - - if (!gdm_dynamic_user_store_create (dyn_user_store, - launch_environment->preferred_user_name, - launch_environment->user_disp_name, - launch_environment->user_member_of, - &launch_environment->dyn_user_name, - &launch_environment->dyn_uid, - &launch_environment->dyn_user_home, - error)) - return FALSE; - - /* We've allocated the UID, so let's make sure we can deallocate later */ - g_set_object (&launch_environment->dyn_user_store, dyn_user_store); - - *uid = launch_environment->dyn_uid; - return TRUE; + return FALSE; } /** @@ -567,15 +568,22 @@ gboolean gdm_launch_environment_start (GdmLaunchEnvironment *launch_environment) { - g_autoptr(GError) error = NULL; + struct passwd *passwd_entry; + uid_t uid; g_return_val_if_fail (GDM_IS_LAUNCH_ENVIRONMENT (launch_environment), FALSE); - g_return_val_if_fail (launch_environment->dyn_uid != 0, FALSE); g_debug ("GdmLaunchEnvironment: Starting..."); + if (!gdm_get_pwent_for_name (launch_environment->user_name, &passwd_entry)) { + g_critical ("GdmLaunchEnvironment: Unknown greeter user '%s'", + launch_environment->user_name); + return FALSE; + } + uid = passwd_entry->pw_uid; + launch_environment->session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN, - launch_environment->dyn_uid, + uid, launch_environment->display_hostname, NULL, launch_environment->display_seat_id, @@ -643,12 +651,6 @@ g_clear_object (&launch_environment->session); } - if (launch_environment->dyn_uid != 0) { - gdm_dynamic_user_store_remove (launch_environment->dyn_user_store, - launch_environment->dyn_uid); - launch_environment->dyn_uid = 0; - } - g_signal_emit (G_OBJECT (launch_environment), signals [STOPPED], 0); return TRUE; @@ -694,35 +696,11 @@ } static void -_gdm_launch_environment_set_preferred_user_name (GdmLaunchEnvironment *launch_environment, - const char *name) -{ - g_free (launch_environment->preferred_user_name); - launch_environment->preferred_user_name = g_strdup (name); -} - -static void -_gdm_launch_environment_set_user_disp_name (GdmLaunchEnvironment *launch_environment, - const char *disp_name) -{ - g_free (launch_environment->user_disp_name); - launch_environment->user_disp_name = g_strdup (disp_name); -} - -static void -_gdm_launch_environment_set_user_member_of (GdmLaunchEnvironment *launch_environment, - const char *member_of) -{ - g_free (launch_environment->user_member_of); - launch_environment->user_member_of = g_strdup (member_of); -} - -static void -_gdm_launch_environment_set_dconf_profile (GdmLaunchEnvironment *launch_environment, - const char *profile) -{ - g_free (launch_environment->dconf_profile); - launch_environment->dconf_profile = g_strdup (profile); +_gdm_launch_environment_set_user_name (GdmLaunchEnvironment *launch_environment, + const char *name) +{ + g_free (launch_environment->user_name); + launch_environment->user_name = g_strdup (name); } static void @@ -752,17 +730,8 @@ case PROP_DISPLAY_IS_LOCAL: _gdm_launch_environment_set_display_is_local (self, g_value_get_boolean (value)); break; - case PROP_PREFERRED_USER_NAME: - _gdm_launch_environment_set_preferred_user_name (self, g_value_get_string (value)); - break; - case PROP_USER_DISP_NAME: - _gdm_launch_environment_set_user_disp_name (self, g_value_get_string (value)); - break; - case PROP_USER_MEMBER_OF: - _gdm_launch_environment_set_user_member_of (self, g_value_get_string (value)); - break; - case PROP_DCONF_PROFILE: - _gdm_launch_environment_set_dconf_profile (self, g_value_get_string (value)); + case PROP_USER_NAME: + _gdm_launch_environment_set_user_name (self, g_value_get_string (value)); break; case PROP_SESSION_NAME: _gdm_launch_environment_set_session_name (self, g_value_get_string (value)); @@ -793,17 +762,8 @@ case PROP_DISPLAY_IS_LOCAL: g_value_set_boolean (value, self->display_is_local); break; - case PROP_PREFERRED_USER_NAME: - g_value_set_string (value, self->preferred_user_name); - break; - case PROP_USER_DISP_NAME: - g_value_set_string (value, self->user_disp_name); - break; - case PROP_USER_MEMBER_OF: - g_value_set_string (value, self->user_member_of); - break; - case PROP_DCONF_PROFILE: - g_value_set_string (value, self->dconf_profile); + case PROP_USER_NAME: + g_value_set_string (value, self->user_name); break; case PROP_SESSION_NAME: g_value_set_string (value, self->session_name); @@ -852,6 +812,10 @@ NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); props[PROP_SESSION_NAME] = g_param_spec_string ("session-name", + NULL, NULL, + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + props[PROP_USER_NAME] = g_param_spec_string ("user-name", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); @@ -935,17 +899,10 @@ } g_free (launch_environment->session_name); - g_free (launch_environment->preferred_user_name); - g_free (launch_environment->dyn_user_name); - g_free (launch_environment->dyn_user_home); - g_free (launch_environment->user_disp_name); - g_free (launch_environment->user_member_of); - g_free (launch_environment->dconf_profile); + g_free (launch_environment->user_name); g_free (launch_environment->display_seat_id); g_free (launch_environment->display_hostname); g_free (launch_environment->session_id); - - g_clear_object (&launch_environment->dyn_user_store); G_OBJECT_CLASS (gdm_launch_environment_parent_class)->finalize (object); } @@ -957,10 +914,7 @@ { return g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT, "session-name", GDM_GREETER_SESSION, - "preferred-user-name", GDM_GREETER_USERNAME, - "user-display-name", GDM_GREETER_DISP_NAME, - "user-member-of", GDM_GROUPNAME, - "dconf-profile", GDM_DCONF_PROFILE, + "user-name", GDM_GROUPNAME, "display-seat-id", seat_id, "display-hostname", display_hostname, "display-is-local", display_is_local, @@ -974,10 +928,7 @@ { return g_object_new (GDM_TYPE_LAUNCH_ENVIRONMENT, "session-name", INITIAL_SETUP_SESSION, - "preferred-user-name", INITIAL_SETUP_USERNAME, - "user-display-name", INITIAL_SETUP_DISP_NAME, - "user-member-of", INITIAL_SETUP_GROUPNAME, - "dconf-profile", INITIAL_SETUP_DCONF_PROFILE, + "user-name", INITIAL_SETUP_USERNAME, "display-seat-id", seat_id, "display-hostname", display_hostname, "display-is-local", display_is_local, --- a/daemon/gdm-manager.c 2026-03-23 21:05:37.265201059 +0100 +++ b/daemon/gdm-manager.c 2026-03-23 21:05:37.266201059 +0100 @@ -1266,15 +1264,21 @@ set_up_greeter_session (GdmManager *manager, GdmDisplay *display) { - uid_t greeter_uid; + gboolean doing_initial_setup = FALSE; + const char *username; + struct passwd *passwd_entry; + + g_object_get (G_OBJECT (display), "doing-initial-setup", &doing_initial_setup, NULL); + username = doing_initial_setup ? "gnome-initial-setup" : GDM_GROUPNAME; - if (!gdm_display_prepare_greeter_session (display, manager->dyn_user_store, &greeter_uid)) { + if (!gdm_get_pwent_for_name (username, &passwd_entry)) { + g_warning ("GdmManager: greeter user '%s' not found", username); gdm_display_unmanage (display); gdm_display_finish (display); return; } - create_user_session_for_display (manager, display, greeter_uid); + create_user_session_for_display (manager, display, passwd_entry->pw_uid); gdm_display_start_greeter_session (display); } @@ -2490,7 +2494,6 @@ static void gdm_manager_init (GdmManager *manager) { - manager->dyn_user_store = gdm_dynamic_user_store_new (); manager->display_store = gdm_display_store_new (); manager->user_sessions = NULL; manager->open_reauthentication_requests = g_hash_table_new_full (NULL,