summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/daemon.c58
-rw-r--r--src/user.c17
-rw-r--r--src/user.h3
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);
diff --git a/src/user.c b/src/user.c
index 802d07a..a83cfe4 100644
--- a/src/user.c
+++ b/src/user.c
@@ -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,
diff --git a/src/user.h b/src/user.h
index 22548f9..39c6f13 100644
--- a/src/user.h
+++ b/src/user.h
@@ -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);