Blob Blame History Raw
From a9699746f5b5e6c3a6ea3e3509df0a21a67e4eaf Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Thu, 24 Feb 2011 17:49:11 -0500
Subject: [PATCH 3/3] Keep excluded users off the cached list

Previously, calling FindUserByName would create a user object
and then it would be included in ListCachedUsers return  values
even though it has e.g. a low uid.

This was causing both the root and gdm users to show up in
the user account panel.
---
 src/daemon.c |   49 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/src/daemon.c b/src/daemon.c
index 3b021ad..4e0b935 100644
--- a/src/daemon.c
+++ b/src/daemon.c
@@ -213,6 +213,18 @@ daemon_class_init (DaemonClass *klass)
                                                               G_PARAM_READABLE));
 }
 
+static gboolean
+user_is_excluded (Daemon *daemon, const gchar *username, uid_t uid)
+{
+        if (uid < MINIMAL_UID) {
+                return TRUE;
+        }
+        if (g_hash_table_lookup (daemon->priv->exclusions, username)) {
+                return TRUE;
+        }
+
+        return FALSE;
+}
 
 static void
 listify_hash_values_hfunc (gpointer key,
@@ -325,7 +337,8 @@ process_ck_history_line (Daemon      *daemon,
                 return;
         }
 
-        if (g_hash_table_lookup (daemon->priv->exclusions, username)) {
+        /* pass MINIMAL_UID to just check the name here */
+        if (user_is_excluded (daemon, username, MINIMAL_UID)) {
                 g_debug ("excluding user '%s'", username);
                 g_free (username);
                 return;
@@ -474,13 +487,8 @@ reload_passwd (Daemon *daemon)
 
         for (pwent = fgetpwent (fp); pwent != NULL; pwent = fgetpwent (fp)) {
                 /* Skip users below MINIMAL_UID... */
-                if (pwent->pw_uid < MINIMAL_UID) {
-                        continue;
-                }
-
-                /* ...and explicitly excluded users */
-                if (g_hash_table_lookup (daemon->priv->exclusions, pwent->pw_name)) {
-                        g_debug ("explicitly skipping user: %s", pwent->pw_name);
+                if (user_is_excluded (daemon, pwent->pw_name, pwent->pw_uid)) {
+                        g_debug ("skipping user: %s", pwent->pw_name);
                         continue;
                 }
 
@@ -919,21 +927,12 @@ daemon_find_user_by_name (Daemon                *daemon,
         return TRUE;
 }
 
-static void
-enumerate_cb (gpointer key,
-              gpointer value,
-              gpointer user_data)
-{
-        User *user = USER (value);
-        GPtrArray *object_paths = user_data;
-        g_ptr_array_add (object_paths, g_strdup (user_local_get_object_path (user)));
-}
-
 typedef struct {
         Daemon *daemon;
         DBusGMethodInvocation *context;
 } ListUserData;
 
+
 static ListUserData *
 list_user_data_new (Daemon                *daemon,
                     DBusGMethodInvocation *context)
@@ -960,9 +959,21 @@ finish_list_cached_users (gpointer user_data)
 {
         ListUserData *data = user_data;
         GPtrArray *object_paths;
+        GHashTableIter iter;
+        const gchar *name;
+        User *user;
+        uid_t uid;
 
         object_paths = g_ptr_array_new ();
-        g_hash_table_foreach (data->daemon->priv->users, enumerate_cb, object_paths);
+
+        g_hash_table_iter_init (&iter, data->daemon->priv->users);
+        while (g_hash_table_iter_next (&iter, (gpointer *)&name, (gpointer *)&user)) {
+                uid = user_local_get_uid (user);
+                if (!user_is_excluded (data->daemon, name, uid)) {
+                        g_debug ("user %s %ld not excluded\n", name, uid);
+                        g_ptr_array_add (object_paths, g_strdup (user_local_get_object_path (user)));
+                }
+        }
 
         dbus_g_method_return (data->context, object_paths);
 
-- 
1.7.4.1