Matthias Clasen 99ef53
From a9699746f5b5e6c3a6ea3e3509df0a21a67e4eaf Mon Sep 17 00:00:00 2001
Matthias Clasen 99ef53
From: Matthias Clasen <mclasen@redhat.com>
Matthias Clasen 99ef53
Date: Thu, 24 Feb 2011 17:49:11 -0500
Matthias Clasen 99ef53
Subject: [PATCH 3/3] Keep excluded users off the cached list
Matthias Clasen 99ef53
Matthias Clasen 99ef53
Previously, calling FindUserByName would create a user object
Matthias Clasen 99ef53
and then it would be included in ListCachedUsers return  values
Matthias Clasen 99ef53
even though it has e.g. a low uid.
Matthias Clasen 99ef53
Matthias Clasen 99ef53
This was causing both the root and gdm users to show up in
Matthias Clasen 99ef53
the user account panel.
Matthias Clasen 99ef53
---
Matthias Clasen 99ef53
 src/daemon.c |   49 ++++++++++++++++++++++++++++++-------------------
Matthias Clasen 99ef53
 1 files changed, 30 insertions(+), 19 deletions(-)
Matthias Clasen 99ef53
Matthias Clasen 99ef53
diff --git a/src/daemon.c b/src/daemon.c
Matthias Clasen 99ef53
index 3b021ad..4e0b935 100644
Matthias Clasen 99ef53
--- a/src/daemon.c
Matthias Clasen 99ef53
+++ b/src/daemon.c
Matthias Clasen 99ef53
@@ -213,6 +213,18 @@ daemon_class_init (DaemonClass *klass)
Matthias Clasen 99ef53
                                                               G_PARAM_READABLE));
Matthias Clasen 99ef53
 }
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
+static gboolean
Matthias Clasen 99ef53
+user_is_excluded (Daemon *daemon, const gchar *username, uid_t uid)
Matthias Clasen 99ef53
+{
Matthias Clasen 99ef53
+        if (uid < MINIMAL_UID) {
Matthias Clasen 99ef53
+                return TRUE;
Matthias Clasen 99ef53
+        }
Matthias Clasen 99ef53
+        if (g_hash_table_lookup (daemon->priv->exclusions, username)) {
Matthias Clasen 99ef53
+                return TRUE;
Matthias Clasen 99ef53
+        }
Matthias Clasen 99ef53
+
Matthias Clasen 99ef53
+        return FALSE;
Matthias Clasen 99ef53
+}
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
 static void
Matthias Clasen 99ef53
 listify_hash_values_hfunc (gpointer key,
Matthias Clasen 99ef53
@@ -325,7 +337,8 @@ process_ck_history_line (Daemon      *daemon,
Matthias Clasen 99ef53
                 return;
Matthias Clasen 99ef53
         }
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
-        if (g_hash_table_lookup (daemon->priv->exclusions, username)) {
Matthias Clasen 99ef53
+        /* pass MINIMAL_UID to just check the name here */
Matthias Clasen 99ef53
+        if (user_is_excluded (daemon, username, MINIMAL_UID)) {
Matthias Clasen 99ef53
                 g_debug ("excluding user '%s'", username);
Matthias Clasen 99ef53
                 g_free (username);
Matthias Clasen 99ef53
                 return;
Matthias Clasen 99ef53
@@ -474,13 +487,8 @@ reload_passwd (Daemon *daemon)
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
         for (pwent = fgetpwent (fp); pwent != NULL; pwent = fgetpwent (fp)) {
Matthias Clasen 99ef53
                 /* Skip users below MINIMAL_UID... */
Matthias Clasen 99ef53
-                if (pwent->pw_uid < MINIMAL_UID) {
Matthias Clasen 99ef53
-                        continue;
Matthias Clasen 99ef53
-                }
Matthias Clasen 99ef53
-
Matthias Clasen 99ef53
-                /* ...and explicitly excluded users */
Matthias Clasen 99ef53
-                if (g_hash_table_lookup (daemon->priv->exclusions, pwent->pw_name)) {
Matthias Clasen 99ef53
-                        g_debug ("explicitly skipping user: %s", pwent->pw_name);
Matthias Clasen 99ef53
+                if (user_is_excluded (daemon, pwent->pw_name, pwent->pw_uid)) {
Matthias Clasen 99ef53
+                        g_debug ("skipping user: %s", pwent->pw_name);
Matthias Clasen 99ef53
                         continue;
Matthias Clasen 99ef53
                 }
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
@@ -919,21 +927,12 @@ daemon_find_user_by_name (Daemon                *daemon,
Matthias Clasen 99ef53
         return TRUE;
Matthias Clasen 99ef53
 }
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
-static void
Matthias Clasen 99ef53
-enumerate_cb (gpointer key,
Matthias Clasen 99ef53
-              gpointer value,
Matthias Clasen 99ef53
-              gpointer user_data)
Matthias Clasen 99ef53
-{
Matthias Clasen 99ef53
-        User *user = USER (value);
Matthias Clasen 99ef53
-        GPtrArray *object_paths = user_data;
Matthias Clasen 99ef53
-        g_ptr_array_add (object_paths, g_strdup (user_local_get_object_path (user)));
Matthias Clasen 99ef53
-}
Matthias Clasen 99ef53
-
Matthias Clasen 99ef53
 typedef struct {
Matthias Clasen 99ef53
         Daemon *daemon;
Matthias Clasen 99ef53
         DBusGMethodInvocation *context;
Matthias Clasen 99ef53
 } ListUserData;
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
+
Matthias Clasen 99ef53
 static ListUserData *
Matthias Clasen 99ef53
 list_user_data_new (Daemon                *daemon,
Matthias Clasen 99ef53
                     DBusGMethodInvocation *context)
Matthias Clasen 99ef53
@@ -960,9 +959,21 @@ finish_list_cached_users (gpointer user_data)
Matthias Clasen 99ef53
 {
Matthias Clasen 99ef53
         ListUserData *data = user_data;
Matthias Clasen 99ef53
         GPtrArray *object_paths;
Matthias Clasen 99ef53
+        GHashTableIter iter;
Matthias Clasen 99ef53
+        const gchar *name;
Matthias Clasen 99ef53
+        User *user;
Matthias Clasen 99ef53
+        uid_t uid;
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
         object_paths = g_ptr_array_new ();
Matthias Clasen 99ef53
-        g_hash_table_foreach (data->daemon->priv->users, enumerate_cb, object_paths);
Matthias Clasen 99ef53
+
Matthias Clasen 99ef53
+        g_hash_table_iter_init (&iter, data->daemon->priv->users);
Matthias Clasen 99ef53
+        while (g_hash_table_iter_next (&iter, (gpointer *)&name, (gpointer *)&user)) {
Matthias Clasen 99ef53
+                uid = user_local_get_uid (user);
Matthias Clasen 99ef53
+                if (!user_is_excluded (data->daemon, name, uid)) {
Matthias Clasen 99ef53
+                        g_debug ("user %s %ld not excluded\n", name, uid);
Matthias Clasen 99ef53
+                        g_ptr_array_add (object_paths, g_strdup (user_local_get_object_path (user)));
Matthias Clasen 99ef53
+                }
Matthias Clasen 99ef53
+        }
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
         dbus_g_method_return (data->context, object_paths);
Matthias Clasen 99ef53
 
Matthias Clasen 99ef53
-- 
Matthias Clasen 99ef53
1.7.4.1
Matthias Clasen 99ef53