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 "helper-iptables.h"
29 #define MANAGER_DBUS_ERROR_NAME "net.stc.manager.Error.Failed"
31 #define STC_MANAGER_DBUS_REPLY_ERROR(invocation, err_num) \
32 g_dbus_method_invocation_return_dbus_error((invocation), \
33 MANAGER_DBUS_ERROR_NAME, \
34 stc_err_strs[-(err_num)])
36 static const gchar *stc_err_strs[] = {
49 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
51 __STC_LOG_FUNC_ENTER__;
55 StcObjectSkeleton *object = NULL;
56 StcStatistics *statistics = NULL;
57 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
59 /* Add interface to default object path */
60 object = stc_object_skeleton_new(s);
63 /* Make the newly created object export the interface
64 * net.stc.statistics (note
65 * that @object takes its own reference to @statistics).
68 statistics = stc_statistics_skeleton_new();
69 stc_object_skeleton_set_statistics(object, statistics);
70 g_object_unref(statistics);
72 /* Register for method callbacks as signal callbacks */
74 g_signal_connect(statistics, "handle-init",
75 G_CALLBACK(handle_statistics_init),
78 g_signal_connect(statistics, "handle-get",
79 G_CALLBACK(handle_statistics_get),
82 g_signal_connect(statistics, "handle-get-all",
83 G_CALLBACK(handle_statistics_get_all),
86 g_signal_connect(statistics, "handle-reset",
87 G_CALLBACK(handle_statistics_reset),
90 /* Export the object (@manager takes its own reference to @object) */
91 g_dbus_object_manager_server_export(stc->obj_mgr,
92 G_DBUS_OBJECT_SKELETON(object));
93 g_object_unref(object);
95 stc->statistics_obj = (gpointer)statistics;
97 __STC_LOG_FUNC_EXIT__;
101 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
103 __STC_LOG_FUNC_ENTER__;
107 StcObjectSkeleton *object = NULL;
108 StcRestriction *restriction = NULL;
109 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
111 /* Add interface to default object path */
112 object = stc_object_skeleton_new(s);
115 /* Make the newly created object export the interface
116 * net.stc.restriction (note
117 * that @object takes its own reference to @restriction).
120 restriction = stc_restriction_skeleton_new();
121 stc_object_skeleton_set_restriction(object, restriction);
122 g_object_unref(restriction);
124 /* Register for method callbacks as signal callbacks */
126 g_signal_connect(restriction, "handle-set",
127 G_CALLBACK(handle_restriction_set), stc);
129 g_signal_connect(restriction, "handle-get",
130 G_CALLBACK(handle_restriction_get), stc);
132 g_signal_connect(restriction, "handle-get-all",
133 G_CALLBACK(handle_restriction_get_all), stc);
135 g_signal_connect(restriction, "handle-get-type",
136 G_CALLBACK(handle_restriction_get_type),
139 g_signal_connect(restriction, "handle-unset",
140 G_CALLBACK(handle_restriction_unset), stc);
142 /* Export the object (@manager takes its own reference to @object) */
143 g_dbus_object_manager_server_export(stc->obj_mgr,
144 G_DBUS_OBJECT_SKELETON(object));
145 g_object_unref(object);
147 stc->restriction_obj = (gpointer)restriction;
149 __STC_LOG_FUNC_EXIT__;
153 static gboolean __stc_manager_gdbus_firewall_init(stc_s *stc)
155 __STC_LOG_FUNC_ENTER__;
159 StcObjectSkeleton *object = NULL;
160 StcFirewall *firewall = NULL;
161 s = g_strdup_printf(STC_DBUS_SERVICE_FIREWALL_PATH);
163 /* Add interface to default object path */
164 object = stc_object_skeleton_new(s);
167 firewall = stc_firewall_skeleton_new();
168 stc_object_skeleton_set_firewall(object, firewall);
169 g_object_unref(firewall);
171 /* Register for method callbacks as signal callbacks */
173 g_signal_connect(firewall, "handle-lock",
174 G_CALLBACK(handle_firewall_lock),
177 g_signal_connect(firewall, "handle-unlock",
178 G_CALLBACK(handle_firewall_unlock),
181 g_signal_connect(firewall, "handle-get-lock",
182 G_CALLBACK(handle_firewall_get_lock),
185 g_signal_connect(firewall, "handle-add-chain",
186 G_CALLBACK(handle_firewall_add_chain),
189 g_signal_connect(firewall, "handle-remove-chain",
190 G_CALLBACK(handle_firewall_remove_chain),
193 g_signal_connect(firewall, "handle-flush-chain",
194 G_CALLBACK(handle_firewall_flush_chain),
197 g_signal_connect(firewall, "handle-get-all-chain",
198 G_CALLBACK(handle_firewall_get_all_chain),
201 g_signal_connect(firewall, "handle-set-chain",
202 G_CALLBACK(handle_firewall_set_chain),
205 g_signal_connect(firewall, "handle-unset-chain",
206 G_CALLBACK(handle_firewall_unset_chain),
209 g_signal_connect(firewall, "handle-add-rule",
210 G_CALLBACK(handle_firewall_add_rule),
213 g_signal_connect(firewall, "handle-remove-rule",
214 G_CALLBACK(handle_firewall_remove_rule),
217 g_signal_connect(firewall, "handle-update-rule",
218 G_CALLBACK(handle_firewall_update_rule),
221 g_signal_connect(firewall, "handle-get-all-rule",
222 G_CALLBACK(handle_firewall_get_all_rule),
225 /* Export the object (@manager takes its own reference to @object) */
226 g_dbus_object_manager_server_export(stc->obj_mgr,
227 G_DBUS_OBJECT_SKELETON(object));
228 g_object_unref(object);
230 stc->firewall_obj = (gpointer)firewall;
232 __STC_LOG_FUNC_EXIT__;
236 static gboolean __stc_manager_gdbus_pcap_init(stc_s *stc)
238 __STC_LOG_FUNC_ENTER__;
242 StcObjectSkeleton *object = NULL;
243 StcPcap *pcap = NULL;
244 s = g_strdup_printf(STC_DBUS_SERVICE_PCAP_PATH);
246 /* Add interface to default object path */
247 object = stc_object_skeleton_new(s);
250 pcap = stc_pcap_skeleton_new();
251 stc_object_skeleton_set_pcap(object, pcap);
252 g_object_unref(pcap);
254 /* Register for method callbacks as signal callbacks */
256 g_signal_connect(pcap, "handle-start",
257 G_CALLBACK(handle_pcap_start),
260 g_signal_connect(pcap, "handle-stop",
261 G_CALLBACK(handle_pcap_stop),
264 /* Export the object (@manager takes its own reference to @object) */
265 g_dbus_object_manager_server_export(stc->obj_mgr,
266 G_DBUS_OBJECT_SKELETON(object));
267 g_object_unref(object);
269 stc->pcap_obj = (gpointer)pcap;
271 __STC_LOG_FUNC_EXIT__;
275 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
277 __STC_LOG_FUNC_ENTER__;
281 StcObjectSkeleton *object = NULL;
282 StcManager *manager = NULL;
283 s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
285 object = stc_object_skeleton_new(s);
288 manager = stc_manager_skeleton_new();
289 stc_object_skeleton_set_manager(object, manager);
290 g_object_unref(manager);
292 g_signal_connect(manager, "handle-stop",
293 G_CALLBACK(handle_manager_stop), stc);
295 g_signal_connect(manager, "handle-commit-iptables",
296 G_CALLBACK(handle_manager_commit_iptables), stc);
298 g_signal_connect(manager, "handle-commit-ip6tables",
299 G_CALLBACK(handle_manager_commit_ip6tables), stc);
301 g_dbus_object_manager_server_export(stc->obj_mgr,
302 G_DBUS_OBJECT_SKELETON(object));
303 g_object_unref(object);
305 stc->manager_obj = (gpointer)manager;
307 __STC_LOG_FUNC_EXIT__;
312 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
316 __STC_LOG_FUNC_ENTER__;
317 stc_s* stc = (stc_s*)user_data;
319 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
321 STC_LOGD("path : %s", name);
323 stc->connection = connection;
325 if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
326 STC_LOGE("Can not signal connect to statistics"); //LCOV_EXCL_LINE
327 /* Deinitialize and quit manager */
330 if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
331 STC_LOGE("Cannot signal connect to restriction"); //LCOV_EXCL_LINE
332 /* Deinitialize and quit manager */
335 if (__stc_manager_gdbus_firewall_init(stc) == FALSE) {
336 STC_LOGE("Cannot signal connect to firewall"); //LCOV_EXCL_LINE
337 /* Deinitialize and quit manager */
340 if (__stc_manager_gdbus_pcap_init(stc) == FALSE) {
341 STC_LOGE("Cannot signal connect to pcap"); //LCOV_EXCL_LINE
342 /* Deinitialize and quit manager */
345 if (__stc_manager_gdbus_manager_init(stc) == FALSE) {
346 STC_LOGE("Cannot signal connect to manager"); //LCOV_EXCL_LINE
347 /* Deinitialize and quit manager */
350 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
354 stc_firewall_update();
355 stc_plugin_monitor_init_connection(stc);
357 stc_plugin_appstatus_register_state_changed_cb(stc,
358 stc_plugin_procfs_app_status_changed, NULL);
360 __STC_LOG_FUNC_EXIT__;
363 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
367 STC_LOGD("name : %s", name);
371 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
375 STC_LOGD("name : %s", name);
379 void stc_manager_gdbus_init(gpointer stc_data)
381 __STC_LOG_FUNC_ENTER__;
382 stc_s *stc = (stc_s *)stc_data;
384 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
386 G_BUS_NAME_OWNER_FLAGS_NONE,
387 __stc_manager_gdbus_on_bus_acquired,
388 __stc_manager_gdbus_on_name_acquired,
389 __stc_manager_gdbus_on_name_lost,
393 __STC_LOG_FUNC_EXIT__;
396 void stc_manager_gdbus_deinit(gpointer stc_data)
398 __STC_LOG_FUNC_ENTER__;
399 stc_s *stc = (stc_s *)stc_data;
401 stc_plugin_appstatus_deregister_state_changed_cb(stc);
402 stc_plugin_monitor_deinit_connection(stc);
404 g_bus_unown_name(stc->gdbus_owner_id);
406 stc->statistics_obj = NULL;
407 stc->restriction_obj = NULL;
408 stc->firewall_obj = NULL;
409 stc->pcap_obj = NULL;
410 stc->manager_obj = NULL;
411 __STC_LOG_FUNC_EXIT__;
414 API GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
415 const char *dest, const char *path,
416 const char *interface_name,
417 const char *method, GVariant *params)
419 GError *error = NULL;
420 GVariant *reply = NULL;
422 if (connection == NULL) {
423 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
424 return reply; //LCOV_EXCL_LINE
427 reply = g_dbus_connection_call_sync(connection,
434 G_DBUS_CALL_FLAGS_NONE,
435 (5 * 1000), /* 5 seconds timeout */
441 STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
442 " error [%d: %s]", error->code, error->message);
443 g_error_free(error); //LCOV_EXCL_LINE
445 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
454 API guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
456 const gchar *interface_name,
458 const gchar *object_path,
460 GDBusSignalFlags flags,
461 GDBusSignalCallback callback,
463 GDestroyNotify user_data_free_func)
465 if (connection == NULL) {
466 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
467 return 0; //LCOV_EXCL_LINE
470 return g_dbus_connection_signal_subscribe(connection,
476 G_DBUS_SIGNAL_FLAGS_NONE,
479 user_data_free_func);
482 API void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
483 guint subscription_id)
485 if (connection == NULL) {
486 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
487 return; //LCOV_EXCL_LINE
490 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
493 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
496 __STC_LOG_FUNC_ENTER__;
499 GVariant *value = NULL;
502 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
503 return; //LCOV_EXCL_LINE
506 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
507 /* DEBUG_GDBUS_KEY_VALUE(key, value); */
509 cb(key, value, user_data);
512 __STC_LOG_FUNC_EXIT__;
515 API gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
516 const gchar *object_path,
517 const gchar *interface_name,
518 const gchar *signal_name,
519 GVariant *parameters)
522 GError *error = NULL;
524 if (connection == NULL) {
525 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
529 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
531 rv = g_dbus_connection_emit_signal(connection,
539 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
540 signal_name, interface_name, error->message);
541 g_error_free(error); //LCOV_EXCL_LINE
543 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
550 gboolean handle_manager_stop(StcManager *object,
551 GDBusMethodInvocation *invocation)
553 __STC_LOG_FUNC_ENTER__;
554 GVariant *return_parameters = NULL;
556 STC_LOGI("stc manager stop");
558 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
560 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
561 STC_DBUS_REPLY(invocation, return_parameters);
565 __STC_LOG_FUNC_EXIT__;
569 gboolean handle_manager_commit_iptables(StcManager *object,
570 GDBusMethodInvocation *invocation,
574 __STC_LOG_FUNC_ENTER__;
575 GVariant *return_parameters = NULL;
576 int ret = STC_ERROR_NONE;
578 char *err_str = NULL;
579 char cmd[STC_CMD_SIZE] = { 0, };
581 if (option == NULL) {
582 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
583 STC_ERROR_INVALID_PARAMETER);
584 __STC_LOG_FUNC_EXIT__;
588 STC_LOGD("[%s]", option);
589 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IPTABLES, option);
591 ret = stc_commit_iptables(cmd, &err_num, &err_str);
593 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
595 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
596 STC_DBUS_REPLY(invocation, return_parameters);
598 __STC_LOG_FUNC_EXIT__;
602 gboolean handle_manager_commit_ip6tables(StcManager *object,
603 GDBusMethodInvocation *invocation,
607 __STC_LOG_FUNC_ENTER__;
608 GVariant *return_parameters = NULL;
609 int ret = STC_ERROR_NONE;
611 char *err_str = NULL;
612 char cmd[STC_CMD_SIZE] = { 0, };
614 if (option == NULL) {
615 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
616 STC_ERROR_INVALID_PARAMETER);
617 __STC_LOG_FUNC_EXIT__;
621 STC_LOGD("[%s]", option);
622 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IP6TABLES, option);
624 ret = stc_commit_iptables(cmd, &err_num, &err_str);
626 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
628 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
629 STC_DBUS_REPLY(invocation, return_parameters);
631 __STC_LOG_FUNC_EXIT__;