summaryrefslogtreecommitdiffstats
path: root/src/test/test-user-record.c
blob: c9182e382bda184f48fcf372d47bf212f1e938d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* SPDX-License-Identifier: LGPL-2.1-or-later */

#include <unistd.h>
#include <sys/types.h>

#include "fd-util.h"
#include "fileio.h"
#include "format-util.h"
#include "fs-util.h"
#include "tmpfile-util.h"
#include "tests.h"
#include "user-record.h"

static void test_read_login_defs(const char *path) {
        log_info("/* %s(\"%s\") */", __func__, path ?: "<custom>");

        _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-user-record.XXXXXX";
        _cleanup_fclose_ FILE *f = NULL;
        if (!path) {
                assert_se(fmkostemp_safe(name, "r+", &f) == 0);
                fprintf(f,
                        "SYS_UID_MIN "UID_FMT"\n"
                        "SYS_UID_MAX "UID_FMT"\n"
                        "SYS_GID_MIN "GID_FMT"\n"
                        "SYS_GID_MAX "GID_FMT"\n",
                        SYSTEM_ALLOC_UID_MIN + 5,
                        SYSTEM_UID_MAX + 5,
                        SYSTEM_ALLOC_GID_MIN + 5,
                        SYSTEM_GID_MAX + 5);
                assert_se(fflush_and_check(f) >= 0);
        }

        UGIDAllocationRange defs;
        assert_se(read_login_defs(&defs, path ?: name, NULL) >= 0);

        log_info("system_alloc_uid_min="UID_FMT, defs.system_alloc_uid_min);
        log_info("system_uid_max="UID_FMT, defs.system_uid_max);
        log_info("system_alloc_gid_min="GID_FMT, defs.system_alloc_gid_min);
        log_info("system_gid_max="GID_FMT, defs.system_gid_max);

        if (!path) {
                uid_t offset = ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES ? 5 : 0;
                assert_se(defs.system_alloc_uid_min == SYSTEM_ALLOC_UID_MIN + offset);
                assert_se(defs.system_uid_max == SYSTEM_UID_MAX + offset);
                assert_se(defs.system_alloc_gid_min == SYSTEM_ALLOC_GID_MIN + offset);
                assert_se(defs.system_gid_max == SYSTEM_GID_MAX + offset);
        } else if (streq(path, "/dev/null")) {
                assert_se(defs.system_alloc_uid_min == SYSTEM_ALLOC_UID_MIN);
                assert_se(defs.system_uid_max == SYSTEM_UID_MAX);
                assert_se(defs.system_alloc_gid_min == SYSTEM_ALLOC_GID_MIN);
                assert_se(defs.system_gid_max == SYSTEM_GID_MAX);
        }
}

static void test_acquire_ugid_allocation_range(void) {
        log_info("/* %s */", __func__);

        const UGIDAllocationRange *defs;
        assert_se(defs = acquire_ugid_allocation_range());

        log_info("system_alloc_uid_min="UID_FMT, defs->system_alloc_uid_min);
        log_info("system_uid_max="UID_FMT, defs->system_uid_max);
        log_info("system_alloc_gid_min="GID_FMT, defs->system_alloc_gid_min);
        log_info("system_gid_max="GID_FMT, defs->system_gid_max);
}

static void test_uid_is_system(void) {
        log_info("/* %s */", __func__);

        uid_t uid = 0;
        log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid)));

        uid = 999;
        log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid)));

        uid = getuid();
        log_info("uid_is_system("UID_FMT") = %s", uid, yes_no(uid_is_system(uid)));
}

static void test_gid_is_system(void) {
        log_info("/* %s */", __func__);

        gid_t gid = 0;
        log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid)));

        gid = 999;
        log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid)));

        gid = getgid();
        log_info("gid_is_system("GID_FMT") = %s", gid, yes_no(gid_is_system(gid)));
}

int main(int argc, char *argv[]) {
        test_setup_logging(LOG_DEBUG);

        test_read_login_defs("/dev/null");
        test_read_login_defs("/etc/login.defs");
        test_read_login_defs(NULL);
        test_acquire_ugid_allocation_range();
        test_uid_is_system();
        test_gid_is_system();

        return 0;
}