19
19
struct UserManagerPrivate
21
/* Configuration file */
24
/* TRUE if have scanned users */
25
21
gboolean have_users;
31
25
G_DEFINE_TYPE (UserManager, user_manager, G_TYPE_OBJECT);
34
user_manager_new (GKeyFile *config_file)
28
user_manager_new (/*int argc, char **argv*/)
38
manager = g_object_new (USER_MANAGER_TYPE, NULL);
39
manager->priv->config = config_file;
30
return g_object_new (USER_MANAGER_TYPE, NULL);
33
// FIXME: 100 or 500? Make it configurable
34
#define MINIMUM_UID 500
45
37
compare_user (gconstpointer a, gconstpointer b)
47
39
const UserInfo *user_a = a, *user_b = b;
48
const gchar *name_a, *name_b;
40
const char *name_a, *name_b;
49
41
name_a = user_a->real_name ? user_a->real_name : user_a->name;
50
42
name_b = user_b->real_name ? user_b->real_name : user_b->name;
51
43
return strcmp (name_a, name_b);
55
47
update_users (UserManager *manager)
57
gchar **hidden_users, **hidden_shells;
49
char *invalid_shells[] = { "/bin/false", "/usr/sbin/nologin", NULL };
50
char *invalid_users[] = { "nobody", NULL };
61
52
if (manager->priv->have_users)
64
/* User listing is disabled */
65
if (g_key_file_has_key (manager->priv->config, "UserManager", "load-users", NULL) &&
66
!g_key_file_get_boolean (manager->priv->config, "UserManager", "load-users", NULL))
68
manager->priv->have_users = TRUE;
72
if (g_key_file_has_key (manager->priv->config, "UserManager", "minimum-uid", NULL))
73
minimum_uid = g_key_file_get_integer (manager->priv->config, "UserManager", "minimum-uid", NULL);
77
value = g_key_file_get_string (manager->priv->config, "UserManager", "hidden-users", NULL);
79
value = g_strdup ("nobody nobody4 noaccess");
80
hidden_users = g_strsplit (value, " ", -1);
83
value = g_key_file_get_string (manager->priv->config, "UserManager", "hidden-shells", NULL);
85
value = g_strdup ("/bin/false /usr/sbin/nologin");
86
hidden_shells = g_strsplit (value, " ", -1);
104
70
/* Ignore system users */
105
if (entry->pw_uid < minimum_uid)
71
if (entry->pw_uid < MINIMUM_UID)
108
74
/* Ignore users disabled by shell */
109
75
if (entry->pw_shell)
111
for (i = 0; hidden_shells[i] && strcmp (entry->pw_shell, hidden_shells[i]) != 0; i++);
112
if (hidden_shells[i])
77
for (i = 0; invalid_shells[i] && strcmp (entry->pw_shell, invalid_shells[i]) != 0; i++);
78
if (invalid_shells[i])
116
82
/* Ignore certain users */
117
for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++);
83
for (i = 0; invalid_users[i] && strcmp (entry->pw_name, invalid_users[i]) != 0; i++);
121
87
user = g_malloc0 (sizeof (UserInfo));
131
97
image_path = g_build_filename ("/home", user->name, ".face", NULL);
132
98
if (g_file_test (image_path, G_FILE_TEST_EXISTS))
133
user->image = g_filename_to_uri (image_path, NULL, NULL);
99
user->image = image_path;
135
102
user->image = g_strdup ("");
138
106
manager->priv->users = g_list_insert_sorted (manager->priv->users, user, compare_user);
142
110
g_warning ("Failed to read password database: %s", strerror (errno));
146
g_strfreev (hidden_users);
147
g_strfreev (hidden_shells);
149
114
manager->priv->have_users = TRUE;