2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "stc-manager-gdbus.h"
18 #include "stc-manager.h"
19 #include "stc-statistics.h"
20 #include "stc-restriction.h"
21 #include "stc-firewall.h"
23 #include "stc-manager-util.h"
24 #include "stc-manager-plugin-appstatus.h"
25 #include "stc-manager-plugin-procfs.h"
26 #include "stc-manager-plugin-monitor.h"
27 #include "stc-manager-plugin-firewall.h"
28 #include "helper-iptables.h"
30 #define MANAGER_DBUS_ERROR_NAME "net.stc.manager.Error.Failed"
32 #define STC_MANAGER_DBUS_REPLY_ERROR(invocation, err_num) \
33 g_dbus_method_invocation_return_dbus_error((invocation), \
34 MANAGER_DBUS_ERROR_NAME, \
35 stc_err_strs[-(err_num)])
37 static const gchar *stc_err_strs[] = {
50 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
52 __STC_LOG_FUNC_ENTER__;
56 StcObjectSkeleton *object = NULL;
57 StcStatistics *statistics = NULL;
58 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
60 /* Add interface to default object path */
61 object = stc_object_skeleton_new(s);
64 /* Make the newly created object export the interface
65 * net.stc.statistics (note
66 * that @object takes its own reference to @statistics).
69 statistics = stc_statistics_skeleton_new();
70 stc_object_skeleton_set_statistics(object, statistics);
71 g_object_unref(statistics);
73 /* Register for method callbacks as signal callbacks */
75 g_signal_connect(statistics, "handle-init",
76 G_CALLBACK(handle_statistics_init),
79 g_signal_connect(statistics, "handle-get",
80 G_CALLBACK(handle_statistics_get),
83 g_signal_connect(statistics, "handle-get-all",
84 G_CALLBACK(handle_statistics_get_all),
87 g_signal_connect(statistics, "handle-reset",
88 G_CALLBACK(handle_statistics_reset),
91 /* Export the object (@manager takes its own reference to @object) */
92 g_dbus_object_manager_server_export(stc->obj_mgr,
93 G_DBUS_OBJECT_SKELETON(object));
94 g_object_unref(object);
96 stc->statistics_obj = (gpointer)statistics;
98 __STC_LOG_FUNC_EXIT__;
102 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
104 __STC_LOG_FUNC_ENTER__;
108 StcObjectSkeleton *object = NULL;
109 StcRestriction *restriction = NULL;
110 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
112 /* Add interface to default object path */
113 object = stc_object_skeleton_new(s);
116 /* Make the newly created object export the interface
117 * net.stc.restriction (note
118 * that @object takes its own reference to @restriction).
121 restriction = stc_restriction_skeleton_new();
122 stc_object_skeleton_set_restriction(object, restriction);
123 g_object_unref(restriction);
125 /* Register for method callbacks as signal callbacks */
127 g_signal_connect(restriction, "handle-set",
128 G_CALLBACK(handle_restriction_set), stc);
130 g_signal_connect(restriction, "handle-get",
131 G_CALLBACK(handle_restriction_get), stc);
133 g_signal_connect(restriction, "handle-get-all",
134 G_CALLBACK(handle_restriction_get_all), stc);
136 g_signal_connect(restriction, "handle-get-type",
137 G_CALLBACK(handle_restriction_get_type),
140 g_signal_connect(restriction, "handle-unset",
141 G_CALLBACK(handle_restriction_unset), stc);
143 g_signal_connect(restriction, "handle-set-list",
144 G_CALLBACK(handle_restriction_set_list), stc);
146 g_signal_connect(restriction, "handle-unset-list",
147 G_CALLBACK(handle_restriction_unset_list), stc);
149 /* Export the object (@manager takes its own reference to @object) */
150 g_dbus_object_manager_server_export(stc->obj_mgr,
151 G_DBUS_OBJECT_SKELETON(object));
152 g_object_unref(object);
154 stc->restriction_obj = (gpointer)restriction;
156 __STC_LOG_FUNC_EXIT__;
160 static gboolean __stc_manager_gdbus_firewall_init(stc_s *stc)
162 __STC_LOG_FUNC_ENTER__;
166 StcObjectSkeleton *object = NULL;
167 StcFirewall *firewall = NULL;
168 s = g_strdup_printf(STC_DBUS_SERVICE_FIREWALL_PATH);
170 /* Add interface to default object path */
171 object = stc_object_skeleton_new(s);
174 firewall = stc_firewall_skeleton_new();
175 stc_object_skeleton_set_firewall(object, firewall);
176 g_object_unref(firewall);
178 /* Register for method callbacks as signal callbacks */
180 g_signal_connect(firewall, "handle-lock",
181 G_CALLBACK(handle_firewall_lock),
184 g_signal_connect(firewall, "handle-unlock",
185 G_CALLBACK(handle_firewall_unlock),
188 g_signal_connect(firewall, "handle-get-lock",
189 G_CALLBACK(handle_firewall_get_lock),
192 g_signal_connect(firewall, "handle-add-chain",
193 G_CALLBACK(handle_firewall_add_chain),
196 g_signal_connect(firewall, "handle-remove-chain",
197 G_CALLBACK(handle_firewall_remove_chain),
200 g_signal_connect(firewall, "handle-flush-chain",
201 G_CALLBACK(handle_firewall_flush_chain),
204 g_signal_connect(firewall, "handle-get-all-chain",
205 G_CALLBACK(handle_firewall_get_all_chain),
208 g_signal_connect(firewall, "handle-set-chain",
209 G_CALLBACK(handle_firewall_set_chain),
212 g_signal_connect(firewall, "handle-unset-chain",
213 G_CALLBACK(handle_firewall_unset_chain),
216 g_signal_connect(firewall, "handle-add-rule",
217 G_CALLBACK(handle_firewall_add_rule),
220 g_signal_connect(firewall, "handle-remove-rule",
221 G_CALLBACK(handle_firewall_remove_rule),
224 g_signal_connect(firewall, "handle-update-rule",
225 G_CALLBACK(handle_firewall_update_rule),
228 g_signal_connect(firewall, "handle-get-all-rule",
229 G_CALLBACK(handle_firewall_get_all_rule),
232 /* Export the object (@manager takes its own reference to @object) */
233 g_dbus_object_manager_server_export(stc->obj_mgr,
234 G_DBUS_OBJECT_SKELETON(object));
235 g_object_unref(object);
237 stc->firewall_obj = (gpointer)firewall;
239 __STC_LOG_FUNC_EXIT__;
243 static gboolean __stc_manager_gdbus_pcap_init(stc_s *stc)
245 __STC_LOG_FUNC_ENTER__;
249 StcObjectSkeleton *object = NULL;
250 StcPcap *pcap = NULL;
251 s = g_strdup_printf(STC_DBUS_SERVICE_PCAP_PATH);
253 /* Add interface to default object path */
254 object = stc_object_skeleton_new(s);
257 pcap = stc_pcap_skeleton_new();
258 stc_object_skeleton_set_pcap(object, pcap);
259 g_object_unref(pcap);
261 /* Register for method callbacks as signal callbacks */
263 g_signal_connect(pcap, "handle-start",
264 G_CALLBACK(handle_pcap_start),
267 g_signal_connect(pcap, "handle-stop",
268 G_CALLBACK(handle_pcap_stop),
271 g_signal_connect(pcap, "handle-get-all",
272 G_CALLBACK(handle_pcap_get_all),
275 g_signal_connect(pcap, "handle-find-all-devs",
276 G_CALLBACK(handle_pcap_find_all_devs),
279 /* Export the object (@manager takes its own reference to @object) */
280 g_dbus_object_manager_server_export(stc->obj_mgr,
281 G_DBUS_OBJECT_SKELETON(object));
282 g_object_unref(object);
284 stc->pcap_obj = (gpointer)pcap;
286 __STC_LOG_FUNC_EXIT__;
290 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
292 __STC_LOG_FUNC_ENTER__;
296 StcObjectSkeleton *object = NULL;
297 StcManager *manager = NULL;
298 s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
300 object = stc_object_skeleton_new(s);
303 manager = stc_manager_skeleton_new();
304 stc_object_skeleton_set_manager(object, manager);
305 g_object_unref(manager);
307 g_signal_connect(manager, "handle-stop",
308 G_CALLBACK(handle_manager_stop), stc);
310 g_signal_connect(manager, "handle-commit-iptables",
311 G_CALLBACK(handle_manager_commit_iptables), stc);
313 g_signal_connect(manager, "handle-commit-ip6tables",
314 G_CALLBACK(handle_manager_commit_ip6tables), stc);
316 g_dbus_object_manager_server_export(stc->obj_mgr,
317 G_DBUS_OBJECT_SKELETON(object));
318 g_object_unref(object);
320 stc->manager_obj = (gpointer)manager;
322 __STC_LOG_FUNC_EXIT__;
327 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
331 __STC_LOG_FUNC_ENTER__;
332 stc_s* stc = (stc_s*)user_data;
334 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
336 STC_LOGD("path : %s", name);
338 stc->connection = connection;
340 if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
341 STC_LOGE("Can not signal connect to statistics"); //LCOV_EXCL_LINE
342 /* Deinitialize and quit manager */
345 if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
346 STC_LOGE("Cannot signal connect to restriction"); //LCOV_EXCL_LINE
347 /* Deinitialize and quit manager */
350 if (__stc_manager_gdbus_firewall_init(stc) == FALSE) {
351 STC_LOGE("Cannot signal connect to firewall"); //LCOV_EXCL_LINE
352 /* Deinitialize and quit manager */
355 if (__stc_manager_gdbus_pcap_init(stc) == FALSE) {
356 STC_LOGE("Cannot signal connect to pcap"); //LCOV_EXCL_LINE
357 /* Deinitialize and quit manager */
360 if (__stc_manager_gdbus_manager_init(stc) == FALSE) {
361 STC_LOGE("Cannot signal connect to manager"); //LCOV_EXCL_LINE
362 /* Deinitialize and quit manager */
365 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
369 stc_plugin_firewall_update();
370 stc_plugin_monitor_init_connection(stc);
372 stc_plugin_appstatus_register_state_changed_cb(stc,
373 stc_plugin_procfs_app_status_changed, NULL);
375 __STC_LOG_FUNC_EXIT__;
378 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
382 STC_LOGD("name : %s", name);
386 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
390 STC_LOGD("name : %s", name);
394 void stc_manager_gdbus_init(gpointer stc_data)
396 __STC_LOG_FUNC_ENTER__;
397 stc_s *stc = (stc_s *)stc_data;
399 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
401 G_BUS_NAME_OWNER_FLAGS_NONE,
402 __stc_manager_gdbus_on_bus_acquired,
403 __stc_manager_gdbus_on_name_acquired,
404 __stc_manager_gdbus_on_name_lost,
408 __STC_LOG_FUNC_EXIT__;
411 void stc_manager_gdbus_deinit(gpointer stc_data)
413 __STC_LOG_FUNC_ENTER__;
414 stc_s *stc = (stc_s *)stc_data;
416 stc_plugin_appstatus_deregister_state_changed_cb(stc);
417 stc_plugin_monitor_deinit_connection(stc);
419 g_bus_unown_name(stc->gdbus_owner_id);
421 stc->statistics_obj = NULL;
422 stc->restriction_obj = NULL;
423 stc->firewall_obj = NULL;
424 stc->pcap_obj = NULL;
425 stc->manager_obj = NULL;
426 __STC_LOG_FUNC_EXIT__;
429 API GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
430 const char *dest, const char *path,
431 const char *interface_name,
432 const char *method, GVariant *params)
434 GError *error = NULL;
435 GVariant *reply = NULL;
437 if (connection == NULL) {
438 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
439 return reply; //LCOV_EXCL_LINE
442 reply = g_dbus_connection_call_sync(connection,
449 G_DBUS_CALL_FLAGS_NONE,
450 (5 * 1000), /* 5 seconds timeout */
456 STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
457 " error [%d: %s]", error->code, error->message);
458 g_error_free(error); //LCOV_EXCL_LINE
460 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
469 API int stc_manager_gdbus_call_async(GDBusConnection *connection,
470 const char *dest, const char *path,
471 const char *interface_name,
472 const char *method, GVariant *params,
473 GAsyncReadyCallback notify_func,
476 if (connection == NULL) {
477 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
478 return STC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
481 g_dbus_connection_call(connection,
488 G_DBUS_CALL_FLAGS_NONE,
489 (5 * 1000), /* 5 seconds timeout */
491 (GAsyncReadyCallback)notify_func,
492 (gpointer)user_data);
494 return STC_ERROR_NONE;
497 API guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
499 const gchar *interface_name,
501 const gchar *object_path,
503 GDBusSignalFlags flags,
504 GDBusSignalCallback callback,
506 GDestroyNotify user_data_free_func)
508 if (connection == NULL) {
509 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
510 return 0; //LCOV_EXCL_LINE
513 return g_dbus_connection_signal_subscribe(connection,
519 G_DBUS_SIGNAL_FLAGS_NONE,
522 user_data_free_func);
525 API void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
526 guint subscription_id)
528 if (connection == NULL) {
529 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
530 return; //LCOV_EXCL_LINE
533 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
536 API void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
539 __STC_LOG_FUNC_ENTER__;
542 GVariant *value = NULL;
545 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
546 return; //LCOV_EXCL_LINE
549 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
550 /* DEBUG_GDBUS_KEY_VALUE(key, value); */
552 cb(key, value, user_data);
555 __STC_LOG_FUNC_EXIT__;
558 API gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
559 const gchar *object_path,
560 const gchar *interface_name,
561 const gchar *signal_name,
562 GVariant *parameters)
565 GError *error = NULL;
567 if (connection == NULL) {
568 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
572 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
574 rv = g_dbus_connection_emit_signal(connection,
582 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
583 signal_name, interface_name, error->message);
584 g_error_free(error); //LCOV_EXCL_LINE
586 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
593 gboolean handle_manager_stop(StcManager *object,
594 GDBusMethodInvocation *invocation)
596 __STC_LOG_FUNC_ENTER__;
597 GVariant *return_parameters = NULL;
599 stc_set_keep_alive(TRUE);
601 STC_LOGI("stc manager stop");
603 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
605 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
606 STC_DBUS_REPLY(invocation, return_parameters);
610 __STC_LOG_FUNC_EXIT__;
614 gboolean handle_manager_commit_iptables(StcManager *object,
615 GDBusMethodInvocation *invocation,
619 __STC_LOG_FUNC_ENTER__;
620 GVariant *return_parameters = NULL;
621 int ret = STC_ERROR_NONE;
623 char *err_str = NULL;
624 char cmd[STC_CMD_SIZE] = { 0, };
626 stc_set_keep_alive(TRUE);
628 if (option == NULL) {
629 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
630 STC_ERROR_INVALID_PARAMETER);
631 __STC_LOG_FUNC_EXIT__;
635 STC_LOGD("[%s]", option);
636 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IPTABLES, option);
638 ret = stc_commit_iptables(cmd, &err_num, &err_str);
640 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
642 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
643 STC_DBUS_REPLY(invocation, return_parameters);
645 __STC_LOG_FUNC_EXIT__;
649 gboolean handle_manager_commit_ip6tables(StcManager *object,
650 GDBusMethodInvocation *invocation,
654 __STC_LOG_FUNC_ENTER__;
655 GVariant *return_parameters = NULL;
656 int ret = STC_ERROR_NONE;
658 char *err_str = NULL;
659 char cmd[STC_CMD_SIZE] = { 0, };
661 stc_set_keep_alive(TRUE);
663 if (option == NULL) {
664 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
665 STC_ERROR_INVALID_PARAMETER);
666 __STC_LOG_FUNC_EXIT__;
670 STC_LOGD("[%s]", option);
671 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IP6TABLES, option);
673 ret = stc_commit_iptables(cmd, &err_num, &err_str);
675 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
677 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
678 STC_DBUS_REPLY(invocation, return_parameters);
680 __STC_LOG_FUNC_EXIT__;