diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/daemon.c | 58 | ||||
-rw-r--r-- | src/user.c | 17 | ||||
-rw-r--r-- | src/user.h | 3 |
3 files changed, 55 insertions, 23 deletions
diff --git a/src/daemon.c b/src/daemon.c index 312394a..ead50f6 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -356,7 +356,7 @@ entry_generator_requested_users (Daemon *daemon, static void load_entries (Daemon *daemon, GHashTable *users, - gboolean allow_system_users, + gboolean explicitly_requested, EntryGeneratorFunc entry_generator) { gpointer generator_state = NULL; @@ -373,29 +373,37 @@ load_entries (Daemon *daemon, break; /* Skip system users... */ - if (!allow_system_users && !user_classify_is_human (pwent->pw_uid, pwent->pw_name, pwent->pw_shell, spent? spent->sp_pwdp : NULL)) { + if (!explicitly_requested && !user_classify_is_human (pwent->pw_uid, pwent->pw_name, pwent->pw_shell, spent? spent->sp_pwdp : NULL)) { g_debug ("skipping user: %s", pwent->pw_name); continue; } - /* ignore duplicate entries */ - if (g_hash_table_lookup (users, pwent->pw_name)) { - continue; - } + /* Only process users that haven't been processed yet. + * We do always make sure entries get promoted + * to "cached" status if they are supposed to be + */ + + user = g_hash_table_lookup (users, pwent->pw_name); - user = g_hash_table_lookup (daemon->priv->users, pwent->pw_name); if (user == NULL) { - user = user_new (daemon, pwent->pw_uid); - } else { - g_object_ref (user); - } + user = g_hash_table_lookup (daemon->priv->users, pwent->pw_name); + if (user == NULL) { + user = user_new (daemon, pwent->pw_uid); + } else { + g_object_ref (user); + } - /* freeze & update users not already in the new list */ - g_object_freeze_notify (G_OBJECT (user)); - user_update_from_pwent (user, pwent, spent); + /* freeze & update users not already in the new list */ + g_object_freeze_notify (G_OBJECT (user)); + user_update_from_pwent (user, pwent, spent); + + g_hash_table_insert (users, g_strdup (user_get_user_name (user)), user); + g_debug ("loaded user: %s", user_get_user_name (user)); + } - g_hash_table_insert (users, g_strdup (user_get_user_name (user)), user); - g_debug ("loaded user: %s", user_get_user_name (user)); + if (!explicitly_requested) { + user_set_cached (user, TRUE); + } } /* Generator should have cleaned up */ @@ -938,6 +946,10 @@ finish_list_cached_users (gpointer user_data) continue; } + if (!user_get_cached (user)) { + g_debug ("user %s %ld not cached", name, (long) uid); + } + g_debug ("user %s %ld not excluded", name, (long) uid); g_ptr_array_add (object_paths, (gpointer) user_get_object_path (user)); } @@ -1178,6 +1190,8 @@ daemon_uncache_user_authorized_cb (Daemon *daemon, g_remove (filename); g_free (filename); + user_set_cached (user, FALSE); + accounts_accounts_complete_uncache_user (NULL, context); queue_reload_users (daemon); @@ -1219,6 +1233,7 @@ daemon_delete_user_authorized_cb (Daemon *daemon, gchar *filename; struct passwd *pwent; const gchar *argv[6]; + User *user; pwent = getpwuid (ud->uid); @@ -1230,17 +1245,14 @@ daemon_delete_user_authorized_cb (Daemon *daemon, sys_log (context, "delete user '%s' (%d)", pwent->pw_name, ud->uid); - if (daemon->priv->autologin != NULL) { - User *user; - - user = daemon_local_find_user_by_id (daemon, ud->uid); + user = daemon_local_find_user_by_id (daemon, ud->uid); - g_assert (user != NULL); + if (user != NULL) { + user_set_cached (user, FALSE); - if (daemon->priv->autologin == user) { + if (daemon->priv->autologin == user) { daemon_local_set_automatic_login (daemon, user, FALSE, NULL); } - } filename = g_build_filename (USERDIR, pwent->pw_name, NULL); @@ -110,6 +110,7 @@ struct User { gboolean automatic_login; gboolean system_account; gboolean local_account; + gboolean cached; guint *extension_ids; guint n_extension_ids; @@ -366,6 +367,7 @@ user_update_from_keyfile (User *user, g_clear_pointer (&user->keyfile, g_key_file_unref); user->keyfile = g_key_file_ref (keyfile); + user_set_cached (user, TRUE); g_object_thaw_notify (G_OBJECT (user)); } @@ -415,6 +417,8 @@ user_save_to_keyfile (User *user, g_key_file_set_string (keyfile, "User", "Icon", user->icon_file); g_key_file_set_boolean (keyfile, "User", "SystemAccount", user->system_account); + + user_set_cached (user, TRUE); } static void @@ -837,6 +841,19 @@ user_get_shell(User *user) return user->shell; } +gboolean +user_get_cached (User *user) +{ + return user->cached; +} + +void +user_set_cached (User *user, + gboolean cached) +{ + user->cached = cached; +} + static void throw_error (GDBusMethodInvocation *context, gint error_code, @@ -63,6 +63,9 @@ void user_update_local_account_property (User *user, gboolean local); void user_update_system_account_property (User *user, gboolean system); +gboolean user_get_cached (User *user); +void user_set_cached (User *user, + gboolean cached); void user_register (User *user); void user_unregister (User *user); |