]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
d0260817 | 2 | |
b5efdb8a | 3 | #include "alloc-util.h" |
ca78ad1d | 4 | #include "format-util.h" |
52c6e6a8 | 5 | #include "log.h" |
d0260817 | 6 | #include "macro.h" |
ca78ad1d | 7 | #include "path-util.h" |
d0260817 LP |
8 | #include "string-util.h" |
9 | #include "user-util.h" | |
d0260817 LP |
10 | |
11 | static void test_uid_to_name_one(uid_t uid, const char *name) { | |
12 | _cleanup_free_ char *t = NULL; | |
13 | ||
52c6e6a8 ZJS |
14 | log_info("/* %s("UID_FMT", \"%s\") */", __func__, uid, name); |
15 | ||
d0260817 | 16 | assert_se(t = uid_to_name(uid)); |
7559b2da ZJS |
17 | if (!synthesize_nobody() && streq(name, NOBODY_USER_NAME)) { |
18 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
19 | return; | |
20 | } | |
d0260817 LP |
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 | ||
52c6e6a8 ZJS |
27 | log_info("/* %s("GID_FMT", \"%s\") */", __func__, gid, name); |
28 | ||
d0260817 | 29 | assert_se(t = gid_to_name(gid)); |
7559b2da ZJS |
30 | if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) { |
31 | log_info("(skipping detailed tests because nobody is not synthesized)"); | |
32 | return; | |
33 | } | |
d0260817 LP |
34 | assert_se(streq_ptr(t, name)); |
35 | } | |
36 | ||
d5b29bb5 RC |
37 | static void test_parse_uid(void) { |
38 | int r; | |
39 | uid_t uid; | |
40 | ||
52c6e6a8 ZJS |
41 | log_info("/* %s */", __func__); |
42 | ||
d5b29bb5 RC |
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) { | |
52c6e6a8 | 55 | log_info("/* %s */", __func__); |
d5b29bb5 RC |
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 | ||
e4631b48 | 64 | static void test_valid_user_group_name(void) { |
52c6e6a8 ZJS |
65 | log_info("/* %s */", __func__); |
66 | ||
e4631b48 LP |
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) { | |
52c6e6a8 ZJS |
93 | log_info("/* %s */", __func__); |
94 | ||
e4631b48 LP |
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) { | |
52c6e6a8 | 124 | log_info("/* %s */", __func__); |
e4631b48 LP |
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) { | |
52c6e6a8 | 135 | log_info("/* %s */", __func__); |
e4631b48 LP |
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 | ||
7e61fd02 | 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) { |
7559b2da ZJS |
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; | |
7e61fd02 | 158 | |
52c6e6a8 ZJS |
159 | log_info("/* %s(\"%s\", \"%s\", "UID_FMT", "GID_FMT", \"%s\", \"%s\") */", |
160 | __func__, id, name, uid, gid, home, shell); | |
161 | ||
fafff8f1 | 162 | r = get_user_creds(&id, &ruid, &rgid, &rhome, &rshell, 0); |
7559b2da ZJS |
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); | |
7e61fd02 LP |
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) { | |
7559b2da ZJS |
178 | gid_t rgid = GID_INVALID; |
179 | int r; | |
7e61fd02 | 180 | |
52c6e6a8 ZJS |
181 | log_info("/* %s(\"%s\", \"%s\", "GID_FMT") */", __func__, id, name, gid); |
182 | ||
fafff8f1 | 183 | r = get_group_creds(&id, &rgid, 0); |
7559b2da ZJS |
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); | |
7e61fd02 LP |
190 | assert_se(streq_ptr(id, name)); |
191 | assert_se(rgid == gid); | |
192 | } | |
193 | ||
521ff2fc ZJS |
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 | ||
f2a3de01 | 208 | int main(int argc, char *argv[]) { |
d0260817 | 209 | test_uid_to_name_one(0, "root"); |
7e61fd02 | 210 | test_uid_to_name_one(UID_NOBODY, NOBODY_USER_NAME); |
d0260817 LP |
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"); | |
7e61fd02 | 215 | test_gid_to_name_one(GID_NOBODY, NOBODY_GROUP_NAME); |
d0260817 LP |
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 | ||
7e61fd02 LP |
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, "/", "/sbin/nologin"); | |
223 | test_get_user_creds_one("65534", NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/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 | ||
d5b29bb5 RC |
230 | test_parse_uid(); |
231 | test_uid_ptr(); | |
232 | ||
e4631b48 LP |
233 | test_valid_user_group_name(); |
234 | test_valid_user_group_name_or_id(); | |
235 | test_valid_gecos(); | |
236 | test_valid_home(); | |
237 | ||
521ff2fc ZJS |
238 | test_make_salt(); |
239 | ||
d0260817 LP |
240 | return 0; |
241 | } |