~lightdm-team/lightdm/1.4

« back to all changes in this revision

Viewing changes to src/user-manager.c

  • Committer: robert.ancell at gmail
  • Date: 2010-06-19 03:05:45 UTC
  • Revision ID: robert.ancell@gmail.com-20100619030545-s6u3hevatisr850m
Make libldmgreeter library

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
struct UserManagerPrivate
20
20
{
21
 
    /* Configuration file */
22
 
    GKeyFile *config;
23
 
 
24
 
    /* TRUE if have scanned users */
25
21
    gboolean have_users;
26
 
 
27
 
    /* List of users */
28
22
    GList *users;
29
23
};
30
24
 
31
25
G_DEFINE_TYPE (UserManager, user_manager, G_TYPE_OBJECT);
32
26
 
33
27
UserManager *
34
 
user_manager_new (GKeyFile *config_file)
 
28
user_manager_new (/*int argc, char **argv*/)
35
29
{
36
 
    UserManager *manager;
37
 
 
38
 
    manager = g_object_new (USER_MANAGER_TYPE, NULL);
39
 
    manager->priv->config = config_file;
40
 
 
41
 
    return manager;
 
30
    return g_object_new (USER_MANAGER_TYPE, NULL);
42
31
}
43
32
 
 
33
// FIXME: 100 or 500? Make it configurable
 
34
#define MINIMUM_UID 500
 
35
 
44
36
static gint
45
37
compare_user (gconstpointer a, gconstpointer b)
46
38
{
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);
54
46
static void
55
47
update_users (UserManager *manager)
56
48
{
57
 
    gchar **hidden_users, **hidden_shells;
58
 
    gchar *value;
59
 
    gint minimum_uid;
 
49
    char *invalid_shells[] = { "/bin/false", "/usr/sbin/nologin", NULL };
 
50
    char *invalid_users[] = { "nobody", NULL };
60
51
 
61
52
    if (manager->priv->have_users)
62
53
        return;
63
54
 
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))
67
 
    {
68
 
        manager->priv->have_users = TRUE;
69
 
        return;
70
 
    }
71
 
 
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);
74
 
    else
75
 
        minimum_uid = 500;
76
 
 
77
 
    value = g_key_file_get_string (manager->priv->config, "UserManager", "hidden-users", NULL);
78
 
    if (!value)
79
 
        value = g_strdup ("nobody nobody4 noaccess");
80
 
    hidden_users = g_strsplit (value, " ", -1);
81
 
    g_free (value);
82
 
 
83
 
    value = g_key_file_get_string (manager->priv->config, "UserManager", "hidden-shells", NULL);
84
 
    if (!value)
85
 
        value = g_strdup ("/bin/false /usr/sbin/nologin");
86
 
    hidden_shells = g_strsplit (value, " ", -1);
87
 
    g_free (value);
88
 
 
89
55
    setpwent ();
90
56
 
91
57
    while (TRUE)
102
68
            break;
103
69
 
104
70
        /* Ignore system users */
105
 
        if (entry->pw_uid < minimum_uid)
 
71
        if (entry->pw_uid < MINIMUM_UID)
106
72
            continue;
107
73
 
108
74
        /* Ignore users disabled by shell */
109
75
        if (entry->pw_shell)
110
76
        {
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])
113
79
                continue;
114
80
        }
115
81
 
116
82
        /* Ignore certain users */
117
 
        for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++);
118
 
        if (hidden_users[i])
 
83
        for (i = 0; invalid_users[i] && strcmp (entry->pw_name, invalid_users[i]) != 0; i++);
 
84
        if (invalid_users[i])
119
85
            continue;
120
86
 
121
87
        user = g_malloc0 (sizeof (UserInfo));
130
96
 
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;
134
100
        else
 
101
        {
135
102
            user->image = g_strdup ("");
136
 
        g_free (image_path);
 
103
            g_free (image_path);
 
104
        }
137
105
 
138
106
        manager->priv->users = g_list_insert_sorted (manager->priv->users, user, compare_user);
139
107
    }
142
110
        g_warning ("Failed to read password database: %s", strerror (errno));
143
111
 
144
112
    endpwent ();
145
 
  
146
 
    g_strfreev (hidden_users);
147
 
    g_strfreev (hidden_shells);
148
113
 
149
114
    manager->priv->have_users = TRUE;
150
115
}