]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-user-util.c
Merge pull request #8417 from brauner/2018-03-09/add_bind_mount_fallback_to_private_d...
[thirdparty/systemd.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 static void test_get_group_creds_one(const char *id, const char *name, gid_t gid) {
183 gid_t rgid = GID_INVALID;
184 int r;
185
186 log_info("/* %s(\"%s\", \"%s\", "GID_FMT") */", __func__, id, name, gid);
187
188 r = get_group_creds(&id, &rgid);
189 log_info_errno(r, "got \"%s\", "GID_FMT": %m", id, rgid);
190 if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) {
191 log_info("(skipping detailed tests because nobody is not synthesized)");
192 return;
193 }
194 assert_se(r == 0);
195 assert_se(streq_ptr(id, name));
196 assert_se(rgid == gid);
197 }
198
199 int main(int argc, char*argv[]) {
200 test_uid_to_name_one(0, "root");
201 test_uid_to_name_one(UID_NOBODY, NOBODY_USER_NAME);
202 test_uid_to_name_one(0xFFFF, "65535");
203 test_uid_to_name_one(0xFFFFFFFF, "4294967295");
204
205 test_gid_to_name_one(0, "root");
206 test_gid_to_name_one(GID_NOBODY, NOBODY_GROUP_NAME);
207 test_gid_to_name_one(TTY_GID, "tty");
208 test_gid_to_name_one(0xFFFF, "65535");
209 test_gid_to_name_one(0xFFFFFFFF, "4294967295");
210
211 test_get_user_creds_one("root", "root", 0, 0, "/root", "/bin/sh");
212 test_get_user_creds_one("0", "root", 0, 0, "/root", "/bin/sh");
213 test_get_user_creds_one(NOBODY_USER_NAME, NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
214 test_get_user_creds_one("65534", NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
215
216 test_get_group_creds_one("root", "root", 0);
217 test_get_group_creds_one("0", "root", 0);
218 test_get_group_creds_one(NOBODY_GROUP_NAME, NOBODY_GROUP_NAME, GID_NOBODY);
219 test_get_group_creds_one("65534", NOBODY_GROUP_NAME, GID_NOBODY);
220
221 test_parse_uid();
222 test_uid_ptr();
223
224 test_valid_user_group_name();
225 test_valid_user_group_name_or_id();
226 test_valid_gecos();
227 test_valid_home();
228
229 return 0;
230 }