]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-user-util.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2015 Lennart Poettering
6 #include "alloc-util.h"
9 #include "string-util.h"
10 #include "user-util.h"
12 #include "path-util.h"
14 static void test_uid_to_name_one(uid_t uid
, const char *name
) {
15 _cleanup_free_
char *t
= NULL
;
17 log_info("/* %s("UID_FMT
", \"%s\") */", __func__
, uid
, name
);
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)");
24 assert_se(streq_ptr(t
, name
));
27 static void test_gid_to_name_one(gid_t gid
, const char *name
) {
28 _cleanup_free_
char *t
= NULL
;
30 log_info("/* %s("GID_FMT
", \"%s\") */", __func__
, gid
, name
);
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)");
37 assert_se(streq_ptr(t
, name
));
40 static void test_parse_uid(void) {
44 log_info("/* %s */", __func__
);
46 r
= parse_uid("100", &uid
);
48 assert_se(uid
== 100);
50 r
= parse_uid("65535", &uid
);
51 assert_se(r
== -ENXIO
);
53 r
= parse_uid("asdsdas", &uid
);
54 assert_se(r
== -EINVAL
);
57 static void test_uid_ptr(void) {
58 log_info("/* %s */", __func__
);
60 assert_se(UID_TO_PTR(0) != NULL
);
61 assert_se(UID_TO_PTR(1000) != NULL
);
63 assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
64 assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
67 static void test_valid_user_group_name(void) {
68 log_info("/* %s */", __func__
);
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"));
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"));
90 assert_se(valid_user_group_name("some5"));
91 assert_se(!valid_user_group_name("5some"));
92 assert_se(valid_user_group_name("INNER5NUMBER"));
95 static void test_valid_user_group_name_or_id(void) {
96 log_info("/* %s */", __func__
);
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"));
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"));
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"));
126 static void test_valid_gecos(void) {
127 log_info("/* %s */", __func__
);
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"));
137 static void test_valid_home(void) {
138 log_info("/* %s */", __func__
);
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"));
150 assert_se(valid_home("/"));
151 assert_se(valid_home("/home"));
152 assert_se(valid_home("/home/foo"));
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
;
162 log_info("/* %s(\"%s\", \"%s\", "UID_FMT
", "GID_FMT
", \"%s\", \"%s\") */",
163 __func__
, id
, name
, uid
, gid
, home
, shell
);
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)");
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
));
180 static void test_get_group_creds_one(const char *id
, const char *name
, gid_t gid
) {
181 gid_t rgid
= GID_INVALID
;
184 log_info("/* %s(\"%s\", \"%s\", "GID_FMT
") */", __func__
, id
, name
, gid
);
186 r
= get_group_creds(&id
, &rgid
);
187 log_info_errno(r
, "got \"%s\", "GID_FMT
": %m", id
, rgid
);
188 if (!synthesize_nobody() && streq(name
, NOBODY_GROUP_NAME
)) {
189 log_info("(skipping detailed tests because nobody is not synthesized)");
193 assert_se(streq_ptr(id
, name
));
194 assert_se(rgid
== gid
);
197 int main(int argc
, char*argv
[]) {
198 test_uid_to_name_one(0, "root");
199 test_uid_to_name_one(UID_NOBODY
, NOBODY_USER_NAME
);
200 test_uid_to_name_one(0xFFFF, "65535");
201 test_uid_to_name_one(0xFFFFFFFF, "4294967295");
203 test_gid_to_name_one(0, "root");
204 test_gid_to_name_one(GID_NOBODY
, NOBODY_GROUP_NAME
);
205 test_gid_to_name_one(TTY_GID
, "tty");
206 test_gid_to_name_one(0xFFFF, "65535");
207 test_gid_to_name_one(0xFFFFFFFF, "4294967295");
209 test_get_user_creds_one("root", "root", 0, 0, "/root", "/bin/sh");
210 test_get_user_creds_one("0", "root", 0, 0, "/root", "/bin/sh");
211 test_get_user_creds_one(NOBODY_USER_NAME
, NOBODY_USER_NAME
, UID_NOBODY
, GID_NOBODY
, "/", "/sbin/nologin");
212 test_get_user_creds_one("65534", NOBODY_USER_NAME
, UID_NOBODY
, GID_NOBODY
, "/", "/sbin/nologin");
214 test_get_group_creds_one("root", "root", 0);
215 test_get_group_creds_one("0", "root", 0);
216 test_get_group_creds_one(NOBODY_GROUP_NAME
, NOBODY_GROUP_NAME
, GID_NOBODY
);
217 test_get_group_creds_one("65534", NOBODY_GROUP_NAME
, GID_NOBODY
);
222 test_valid_user_group_name();
223 test_valid_user_group_name_or_id();