chiark / gitweb /
tree-wide: remove Lennart's copyright lines
[elogind.git] / src / test / test-user-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include "alloc-util.h"
4 //#include "log.h"
5 #include "macro.h"
6 #include "string-util.h"
7 #include "user-util.h"
8 #include "util.h"
9 #include "path-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);
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 #if 0 /// UNNEEDED by elogind
178 static void test_get_group_creds_one(const char *id, const char *name, gid_t gid) {
179         gid_t rgid = GID_INVALID;
180         int r;
181
182         log_info("/* %s(\"%s\", \"%s\", "GID_FMT") */", __func__, id, name, gid);
183
184         r = get_group_creds(&id, &rgid);
185         log_info_errno(r, "got \"%s\", "GID_FMT": %m", id, rgid);
186         if (!synthesize_nobody() && streq(name, NOBODY_GROUP_NAME)) {
187                 log_info("(skipping detailed tests because nobody is not synthesized)");
188                 return;
189         }
190         assert_se(r == 0);
191         assert_se(streq_ptr(id, name));
192         assert_se(rgid == gid);
193 }
194 #endif // 0
195
196 int main(int argc, char*argv[]) {
197         test_uid_to_name_one(0, "root");
198         test_uid_to_name_one(UID_NOBODY, NOBODY_USER_NAME);
199         test_uid_to_name_one(0xFFFF, "65535");
200         test_uid_to_name_one(0xFFFFFFFF, "4294967295");
201
202         test_gid_to_name_one(0, "root");
203 #if 0 /// UNNEEDED by elogind
204         test_gid_to_name_one(GID_NOBODY, NOBODY_GROUP_NAME);
205         test_gid_to_name_one(TTY_GID, "tty");
206 #endif // 0
207         test_gid_to_name_one(0xFFFF, "65535");
208         test_gid_to_name_one(0xFFFFFFFF, "4294967295");
209
210         test_get_user_creds_one("root", "root", 0, 0, "/root", "/bin/sh");
211         test_get_user_creds_one("0", "root", 0, 0, "/root", "/bin/sh");
212         test_get_user_creds_one(NOBODY_USER_NAME, NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
213         test_get_user_creds_one("65534", NOBODY_USER_NAME, UID_NOBODY, GID_NOBODY, "/", "/sbin/nologin");
214
215 #if 0 /// UNNEEDED by elogind
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 #endif // 0
221
222         test_parse_uid();
223         test_uid_ptr();
224
225         test_valid_user_group_name();
226         test_valid_user_group_name_or_id();
227         test_valid_gecos();
228         test_valid_home();
229
230         return 0;
231 }