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