diff options
author | Ray Strode <rstrode@redhat.com> | 2017-05-04 12:04:05 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2017-05-04 12:22:30 -0400 |
commit | 1890b71ed4d64ce17240b93a219a3691806ea49a (patch) | |
tree | 9989e1a3046834475144085dcf25096267bf57e0 | |
parent | db223bc474b5ae914f2c6ff4d07c69d747cfeda7 (diff) | |
download | accountsservice-cache-fix.tar.gz |
daemon: don't treat explicitly requested users as "cached"cache-fix
The ListCachedUsers method currently returns users that have
been explicitly requested by a client. It's weird that merely
querying a user can make it show up in login screen user lists.
Furthermore, UncacheUser is broken since commit
177509e9460b149ecbf85e75c930be2ea00b7d05 because the user has
been explicitly requested in order to uncache it. So trying
to uncache a user inadvertently caches the user.
This commit fixes that.
-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); |