]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
d0260817 | 2 | |
b5efdb8a | 3 | #include "alloc-util.h" |
ca78ad1d | 4 | #include "format-util.h" |
42f3b2f9 | 5 | #include "libcrypt-util.h" |
52c6e6a8 | 6 | #include "log.h" |
d0260817 | 7 | #include "macro.h" |
c6cecb74 | 8 | #include "memory-util.h" |
ca78ad1d | 9 | #include "path-util.h" |
d0260817 LP |
10 | #include "string-util.h" |
11 | #include "user-util.h" | |
d0260817 LP |
12 | |
13 | static void test_uid_to_name_one(uid_t uid, const char *name) { | |
14 | _cleanup_free_ char *t = NULL; | |
15 | ||
52c6e6a8 ZJS |
16 | log_info("/* %s("UID_FMT", \"%s\") */", __func__, uid, name); |
17 | ||
d0260817 | 18 | assert_se(t = uid_to_name(uid)); |
7559b2da ZJS |
19 | if (!synthesize_nobody() && streq(name, NOBODY_USER_NAME)) { |
20 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
21 | return; | |
22 | } | |
d0260817 LP |
23 | assert_se(streq_ptr(t, name)); |
24 | } | |
25 | ||
26 | static void test_gid_to_name_one(gid_t gid, const char *name) { | |
27 | _cleanup_free_ char *t = NULL; | |
28 | ||
52c6e6a8 ZJS |
29 | log_info("/* %s("GID_FMT", \"%s\") */", __func__, gid, name); |
30 | ||
d0260817 | 31 | assert_se(t = gid_to_name(gid)); |
7559b2da ZJS |
32 | if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) { |
33 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
34 | return; | |
35 | } | |
d0260817 LP |
36 | assert_se(streq_ptr(t, name)); |
37 | } | |
38 | ||
d5b29bb5 RC |
39 | static void test_parse_uid(void) { |
40 | int r; | |
41 | uid_t uid; | |
42 | ||
52c6e6a8 ZJS |
43 | log_info("/* %s */", __func__); |
44 | ||
53c6db99 LP |
45 | r = parse_uid("0", &uid); |
46 | assert_se(r == 0); | |
47 | assert_se(uid == 0); | |
48 | ||
49 | r = parse_uid("1", &uid); | |
50 | assert_se(r == 0); | |
51 | assert_se(uid == 1); | |
52 | ||
53 | r = parse_uid("01", &uid); | |
54 | assert_se(r == -EINVAL); | |
55 | assert_se(uid == 1); | |
56 | ||
57 | r = parse_uid("001", &uid); | |
58 | assert_se(r == -EINVAL); | |
59 | assert_se(uid == 1); | |
60 | ||
d5b29bb5 RC |
61 | r = parse_uid("100", &uid); |
62 | assert_se(r == 0); | |
63 | assert_se(uid == 100); | |
64 | ||
65 | r = parse_uid("65535", &uid); | |
66 | assert_se(r == -ENXIO); | |
156a5fd2 ZJS |
67 | assert_se(uid == 100); |
68 | ||
69 | r = parse_uid("0x1234", &uid); | |
70 | assert_se(r == -EINVAL); | |
71 | assert_se(uid == 100); | |
72 | ||
53c6db99 LP |
73 | r = parse_uid("0o1234", &uid); |
74 | assert_se(r == -EINVAL); | |
75 | assert_se(uid == 100); | |
76 | ||
77 | r = parse_uid("0b1234", &uid); | |
78 | assert_se(r == -EINVAL); | |
79 | assert_se(uid == 100); | |
80 | ||
f5979b63 LP |
81 | r = parse_uid("+1234", &uid); |
82 | assert_se(r == -EINVAL); | |
83 | assert_se(uid == 100); | |
84 | ||
85 | r = parse_uid("-1234", &uid); | |
86 | assert_se(r == -EINVAL); | |
87 | assert_se(uid == 100); | |
88 | ||
89 | r = parse_uid(" 1234", &uid); | |
90 | assert_se(r == -EINVAL); | |
91 | assert_se(uid == 100); | |
92 | ||
156a5fd2 | 93 | r = parse_uid("01234", &uid); |
f5979b63 LP |
94 | assert_se(r == -EINVAL); |
95 | assert_se(uid == 100); | |
96 | ||
53c6db99 LP |
97 | r = parse_uid("001234", &uid); |
98 | assert_se(r == -EINVAL); | |
99 | assert_se(uid == 100); | |
100 | ||
101 | r = parse_uid("0001234", &uid); | |
102 | assert_se(r == -EINVAL); | |
103 | assert_se(uid == 100); | |
104 | ||
f5979b63 LP |
105 | r = parse_uid("-0", &uid); |
106 | assert_se(r == -EINVAL); | |
107 | assert_se(uid == 100); | |
108 | ||
109 | r = parse_uid("+0", &uid); | |
110 | assert_se(r == -EINVAL); | |
111 | assert_se(uid == 100); | |
d5b29bb5 | 112 | |
53c6db99 LP |
113 | r = parse_uid("00", &uid); |
114 | assert_se(r == -EINVAL); | |
115 | assert_se(uid == 100); | |
116 | ||
117 | r = parse_uid("000", &uid); | |
118 | assert_se(r == -EINVAL); | |
119 | assert_se(uid == 100); | |
120 | ||
d5b29bb5 RC |
121 | r = parse_uid("asdsdas", &uid); |
122 | assert_se(r == -EINVAL); | |
f5979b63 | 123 | assert_se(uid == 100); |
d5b29bb5 RC |
124 | } |
125 | ||
126 | static void test_uid_ptr(void) { | |
52c6e6a8 | 127 | log_info("/* %s */", __func__); |
d5b29bb5 RC |
128 | |
129 | assert_se(UID_TO_PTR(0) != NULL); | |
130 | assert_se(UID_TO_PTR(1000) != NULL); | |
131 | ||
132 | assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0); | |
133 | assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000); | |
134 | } | |
135 | ||
7a8867ab | 136 | static void test_valid_user_group_name_relaxed(void) { |
1a29610f ZJS |
137 | log_info("/* %s */", __func__); |
138 | ||
7a8867ab LP |
139 | assert_se(!valid_user_group_name(NULL, VALID_USER_RELAX)); |
140 | assert_se(!valid_user_group_name("", VALID_USER_RELAX)); | |
141 | assert_se(!valid_user_group_name("1", VALID_USER_RELAX)); | |
142 | assert_se(!valid_user_group_name("65535", VALID_USER_RELAX)); | |
143 | assert_se(!valid_user_group_name("-1", VALID_USER_RELAX)); | |
144 | assert_se(!valid_user_group_name("foo\nbar", VALID_USER_RELAX)); | |
145 | assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_RELAX)); | |
146 | assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC)); | |
147 | assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_RELAX|VALID_USER_ALLOW_NUMERIC)); | |
148 | assert_se(!valid_user_group_name(".", VALID_USER_RELAX)); | |
149 | assert_se(!valid_user_group_name("..", VALID_USER_RELAX)); | |
150 | ||
151 | assert_se(valid_user_group_name("root", VALID_USER_RELAX)); | |
152 | assert_se(valid_user_group_name("lennart", VALID_USER_RELAX)); | |
153 | assert_se(valid_user_group_name("LENNART", VALID_USER_RELAX)); | |
154 | assert_se(valid_user_group_name("_kkk", VALID_USER_RELAX)); | |
155 | assert_se(valid_user_group_name("kkk-", VALID_USER_RELAX)); | |
156 | assert_se(valid_user_group_name("kk-k", VALID_USER_RELAX)); | |
157 | assert_se(valid_user_group_name("eff.eff", VALID_USER_RELAX)); | |
158 | assert_se(valid_user_group_name("eff.", VALID_USER_RELAX)); | |
159 | assert_se(valid_user_group_name("-kkk", VALID_USER_RELAX)); | |
160 | assert_se(valid_user_group_name("rööt", VALID_USER_RELAX)); | |
161 | assert_se(valid_user_group_name(".eff", VALID_USER_RELAX)); | |
162 | assert_se(valid_user_group_name(".1", VALID_USER_RELAX)); | |
163 | assert_se(valid_user_group_name(".65535", VALID_USER_RELAX)); | |
164 | assert_se(valid_user_group_name(".-1", VALID_USER_RELAX)); | |
165 | assert_se(valid_user_group_name(".-kkk", VALID_USER_RELAX)); | |
166 | assert_se(valid_user_group_name(".rööt", VALID_USER_RELAX)); | |
167 | assert_se(valid_user_group_name("...", VALID_USER_RELAX)); | |
168 | ||
169 | assert_se(valid_user_group_name("some5", VALID_USER_RELAX)); | |
170 | assert_se(valid_user_group_name("5some", VALID_USER_RELAX)); | |
171 | assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_RELAX)); | |
172 | ||
173 | assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_RELAX)); | |
174 | assert_se(valid_user_group_name("Dāvis", VALID_USER_RELAX)); | |
1a29610f ZJS |
175 | } |
176 | ||
e4631b48 | 177 | static void test_valid_user_group_name(void) { |
52c6e6a8 ZJS |
178 | log_info("/* %s */", __func__); |
179 | ||
7a8867ab LP |
180 | assert_se(!valid_user_group_name(NULL, 0)); |
181 | assert_se(!valid_user_group_name("", 0)); | |
182 | assert_se(!valid_user_group_name("1", 0)); | |
183 | assert_se(!valid_user_group_name("65535", 0)); | |
184 | assert_se(!valid_user_group_name("-1", 0)); | |
185 | assert_se(!valid_user_group_name("-kkk", 0)); | |
186 | assert_se(!valid_user_group_name("rööt", 0)); | |
187 | assert_se(!valid_user_group_name(".", 0)); | |
188 | assert_se(!valid_user_group_name(".eff", 0)); | |
189 | assert_se(!valid_user_group_name("foo\nbar", 0)); | |
190 | assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", 0)); | |
191 | assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC)); | |
192 | assert_se(!valid_user_group_name(".", 0)); | |
193 | assert_se(!valid_user_group_name("..", 0)); | |
194 | assert_se(!valid_user_group_name("...", 0)); | |
195 | assert_se(!valid_user_group_name(".1", 0)); | |
196 | assert_se(!valid_user_group_name(".65535", 0)); | |
197 | assert_se(!valid_user_group_name(".-1", 0)); | |
198 | assert_se(!valid_user_group_name(".-kkk", 0)); | |
199 | assert_se(!valid_user_group_name(".rööt", 0)); | |
200 | assert_se(!valid_user_group_name(".aaa:bbb", VALID_USER_ALLOW_NUMERIC)); | |
201 | ||
202 | assert_se(valid_user_group_name("root", 0)); | |
203 | assert_se(valid_user_group_name("lennart", 0)); | |
204 | assert_se(valid_user_group_name("LENNART", 0)); | |
205 | assert_se(valid_user_group_name("_kkk", 0)); | |
206 | assert_se(valid_user_group_name("kkk-", 0)); | |
207 | assert_se(valid_user_group_name("kk-k", 0)); | |
208 | assert_se(!valid_user_group_name("eff.eff", 0)); | |
209 | assert_se(!valid_user_group_name("eff.", 0)); | |
210 | ||
211 | assert_se(valid_user_group_name("some5", 0)); | |
212 | assert_se(!valid_user_group_name("5some", 0)); | |
213 | assert_se(valid_user_group_name("INNER5NUMBER", 0)); | |
214 | ||
215 | assert_se(!valid_user_group_name("piff.paff@ad.domain.example", 0)); | |
216 | assert_se(!valid_user_group_name("Dāvis", 0)); | |
e4631b48 LP |
217 | } |
218 | ||
7a8867ab | 219 | static void test_valid_user_group_name_or_numeric_relaxed(void) { |
1a29610f ZJS |
220 | log_info("/* %s */", __func__); |
221 | ||
7a8867ab LP |
222 | assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); |
223 | assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
224 | assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
225 | assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
226 | assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
227 | assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
228 | assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
229 | assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
230 | assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
231 | assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
232 | assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
233 | assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
234 | assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
235 | ||
236 | assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
237 | assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
238 | assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
239 | assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
240 | assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
241 | assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
242 | assert_se(valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
243 | assert_se(valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
244 | assert_se(valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
245 | assert_se(valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
246 | assert_se(valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
247 | assert_se(valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
248 | ||
249 | assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
250 | assert_se(valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
251 | assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
252 | ||
253 | assert_se(valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
254 | assert_se(valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC|VALID_USER_RELAX)); | |
1a29610f ZJS |
255 | } |
256 | ||
7a8867ab | 257 | static void test_valid_user_group_name_or_numeric(void) { |
52c6e6a8 ZJS |
258 | log_info("/* %s */", __func__); |
259 | ||
7a8867ab LP |
260 | assert_se(!valid_user_group_name(NULL, VALID_USER_ALLOW_NUMERIC)); |
261 | assert_se(!valid_user_group_name("", VALID_USER_ALLOW_NUMERIC)); | |
262 | assert_se(valid_user_group_name("0", VALID_USER_ALLOW_NUMERIC)); | |
263 | assert_se(valid_user_group_name("1", VALID_USER_ALLOW_NUMERIC)); | |
264 | assert_se(valid_user_group_name("65534", VALID_USER_ALLOW_NUMERIC)); | |
265 | assert_se(!valid_user_group_name("65535", VALID_USER_ALLOW_NUMERIC)); | |
266 | assert_se(valid_user_group_name("65536", VALID_USER_ALLOW_NUMERIC)); | |
267 | assert_se(!valid_user_group_name("-1", VALID_USER_ALLOW_NUMERIC)); | |
268 | assert_se(!valid_user_group_name("-kkk", VALID_USER_ALLOW_NUMERIC)); | |
269 | assert_se(!valid_user_group_name("rööt", VALID_USER_ALLOW_NUMERIC)); | |
270 | assert_se(!valid_user_group_name(".", VALID_USER_ALLOW_NUMERIC)); | |
271 | assert_se(!valid_user_group_name("..", VALID_USER_ALLOW_NUMERIC)); | |
272 | assert_se(!valid_user_group_name("...", VALID_USER_ALLOW_NUMERIC)); | |
273 | assert_se(!valid_user_group_name(".eff", VALID_USER_ALLOW_NUMERIC)); | |
274 | assert_se(!valid_user_group_name("eff.eff", VALID_USER_ALLOW_NUMERIC)); | |
275 | assert_se(!valid_user_group_name("eff.", VALID_USER_ALLOW_NUMERIC)); | |
276 | assert_se(!valid_user_group_name("foo\nbar", VALID_USER_ALLOW_NUMERIC)); | |
277 | assert_se(!valid_user_group_name("0123456789012345678901234567890123456789", VALID_USER_ALLOW_NUMERIC)); | |
278 | assert_se(!valid_user_group_name("aaa:bbb", VALID_USER_ALLOW_NUMERIC)); | |
279 | ||
280 | assert_se(valid_user_group_name("root", VALID_USER_ALLOW_NUMERIC)); | |
281 | assert_se(valid_user_group_name("lennart", VALID_USER_ALLOW_NUMERIC)); | |
282 | assert_se(valid_user_group_name("LENNART", VALID_USER_ALLOW_NUMERIC)); | |
283 | assert_se(valid_user_group_name("_kkk", VALID_USER_ALLOW_NUMERIC)); | |
284 | assert_se(valid_user_group_name("kkk-", VALID_USER_ALLOW_NUMERIC)); | |
285 | assert_se(valid_user_group_name("kk-k", VALID_USER_ALLOW_NUMERIC)); | |
286 | ||
287 | assert_se(valid_user_group_name("some5", VALID_USER_ALLOW_NUMERIC)); | |
288 | assert_se(!valid_user_group_name("5some", VALID_USER_ALLOW_NUMERIC)); | |
289 | assert_se(valid_user_group_name("INNER5NUMBER", VALID_USER_ALLOW_NUMERIC)); | |
290 | ||
291 | assert_se(!valid_user_group_name("piff.paff@ad.domain.example", VALID_USER_ALLOW_NUMERIC)); | |
292 | assert_se(!valid_user_group_name("Dāvis", VALID_USER_ALLOW_NUMERIC)); | |
e4631b48 LP |
293 | } |
294 | ||
295 | static void test_valid_gecos(void) { | |
52c6e6a8 | 296 | log_info("/* %s */", __func__); |
e4631b48 LP |
297 | |
298 | assert_se(!valid_gecos(NULL)); | |
299 | assert_se(valid_gecos("")); | |
300 | assert_se(valid_gecos("test")); | |
301 | assert_se(valid_gecos("Ümläüt")); | |
302 | assert_se(!valid_gecos("In\nvalid")); | |
303 | assert_se(!valid_gecos("In:valid")); | |
304 | } | |
305 | ||
306 | static void test_valid_home(void) { | |
52c6e6a8 | 307 | log_info("/* %s */", __func__); |
e4631b48 LP |
308 | |
309 | assert_se(!valid_home(NULL)); | |
310 | assert_se(!valid_home("")); | |
311 | assert_se(!valid_home(".")); | |
312 | assert_se(!valid_home("/home/..")); | |
313 | assert_se(!valid_home("/home/../")); | |
314 | assert_se(!valid_home("/home\n/foo")); | |
315 | assert_se(!valid_home("./piep")); | |
316 | assert_se(!valid_home("piep")); | |
317 | assert_se(!valid_home("/home/user:lennart")); | |
318 | ||
319 | assert_se(valid_home("/")); | |
320 | assert_se(valid_home("/home")); | |
321 | assert_se(valid_home("/home/foo")); | |
322 | } | |
323 | ||
7e61fd02 | 324 | 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) { |
7559b2da ZJS |
325 | const char *rhome = NULL; |
326 | const char *rshell = NULL; | |
327 | uid_t ruid = UID_INVALID; | |
328 | gid_t rgid = GID_INVALID; | |
329 | int r; | |
7e61fd02 | 330 | |
52c6e6a8 ZJS |
331 | log_info("/* %s(\"%s\", \"%s\", "UID_FMT", "GID_FMT", \"%s\", \"%s\") */", |
332 | __func__, id, name, uid, gid, home, shell); | |
333 | ||
fafff8f1 | 334 | r = get_user_creds(&id, &ruid, &rgid, &rhome, &rshell, 0); |
7559b2da ZJS |
335 | log_info_errno(r, "got \"%s\", "UID_FMT", "GID_FMT", \"%s\", \"%s\": %m", |
336 | id, ruid, rgid, strnull(rhome), strnull(rshell)); | |
337 | if (!synthesize_nobody() && streq(name, NOBODY_USER_NAME)) { | |
338 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
339 | return; | |
340 | } | |
341 | assert_se(r == 0); | |
7e61fd02 LP |
342 | assert_se(streq_ptr(id, name)); |
343 | assert_se(ruid == uid); | |
344 | assert_se(rgid == gid); | |
345 | assert_se(path_equal(rhome, home)); | |
346 | assert_se(path_equal(rshell, shell)); | |
347 | } | |
348 | ||
349 | static void test_get_group_creds_one(const char *id, const char *name, gid_t gid) { | |
7559b2da ZJS |
350 | gid_t rgid = GID_INVALID; |
351 | int r; | |
7e61fd02 | 352 | |
52c6e6a8 ZJS |
353 | log_info("/* %s(\"%s\", \"%s\", "GID_FMT") */", __func__, id, name, gid); |
354 | ||
fafff8f1 | 355 | r = get_group_creds(&id, &rgid, 0); |
7559b2da ZJS |
356 | log_info_errno(r, "got \"%s\", "GID_FMT": %m", id, rgid); |
357 | if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) { | |
358 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
359 | return; | |
360 | } | |
361 | assert_se(r == 0); | |
7e61fd02 LP |
362 | assert_se(streq_ptr(id, name)); |
363 | assert_se(rgid == gid); | |
364 | } | |
365 | ||
521ff2fc ZJS |
366 | static void test_make_salt(void) { |
367 | log_info("/* %s */", __func__); | |
368 | ||
369 | _cleanup_free_ char *s, *t; | |
370 | ||
371 | assert_se(make_salt(&s) == 0); | |
372 | log_info("got %s", s); | |
373 | ||
374 | assert_se(make_salt(&t) == 0); | |
375 | log_info("got %s", t); | |
376 | ||
377 | assert(!streq(s, t)); | |
378 | } | |
379 | ||
eb2cfa81 | 380 | static void test_in_gid(void) { |
eb2cfa81 | 381 | assert(in_gid(getgid()) >= 0); |
c6cecb74 DG |
382 | assert(in_gid(getegid()) >= 0); assert(in_gid(TTY_GID) == 0); /* The TTY gid is for owning ttys, it would be really really weird if we were in it. */ |
383 | } | |
384 | ||
385 | static void test_gid_lists_ops(void) { | |
386 | static const gid_t l1[] = { 5, 10, 15, 20, 25}; | |
387 | static const gid_t l2[] = { 1, 2, 3, 15, 20, 25}; | |
388 | static const gid_t l3[] = { 5, 10, 15, 20, 25, 26, 27}; | |
389 | static const gid_t l4[] = { 25, 26, 20, 15, 5, 27, 10}; | |
390 | ||
391 | static const gid_t result1[] = {1, 2, 3, 5, 10, 15, 20, 25, 26, 27}; | |
392 | static const gid_t result2[] = {5, 10, 15, 20, 25, 26, 27}; | |
393 | ||
394 | _cleanup_free_ gid_t *gids = NULL; | |
395 | _cleanup_free_ gid_t *res1 = NULL; | |
396 | _cleanup_free_ gid_t *res2 = NULL; | |
397 | _cleanup_free_ gid_t *res3 = NULL; | |
398 | _cleanup_free_ gid_t *res4 = NULL; | |
399 | int nresult; | |
400 | ||
401 | nresult = merge_gid_lists(l2, ELEMENTSOF(l2), l3, ELEMENTSOF(l3), &res1); | |
020313b2 | 402 | assert_se(nresult >= 0); |
c6cecb74 DG |
403 | assert_se(memcmp_nn(res1, nresult, result1, ELEMENTSOF(result1)) == 0); |
404 | ||
405 | nresult = merge_gid_lists(NULL, 0, l2, ELEMENTSOF(l2), &res2); | |
020313b2 | 406 | assert_se(nresult >= 0); |
c6cecb74 DG |
407 | assert_se(memcmp_nn(res2, nresult, l2, ELEMENTSOF(l2)) == 0); |
408 | ||
409 | nresult = merge_gid_lists(l1, ELEMENTSOF(l1), l1, ELEMENTSOF(l1), &res3); | |
020313b2 | 410 | assert_se(nresult >= 0); |
c6cecb74 DG |
411 | assert_se(memcmp_nn(l1, ELEMENTSOF(l1), res3, nresult) == 0); |
412 | ||
413 | nresult = merge_gid_lists(l1, ELEMENTSOF(l1), l4, ELEMENTSOF(l4), &res4); | |
020313b2 | 414 | assert_se(nresult >= 0); |
c6cecb74 | 415 | assert_se(memcmp_nn(result2, ELEMENTSOF(result2), res4, nresult) == 0); |
eb2cfa81 | 416 | |
c6cecb74 DG |
417 | nresult = getgroups_alloc(&gids); |
418 | assert_se(nresult >= 0 || nresult == -EINVAL || nresult == -ENOMEM); | |
419 | assert_se(gids); | |
eb2cfa81 LP |
420 | } |
421 | ||
42e57a4e LP |
422 | static void test_parse_uid_range(void) { |
423 | uid_t a = 4711, b = 4711; | |
424 | ||
425 | log_info("/* %s */", __func__); | |
426 | ||
427 | assert_se(parse_uid_range("", &a, &b) == -EINVAL && a == 4711 && b == 4711); | |
428 | assert_se(parse_uid_range(" ", &a, &b) == -EINVAL && a == 4711 && b == 4711); | |
429 | assert_se(parse_uid_range("x", &a, &b) == -EINVAL && a == 4711 && b == 4711); | |
430 | ||
431 | assert_se(parse_uid_range("0", &a, &b) >= 0 && a == 0 && b == 0); | |
432 | assert_se(parse_uid_range("1", &a, &b) >= 0 && a == 1 && b == 1); | |
433 | assert_se(parse_uid_range("2-2", &a, &b) >= 0 && a == 2 && b == 2); | |
434 | assert_se(parse_uid_range("3-3", &a, &b) >= 0 && a == 3 && b == 3); | |
435 | assert_se(parse_uid_range("4-5", &a, &b) >= 0 && a == 4 && b == 5); | |
436 | ||
437 | assert_se(parse_uid_range("7-6", &a, &b) == -EINVAL && a == 4 && b == 5); | |
438 | assert_se(parse_uid_range("-1", &a, &b) == -EINVAL && a == 4 && b == 5); | |
439 | assert_se(parse_uid_range("01", &a, &b) == -EINVAL && a == 4 && b == 5); | |
440 | assert_se(parse_uid_range("001", &a, &b) == -EINVAL && a == 4 && b == 5); | |
441 | assert_se(parse_uid_range("+1", &a, &b) == -EINVAL && a == 4 && b == 5); | |
442 | assert_se(parse_uid_range("1--1", &a, &b) == -EINVAL && a == 4 && b == 5); | |
443 | assert_se(parse_uid_range(" 1", &a, &b) == -EINVAL && a == 4 && b == 5); | |
444 | assert_se(parse_uid_range(" 1-2", &a, &b) == -EINVAL && a == 4 && b == 5); | |
445 | assert_se(parse_uid_range("1 -2", &a, &b) == -EINVAL && a == 4 && b == 5); | |
446 | assert_se(parse_uid_range("1- 2", &a, &b) == -EINVAL && a == 4 && b == 5); | |
447 | assert_se(parse_uid_range("1-2 ", &a, &b) == -EINVAL && a == 4 && b == 5); | |
448 | assert_se(parse_uid_range("01-2", &a, &b) == -EINVAL && a == 4 && b == 5); | |
449 | assert_se(parse_uid_range("1-02", &a, &b) == -EINVAL && a == 4 && b == 5); | |
450 | assert_se(parse_uid_range("001-2", &a, &b) == -EINVAL && a == 4 && b == 5); | |
451 | assert_se(parse_uid_range("1-002", &a, &b) == -EINVAL && a == 4 && b == 5); | |
452 | assert_se(parse_uid_range(" 01", &a, &b) == -EINVAL && a == 4 && b == 5); | |
453 | } | |
454 | ||
b10fd796 LP |
455 | static void test_mangle_gecos_one(const char *input, const char *expected) { |
456 | _cleanup_free_ char *p = NULL; | |
457 | ||
458 | assert_se(p = mangle_gecos(input)); | |
459 | assert_se(streq(p, expected)); | |
460 | assert_se(valid_gecos(p)); | |
461 | } | |
462 | ||
463 | static void test_mangle_gecos(void) { | |
464 | test_mangle_gecos_one("", ""); | |
465 | test_mangle_gecos_one("root", "root"); | |
466 | test_mangle_gecos_one("wuff\nwuff", "wuff wuff"); | |
467 | test_mangle_gecos_one("wuff:wuff", "wuff wuff"); | |
468 | test_mangle_gecos_one("wuff\r\n:wuff", "wuff wuff"); | |
469 | test_mangle_gecos_one("\n--wüff-wäff-wöff::", " --wüff-wäff-wöff "); | |
470 | test_mangle_gecos_one("\xc3\x28", " ("); | |
471 | test_mangle_gecos_one("\xe2\x28\xa1", " ( "); | |
472 | } | |
473 | ||
f2a3de01 | 474 | int main(int argc, char *argv[]) { |
d0260817 | 475 | test_uid_to_name_one(0, "root"); |
7e61fd02 | 476 | test_uid_to_name_one(UID_NOBODY, NOBODY_USER_NAME); |
d0260817 LP |
477 | test_uid_to_name_one(0xFFFF, "65535"); |
478 | test_uid_to_name_one(0xFFFFFFFF, "4294967295"); | |
479 | ||
480 | test_gid_to_name_one(0, "root"); | |
7e61fd02 | 481 | test_gid_to_name_one(GID_NOBODY, NOBODY_GROUP_NAME); |
d0260817 LP |
482 | test_gid_to_name_one(TTY_GID, "tty"); |
483 | test_gid_to_name_one(0xFFFF, "65535"); | |
484 | test_gid_to_name_one(0xFFFFFFFF, "4294967295"); | |
485 | ||
7e61fd02 LP |
486 | test_get_user_creds_one("root", "root", 0, 0, "/root", "/bin/sh"); |
487 | test_get_user_creds_one("0", "root", 0, 0, "/root", "/bin/sh"); | |
6db90462 MB |
488 | test_get_user_creds_one(NOBODY_USER_NAME, NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", NOLOGIN); |
489 | test_get_user_creds_one("65534", NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", NOLOGIN); | |
7e61fd02 LP |
490 | |
491 | test_get_group_creds_one("root", "root", 0); | |
492 | test_get_group_creds_one("0", "root", 0); | |
493 | test_get_group_creds_one(NOBODY_GROUP_NAME, NOBODY_GROUP_NAME, GID_NOBODY); | |
494 | test_get_group_creds_one("65534", NOBODY_GROUP_NAME, GID_NOBODY); | |
495 | ||
d5b29bb5 RC |
496 | test_parse_uid(); |
497 | test_uid_ptr(); | |
498 | ||
7a8867ab | 499 | test_valid_user_group_name_relaxed(); |
e4631b48 | 500 | test_valid_user_group_name(); |
7a8867ab LP |
501 | test_valid_user_group_name_or_numeric_relaxed(); |
502 | test_valid_user_group_name_or_numeric(); | |
e4631b48 | 503 | test_valid_gecos(); |
b10fd796 | 504 | test_mangle_gecos(); |
e4631b48 LP |
505 | test_valid_home(); |
506 | ||
521ff2fc ZJS |
507 | test_make_salt(); |
508 | ||
eb2cfa81 | 509 | test_in_gid(); |
c6cecb74 | 510 | test_gid_lists_ops(); |
eb2cfa81 | 511 | |
42e57a4e LP |
512 | test_parse_uid_range(); |
513 | ||
d0260817 LP |
514 | return 0; |
515 | } |