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