chiark / gitweb /
900e4d2b067e3d4bde308c4639d4603dc2afbe62
[elogind.git] / src / bus-proxyd / test-bus-policy.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2014 Daniel Mack
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <sys/socket.h>
23 #include <sys/un.h>
24 #include <sys/types.h>
25 #include <fcntl.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <errno.h>
29 #include <sys/poll.h>
30 #include <stddef.h>
31 #include <getopt.h>
32
33 #include "log.h"
34 #include "util.h"
35 #include "sd-bus.h"
36 #include "bus-internal.h"
37 #include "bus-message.h"
38 #include "bus-util.h"
39 #include "bus-internal.h"
40 #include "build.h"
41 #include "strv.h"
42 #include "def.h"
43 #include "capability.h"
44
45 #include <bus-proxyd/bus-policy.h>
46
47 static int test_policy_load(Policy *p, const char *name)
48 {
49         char *path;
50         int r = 0;
51
52         path = strjoin(TEST_DIR, "/bus-policy/", name, NULL);
53
54         if (access(path, R_OK) == 0)
55                 policy_load(p, STRV_MAKE(path));
56         else
57                 r = -ENOENT;
58
59         free(path);
60
61         return r;
62 }
63
64 int main(int argc, char *argv[]) {
65
66         Policy p = {};
67         struct ucred ucred = {};
68         char **names_strv;
69         Hashmap *names_hash;
70
71         /* Ownership tests */
72         assert_se(test_policy_load(&p, "ownerships.conf") == 0);
73
74         ucred.uid = 0;
75         assert_se(policy_check_own(&p, &ucred, "org.test.test1") == true);
76         ucred.uid = 1;
77         assert_se(policy_check_own(&p, &ucred, "org.test.test1") == true);
78
79         ucred.uid = 0;
80         assert_se(policy_check_own(&p, &ucred, "org.test.test2") == true);
81         ucred.uid = 1;
82         assert_se(policy_check_own(&p, &ucred, "org.test.test2") == false);
83
84         ucred.uid = 0;
85         assert_se(policy_check_own(&p, &ucred, "org.test.test3") == false);
86         ucred.uid = 1;
87         assert_se(policy_check_own(&p, &ucred, "org.test.test3") == false);
88
89         ucred.uid = 0;
90         assert_se(policy_check_own(&p, &ucred, "org.test.test4") == false);
91         ucred.uid = 1;
92         assert_se(policy_check_own(&p, &ucred, "org.test.test4") == true);
93
94         policy_free(&p);
95
96         /* Signaltest */
97         assert_se(test_policy_load(&p, "signals.conf") == 0);
98         names_strv = STRV_MAKE("bli.bla.blubb");
99
100         ucred.uid = 0;
101         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_SIGNAL, NULL, "/an/object/path", NULL) == true);
102
103         ucred.uid = 1;
104         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_SIGNAL, NULL, "/an/object/path", NULL) == false);
105
106         policy_free(&p);
107
108         /* Method calls */
109         assert_se(test_policy_load(&p, "methods.conf") == 0);
110         names_strv = STRV_MAKE("org.test.test1");
111         policy_dump(&p);
112
113         ucred.uid = 0;
114
115         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_METHOD_CALL, "/an/object/path", "bli.bla.blubb", "Member") == false);
116         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_METHOD_CALL, "/an/object/path", "bli.bla.blubb", "Member") == false);
117         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_METHOD_CALL, "/an/object/path", "org.test.int1", "Member") == true);
118         assert_se(policy_check_send(&p, &ucred, names_strv, SD_BUS_MESSAGE_METHOD_CALL, "/an/object/path", "org.test.int2", "Member") == true);
119
120         names_hash = hashmap_new(&string_hash_ops);
121         assert(names_hash != NULL);
122         assert_se(hashmap_put(names_hash, "org.test.test3", NULL) >= 0);
123         assert_se(policy_check_recv(&p, &ucred, names_hash, SD_BUS_MESSAGE_METHOD_CALL, "/an/object/path", "org.test.int3", "Member111") == true);
124
125         policy_free(&p);
126
127         /* User and groups */
128         assert_se(test_policy_load(&p, "hello.conf") == 0);
129         policy_dump(&p);
130
131         ucred.uid = 0;
132         assert_se(policy_check_hello(&p, &ucred) == true);
133
134         ucred.uid = 1;
135         assert_se(policy_check_hello(&p, &ucred) == false);
136
137         ucred.uid = 0;
138         ucred.gid = 1;
139         assert_se(policy_check_hello(&p, &ucred) == false);
140
141         policy_free(&p);
142
143         return EXIT_SUCCESS;
144 }