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