4 #include <dpl/test/test_runner.h>
5 #include <dpl/test/test_runner_multiprocess.h>
6 #include <dpl/log/log.h>
9 #include <glib-object.h>
10 #include <summary_collector.h>
11 #include "tests_common.h"
12 #include "security-server.h"
13 #include "privilege-control.h"
15 #define DBUS_SERVER_NAME "test.method.server"
16 #define DBUS_CALLER_NAME "test.method.caller"
18 #define DBUS_SMACK_NAME "org.freedesktop.DBus"
19 #define DBUS_SMACK_OBJECT "/org/freedesktop/DBus"
20 #define DBUS_SMACK_INTERFACE "org.freedesktop.DBus"
21 #define DBUS_SMACK_METHOD "GetConnectionCredentials"
23 RUNNER_TEST_GROUP_INIT(SECURITY_SERVER_TESTS_DBUS);
25 RUNNER_MULTIPROCESS_TEST_SMACK(tc01_smack_context_from_DBus)
28 const char *subject_parent = "subject_parent";
29 const char *subject_child = "subject_child";
31 DBusMessage* msg = NULL;
32 DBusMessageIter args, iter, var, var_iter, var_value;
33 DBusConnection* conn = NULL;
35 DBusPendingCall *pending = NULL;
36 const char *dbus_server_name = DBUS_SERVER_NAME;
37 char *smack_context = NULL;
40 RUNNER_ASSERT_MSG_BT(-1 != pid, "fork() failed");
44 ret = smack_set_label_for_self(subject_child);
45 RUNNER_ASSERT_MSG_BT(ret == PC_OPERATION_SUCCESS,
46 "smack_set__label_for_self() failed, ret: " << ret);
48 // initialize the errors
49 dbus_error_init(&err);
51 // connect to the system bus and check for errors
52 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
53 ret = dbus_error_is_set(&err);
55 dbus_error_free(&err);
56 RUNNER_ASSERT_MSG_BT(0 == ret, "dbus_bus_get() failed, ret: " << ret);
59 // request our name on the bus
60 ret = dbus_bus_request_name(conn, DBUS_CALLER_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
61 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
62 dbus_error_free(&err);
63 RUNNER_ASSERT_MSG_BT(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret,
64 "dbus_bus_request_name() failed, ret: " << ret);
67 // crate a new method call for checking SMACK context from DBus interface
68 msg = dbus_message_new_method_call(DBUS_SMACK_NAME,
73 RUNNER_ASSERT_MSG_BT(NULL != msg,
74 "dbus_message_new_method_call() failed, ret: " << ret);
76 // append arguments, we need SMACK context for our parent process "test.method.server"
77 dbus_message_iter_init_append(msg, &args);
78 ret = dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &dbus_server_name);
79 RUNNER_ASSERT_MSG_BT(1 == ret, "Out of memory");
81 // wait for parent to connect to DBus
84 // send message and get a handle for a reply
85 // -1 is default timeout
86 ret = dbus_connection_send_with_reply (conn, msg, &pending, -1);
87 RUNNER_ASSERT_MSG_BT(1 == ret, "Out of memory");
88 RUNNER_ASSERT_MSG_BT(NULL != pending, "Pending call null");
90 dbus_connection_flush(conn);
93 dbus_message_unref(msg);
96 dbus_pending_call_block(pending);
99 msg = dbus_pending_call_steal_reply(pending);
100 RUNNER_ASSERT_MSG_BT(NULL != msg, "Reply null");
102 // free message handle
103 dbus_pending_call_unref(pending);
105 ret = dbus_message_iter_init(msg, &iter);
106 RUNNER_ASSERT_MSG_BT(0 != ret, "Message has no arguments");
108 dbus_message_iter_recurse(&iter, &var);
110 while (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_INVALID) {
111 dbus_message_iter_recurse(&var, &var_iter);
112 while(dbus_message_iter_get_arg_type(&var_iter) != DBUS_TYPE_INVALID) {
113 dbus_message_iter_recurse(&var_iter, &var_value);
114 switch(dbus_message_iter_get_arg_type(&var_value)) {
115 case DBUS_TYPE_STRING:
116 dbus_message_iter_get_basic(&var_value, &smack_context);
121 dbus_message_iter_next(&var_iter);
123 dbus_message_iter_next(&var);
126 // free reply and close connection
127 dbus_message_unref(msg);
128 dbus_connection_unref(conn);
130 RUNNER_ASSERT_BT(smack_context != NULL);
131 ret = strcmp(smack_context, subject_parent);
132 RUNNER_ASSERT_MSG_BT(0 == ret,
133 "Context mismatch! context from dbus: " << smack_context);
139 ret = smack_set_label_for_self(subject_parent);
140 RUNNER_ASSERT_MSG_BT(ret == PC_OPERATION_SUCCESS,
141 "smack_set_label_for_self() failed, ret: " << ret);
143 // initialise the error
144 dbus_error_init(&err);
146 // connect to the bus and check for errors
147 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
148 ret = dbus_error_is_set(&err);
150 dbus_error_free(&err);
151 RUNNER_ASSERT_MSG_BT(0 == ret, "dbus_bus_get() failed, ret: " << ret);
154 // request our name on the bus and check for errors
155 ret = dbus_bus_request_name(conn, DBUS_SERVER_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
156 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
157 dbus_error_free(&err);
158 RUNNER_ASSERT_MSG_BT(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret,
159 "dbus_bus_request_name() failed, ret: " << ret);
162 // close the connection
163 dbus_connection_unref(conn);
167 ///////////////////////////////////////
168 //////NOSMACK ENV TESTS////////////////
169 ///////////////////////////////////////
172 * NOSMACK version of tc01 test.
174 * This is almost an exact copy of the original SMACK DBus test. As in previous security-server
175 * tests, parts where SMACK is used are skipped, because most important functions will return error.
177 RUNNER_MULTIPROCESS_TEST_NOSMACK(tc01_smack_context_from_DBus_nosmack)
180 const char* subject_parent = "subject_parent";
182 DBusMessage* msg = NULL;
183 DBusMessageIter args, iter, var, var_iter, var_value;
184 DBusConnection* conn = NULL;
186 DBusPendingCall *pending = NULL;
187 const char *dbus_server_name = DBUS_SERVER_NAME;
188 char *smack_context = NULL;
191 RUNNER_ASSERT_MSG_BT(-1 != pid, "fork() failed");
196 // initialize the errors
197 dbus_error_init(&err);
199 // connect to the system bus and check for errors; failure = exit with result 1
200 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
201 ret = dbus_error_is_set(&err);
203 dbus_error_free(&err);
204 RUNNER_ASSERT_MSG_BT(false, "Failed to connect to system bus. Ret " << ret);
207 // request our name on the bus; failure = exit with result 2
208 ret = dbus_bus_request_name(conn, DBUS_CALLER_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
209 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
210 dbus_error_free(&err);
211 RUNNER_ASSERT_MSG_BT(false, "Failed to request name on the bus. Ret " << ret);
214 // crate a new method call for checking SMACK context from DBus interface
215 msg = dbus_message_new_method_call(DBUS_SMACK_NAME,
217 DBUS_SMACK_INTERFACE,
220 RUNNER_ASSERT_MSG_BT(msg != NULL, "dbus_message_new_method_call() failed.");
222 // append arguments, we need SMACK context for our parent process "test.method.server"
223 dbus_message_iter_init_append(msg, &args);
224 ret = dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &dbus_server_name);
225 RUNNER_ASSERT_MSG_BT(ret == 1, "Out of memory. Ret " << ret);
227 // wait for parent to connect to DBus
230 // send message and get a handle for a reply
231 // -1 is default timeout
232 ret = dbus_connection_send_with_reply (conn, msg, &pending, -1);
233 RUNNER_ASSERT_MSG_BT(ret == 1, "Out of memory. Ret " << ret);
234 RUNNER_ASSERT_MSG_BT(pending != NULL, "Pending call is NULL.");
236 dbus_connection_flush(conn);
239 dbus_message_unref(msg);
242 dbus_pending_call_block(pending);
245 msg = dbus_pending_call_steal_reply(pending);
246 RUNNER_ASSERT_MSG_BT(msg != NULL, "Failed to get the reply from bus.");
248 // free message handle
249 dbus_pending_call_unref(pending);
251 ret = dbus_message_iter_init(msg, &iter);
252 RUNNER_ASSERT_MSG_BT(ret != 0, "DBus message has no arguments. Ret " << ret);
254 dbus_message_iter_recurse(&iter, &var);
255 while (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_INVALID) {
256 dbus_message_iter_recurse(&var, &var_iter);
257 while(dbus_message_iter_get_arg_type(&var_iter) != DBUS_TYPE_INVALID) {
258 dbus_message_iter_recurse(&var_iter, &var_value);
259 switch(dbus_message_iter_get_arg_type(&var_value)) {
260 case DBUS_TYPE_STRING:
261 dbus_message_iter_get_basic(&var_value, &smack_context);
266 dbus_message_iter_next(&var_iter);
268 dbus_message_iter_next(&var);
271 // free reply and close connection
272 dbus_message_unref(msg);
273 dbus_connection_unref(conn);
275 RUNNER_ASSERT_BT(smack_context != NULL);
276 ret = strcmp(smack_context, subject_parent);
277 RUNNER_ASSERT_MSG_BT(ret == 0, "Context mismatch. Context " << smack_context);
284 // initialise the error
285 dbus_error_init(&err);
287 // connect to the bus and check for errors
288 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
289 ret = dbus_error_is_set(&err);
291 dbus_error_free(&err);
292 RUNNER_ASSERT_MSG_BT(0 == ret, "dbus_bus_get() failed, ret: " << ret);
295 // request our name on the bus and check for errors
296 ret = dbus_bus_request_name(conn, DBUS_SERVER_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
297 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
298 dbus_error_free(&err);
299 RUNNER_ASSERT_MSG_BT(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret,
300 "dbus_bus_request_name() failed, ret: " << ret);
303 // close the connection
304 dbus_connection_unref(conn);
308 int main(int argc, char *argv[])
310 SummaryCollector::Register();
311 return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);