chiark / gitweb /
mount: check options as well as fstype for network mounts
[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 "build.h"
40 #include "strv.h"
41 #include "def.h"
42 #include "capability.h"
43
44 #include <bus-proxyd/bus-policy.h>
45
46 static int test_policy_load(Policy *p, const char *name)
47 {
48         _cleanup_free_ char *path = NULL;
49         int r = 0;
50
51         path = strjoin(TEST_DIR, "/bus-policy/", name, NULL);
52         assert_se(path);
53
54         if (access(path, R_OK) == 0)
55                 policy_load(p, STRV_MAKE(path));
56         else
57                 r = -ENOENT;
58
59         return r;
60 }
61
62 int main(int argc, char *argv[]) {
63
64         Policy p = {};
65
66         /* Ownership tests */
67         assert_se(test_policy_load(&p, "ownerships.conf") == 0);
68
69         assert_se(policy_check_own(&p, 0, 0, "org.test.test1") == true);
70         assert_se(policy_check_own(&p, 1, 0, "org.test.test1") == true);
71
72         assert_se(policy_check_own(&p, 0, 0, "org.test.test2") == true);
73         assert_se(policy_check_own(&p, 1, 0, "org.test.test2") == false);
74
75         assert_se(policy_check_own(&p, 0, 0, "org.test.test3") == false);
76         assert_se(policy_check_own(&p, 1, 0, "org.test.test3") == false);
77
78         assert_se(policy_check_own(&p, 0, 0, "org.test.test4") == false);
79         assert_se(policy_check_own(&p, 1, 0, "org.test.test4") == true);
80
81         policy_free(&p);
82
83         /* Signaltest */
84         assert_se(test_policy_load(&p, "signals.conf") == 0);
85
86         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_SIGNAL, "bli.bla.blubb", NULL, "/an/object/path", NULL) == true);
87         assert_se(policy_check_send(&p, 1, 0, SD_BUS_MESSAGE_SIGNAL, "bli.bla.blubb", NULL, "/an/object/path", NULL) == false);
88
89         policy_free(&p);
90
91         /* Method calls */
92         assert_se(test_policy_load(&p, "methods.conf") == 0);
93         policy_dump(&p);
94
95         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "bli.bla.blubb", "Member") == false);
96         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "bli.bla.blubb", "Member") == false);
97         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.test.int1", "Member") == true);
98         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.test.int2", "Member") == true);
99
100         assert_se(policy_check_recv(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test3", "/an/object/path", "org.test.int3", "Member111") == true);
101
102         policy_free(&p);
103
104         /* User and groups */
105         assert_se(test_policy_load(&p, "hello.conf") == 0);
106         policy_dump(&p);
107
108         assert_se(policy_check_hello(&p, 0, 0) == true);
109         assert_se(policy_check_hello(&p, 1, 0) == false);
110         assert_se(policy_check_hello(&p, 0, 1) == false);
111
112         policy_free(&p);
113
114         /* dbus1 test file: ownership */
115
116         assert_se(test_policy_load(&p, "check-own-rules.conf") >= 0);
117         policy_dump(&p);
118
119         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop") == false);
120         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystem") == false);
121         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems") == true);
122         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems.foo") == true);
123         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems.foo.bar") == true);
124         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems2") == false);
125         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems2.foo") == false);
126         assert_se(policy_check_own(&p, 0, 0, "org.freedesktop.ManySystems2.foo.bar") == false);
127
128         policy_free(&p);
129
130         /* dbus1 test file: many rules */
131
132         assert_se(test_policy_load(&p, "many-rules.conf") >= 0);
133         policy_dump(&p);
134         policy_free(&p);
135
136         /* dbus1 test file: generic test */
137
138         assert_se(test_policy_load(&p, "test.conf") >= 0);
139         policy_dump(&p);
140
141         assert_se(policy_check_own(&p, 0, 0, "org.foo.FooService") == true);
142         assert_se(policy_check_own(&p, 0, 0, "org.foo.FooService2") == false);
143         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.test.int2", "Member") == false);
144         assert_se(policy_check_send(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == true);
145         assert_se(policy_check_recv(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == true);
146         assert_se(policy_check_recv(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService", "/an/object/path", "org.foo.FooBroadcastInterface2", "Member") == false);
147         assert_se(policy_check_recv(&p, 0, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService2", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == false);
148
149         assert_se(policy_check_own(&p, 100, 0, "org.foo.FooService") == false);
150         assert_se(policy_check_own(&p, 100, 0, "org.foo.FooService2") == false);
151         assert_se(policy_check_send(&p, 100, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.test.int2", "Member") == false);
152         assert_se(policy_check_send(&p, 100, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.test.test1", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == false);
153         assert_se(policy_check_recv(&p, 100, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == true);
154         assert_se(policy_check_recv(&p, 100, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService", "/an/object/path", "org.foo.FooBroadcastInterface2", "Member") == false);
155         assert_se(policy_check_recv(&p, 100, 0, SD_BUS_MESSAGE_METHOD_CALL, "org.foo.FooService2", "/an/object/path", "org.foo.FooBroadcastInterface", "Member") == false);
156
157         policy_free(&p);
158
159         return EXIT_SUCCESS;
160 }