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