chiark / gitweb /
0b5dc945a6b428f997fc07a22c082344ee2b07a3
[elogind.git] / src / test / test-user-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   This file is part of systemd.
4
5   Copyright 2015 Lennart Poettering
6 ***/
7
8 #include "alloc-util.h"
9 //#include "log.h"
10 #include "macro.h"
11 #include "string-util.h"
12 #include "user-util.h"
13 #include "util.h"
14 #include "path-util.h"
15
16 static void test_uid_to_name_one(uid_t uid, const char *name) {
17         _cleanup_free_ char *t = NULL;
18
19         log_info("/* %s("UID_FMT", \"%s\") */", __func__, uid, name);
20
21         assert_se(t = uid_to_name(uid));
22         if (!synthesize_nobody() && streq(name, NOBODY_USER_NAME)) {
23                 log_info("(skipping detailed tests because nobody is not synthesized)");
24                 return;
25         }
26         assert_se(streq_ptr(t, name));
27 }
28
29 static void test_gid_to_name_one(gid_t gid, const char *name) {
30         _cleanup_free_ char *t = NULL;
31
32         log_info("/* %s("GID_FMT", \"%s\") */", __func__, gid, name);
33
34         assert_se(t = gid_to_name(gid));
35         if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) {
36                 log_info("(skipping detailed tests because nobody is not synthesized)");
37                 return;
38         }
39         assert_se(streq_ptr(t, name));
40 }
41
42 static void test_parse_uid(void) {
43         int r;
44         uid_t uid;
45
46         log_info("/* %s */", __func__);
47
48         r = parse_uid("100", &uid);
49         assert_se(r == 0);
50         assert_se(uid == 100);
51
52         r = parse_uid("65535", &uid);
53         assert_se(r == -ENXIO);
54
55         r = parse_uid("asdsdas", &uid);
56         assert_se(r == -EINVAL);
57 }
58
59 static void test_uid_ptr(void) {
60         log_info("/* %s */", __func__);
61
62         assert_se(UID_TO_PTR(0) != NULL);
63         assert_se(UID_TO_PTR(1000) != NULL);
64
65         assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
66         assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
67 }
68
69 static void test_valid_user_group_name(void) {
70         log_info("/* %s */", __func__);
71
72         assert_se(!valid_user_group_name(NULL));
73         assert_se(!valid_user_group_name(""));
74         assert_se(!valid_user_group_name("1"));
75         assert_se(!valid_user_group_name("65535"));
76         assert_se(!valid_user_group_name("-1"));
77         assert_se(!valid_user_group_name("-kkk"));
78         assert_se(!valid_user_group_name("rööt"));
79         assert_se(!valid_user_group_name("."));
80         assert_se(!valid_user_group_name("eff.eff"));
81         assert_se(!valid_user_group_name("foo\nbar"));
82         assert_se(!valid_user_group_name("0123456789012345678901234567890123456789"));
83         assert_se(!valid_user_group_name_or_id("aaa:bbb"));
84
85         assert_se(valid_user_group_name("root"));
86         assert_se(valid_user_group_name("lennart"));
87         assert_se(valid_user_group_name("LENNART"));
88         assert_se(valid_user_group_name("_kkk"));
89         assert_se(valid_user_group_name("kkk-"));
90         assert_se(valid_user_group_name("kk-k"));
91
92         assert_se(valid_user_group_name("some5"));
93         assert_se(!valid_user_group_name("5some"));
94         assert_se(valid_user_group_name("INNER5NUMBER"));
95 }
96
97 static void test_valid_user_group_name_or_id(void) {
98         log_info("/* %s */", __func__);
99
100         assert_se(!valid_user_group_name_or_id(NULL));
101         assert_se(!valid_user_group_name_or_id(""));
102         assert_se(valid_user_group_name_or_id("0"));
103         assert_se(valid_user_group_name_or_id("1"));
104         assert_se(valid_user_group_name_or_id("65534"));
105         assert_se(!valid_user_group_name_or_id("65535"));
106         assert_se(valid_user_group_name_or_id("65536"));
107         assert_se(!valid_user_group_name_or_id("-1"));
108         assert_se(!valid_user_group_name_or_id("-kkk"));
109         assert_se(!valid_user_group_name_or_id("rööt"));
110         assert_se(!valid_user_group_name_or_id("."));
111         assert_se(!valid_user_group_name_or_id("eff.eff"));
112         assert_se(!valid_user_group_name_or_id("foo\nbar"));
113         assert_se(!valid_user_group_name_or_id("0123456789012345678901234567890123456789"));
114         assert_se(!valid_user_group_name_or_id("aaa:bbb"));
115
116         assert_se(valid_user_group_name_or_id("root"));
117         assert_se(valid_user_group_name_or_id("lennart"));
118         assert_se(valid_user_group_name_or_id("LENNART"));
119         assert_se(valid_user_group_name_or_id("_kkk"));
120         assert_se(valid_user_group_name_or_id("kkk-"));
121         assert_se(valid_user_group_name_or_id("kk-k"));
122
123         assert_se(valid_user_group_name_or_id("some5"));
124         assert_se(!valid_user_group_name_or_id("5some"));
125         assert_se(valid_user_group_name_or_id("INNER5NUMBER"));
126 }
127
128 static void test_valid_gecos(void) {
129         log_info("/* %s */", __func__);
130
131         assert_se(!valid_gecos(NULL));
132         assert_se(valid_gecos(""));
133         assert_se(valid_gecos("test"));
134         assert_se(valid_gecos("Ümläüt"));
135         assert_se(!valid_gecos("In\nvalid"));
136         assert_se(!valid_gecos("In:valid"));
137 }
138
139 static void test_valid_home(void) {
140         log_info("/* %s */", __func__);
141
142         assert_se(!valid_home(NULL));
143         assert_se(!valid_home(""));
144         assert_se(!valid_home("."));
145         assert_se(!valid_home("/home/.."));
146         assert_se(!valid_home("/home/../"));
147         assert_se(!valid_home("/home\n/foo"));
148         assert_se(!valid_home("./piep"));
149         assert_se(!valid_home("piep"));
150         assert_se(!valid_home("/home/user:lennart"));
151
152         assert_se(valid_home("/"));
153         assert_se(valid_home("/home"));
154         assert_se(valid_home("/home/foo"));
155 }
156
157 static void test_get_user_creds_one(const char *id, const char *name, uid_t uid, gid_t gid, const char *home, const char *shell) {
158         const char *rhome = NULL;
159         const char *rshell = NULL;
160         uid_t ruid = UID_INVALID;
161         gid_t rgid = GID_INVALID;
162         int r;
163
164         log_info("/* %s(\"%s\", \"%s\", "UID_FMT", "GID_FMT", \"%s\", \"%s\") */",
165                  __func__, id, name, uid, gid, home, shell);
166
167         r = get_user_creds(&id, &ruid, &rgid, &rhome, &rshell);
168         log_info_errno(r, "got \"%s\", "UID_FMT", "GID_FMT", \"%s\", \"%s\": %m",
169                        id, ruid, rgid, strnull(rhome), strnull(rshell));
170         if (!synthesize_nobody() && streq(name, NOBODY_USER_NAME)) {
171                 log_info("(skipping detailed tests because nobody is not synthesized)");
172                 return;
173         }
174         assert_se(r == 0);
175         assert_se(streq_ptr(id, name));
176         assert_se(ruid == uid);
177         assert_se(rgid == gid);
178         assert_se(path_equal(rhome, home));
179         assert_se(path_equal(rshell, shell));
180 }
181
182 #if 0 /// UNNEEDED by elogind
183 static void test_get_group_creds_one(const char *id, const char *name, gid_t gid) {
184         gid_t rgid = GID_INVALID;
185         int r;
186
187         log_info("/* %s(\"%s\", \"%s\", "GID_FMT") */", __func__, id, name, gid);
188
189         r = get_group_creds(&id, &rgid);
190         log_info_errno(r, "got \"%s\", "GID_FMT": %m", id, rgid);
191         if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) {
192                 log_info("(skipping detailed tests because nobody is not synthesized)");
193                 return;
194         }
195         assert_se(r == 0);
196         assert_se(streq_ptr(id, name));
197         assert_se(rgid == gid);
198 }
199 #endif // 0
200
201 int main(int argc, char*argv[]) {
202         test_uid_to_name_one(0, "root");
203         test_uid_to_name_one(UID_NOBODY, NOBODY_USER_NAME);
204         test_uid_to_name_one(0xFFFF, "65535");
205         test_uid_to_name_one(0xFFFFFFFF, "4294967295");
206
207         test_gid_to_name_one(0, "root");
208 #if 0 /// UNNEEDED by elogind
209         test_gid_to_name_one(GID_NOBODY, NOBODY_GROUP_NAME);
210         test_gid_to_name_one(TTY_GID, "tty");
211 #endif // 0
212         test_gid_to_name_one(0xFFFF, "65535");
213         test_gid_to_name_one(0xFFFFFFFF, "4294967295");
214
215         test_get_user_creds_one("root", "root", 0, 0, "/root", "/bin/sh");
216         test_get_user_creds_one("0", "root", 0, 0, "/root", "/bin/sh");
217         test_get_user_creds_one(NOBODY_USER_NAME, NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
218         test_get_user_creds_one("65534", NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
219
220 #if 0 /// UNNEEDED by elogind
221         test_get_group_creds_one("root", "root", 0);
222         test_get_group_creds_one("0", "root", 0);
223         test_get_group_creds_one(NOBODY_GROUP_NAME, NOBODY_GROUP_NAME, GID_NOBODY);
224         test_get_group_creds_one("65534", NOBODY_GROUP_NAME, GID_NOBODY);
225 #endif // 0
226
227         test_parse_uid();
228         test_uid_ptr();
229
230         test_valid_user_group_name();
231         test_valid_user_group_name_or_id();
232         test_valid_gecos();
233         test_valid_home();
234
235         return 0;
236 }