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"
22 #include "stc-connection.h"
23 #include "stc-manager-util.h"
24 #include "stc-manager-plugin-appstatus.h"
25 #include "stc-manager-plugin-procfs.h"
26 #include "helper-iptables.h"
28 #define MANAGER_DBUS_ERROR_NAME "net.stc.manager.Error.Failed"
30 #define STC_MANAGER_DBUS_REPLY_ERROR(invocation, err_num) \
31 g_dbus_method_invocation_return_dbus_error((invocation), \
32 MANAGER_DBUS_ERROR_NAME, \
33 stc_err_strs[-(err_num)])
35 static const gchar *stc_err_strs[] = {
48 static gboolean __stc_manager_gdbus_statistics_init(stc_s *stc)
50 __STC_LOG_FUNC_ENTER__;
54 StcObjectSkeleton *object = NULL;
55 StcStatistics *statistics = NULL;
56 s = g_strdup_printf(STC_DBUS_SERVICE_STATISTICS_PATH);
58 /* Add interface to default object path */
59 object = stc_object_skeleton_new(s);
62 /* Make the newly created object export the interface
63 * net.stc.statistics (note
64 * that @object takes its own reference to @statistics).
67 statistics = stc_statistics_skeleton_new();
68 stc_object_skeleton_set_statistics(object, statistics);
69 g_object_unref(statistics);
71 /* Register for method callbacks as signal callbacks */
73 g_signal_connect(statistics, "handle-init",
74 G_CALLBACK(handle_statistics_init),
77 g_signal_connect(statistics, "handle-get",
78 G_CALLBACK(handle_statistics_get),
81 g_signal_connect(statistics, "handle-get-all",
82 G_CALLBACK(handle_statistics_get_all),
85 g_signal_connect(statistics, "handle-reset",
86 G_CALLBACK(handle_statistics_reset),
89 /* Export the object (@manager takes its own reference to @object) */
90 g_dbus_object_manager_server_export(stc->obj_mgr,
91 G_DBUS_OBJECT_SKELETON(object));
92 g_object_unref(object);
94 stc->statistics_obj = (gpointer)statistics;
96 __STC_LOG_FUNC_EXIT__;
100 static gboolean __stc_manager_gdbus_restriction_init(stc_s *stc)
102 __STC_LOG_FUNC_ENTER__;
106 StcObjectSkeleton *object = NULL;
107 StcRestriction *restriction = NULL;
108 s = g_strdup_printf(STC_DBUS_SERVICE_RESTRICTION_PATH);
110 /* Add interface to default object path */
111 object = stc_object_skeleton_new(s);
114 /* Make the newly created object export the interface
115 * net.stc.restriction (note
116 * that @object takes its own reference to @restriction).
119 restriction = stc_restriction_skeleton_new();
120 stc_object_skeleton_set_restriction(object, restriction);
121 g_object_unref(restriction);
123 /* Register for method callbacks as signal callbacks */
125 g_signal_connect(restriction, "handle-set",
126 G_CALLBACK(handle_restriction_set), stc);
128 g_signal_connect(restriction, "handle-get",
129 G_CALLBACK(handle_restriction_get), stc);
131 g_signal_connect(restriction, "handle-get-all",
132 G_CALLBACK(handle_restriction_get_all), stc);
134 g_signal_connect(restriction, "handle-get-type",
135 G_CALLBACK(handle_restriction_get_type),
138 g_signal_connect(restriction, "handle-unset",
139 G_CALLBACK(handle_restriction_unset), stc);
141 /* Export the object (@manager takes its own reference to @object) */
142 g_dbus_object_manager_server_export(stc->obj_mgr,
143 G_DBUS_OBJECT_SKELETON(object));
144 g_object_unref(object);
146 stc->restriction_obj = (gpointer)restriction;
148 __STC_LOG_FUNC_EXIT__;
152 static gboolean __stc_manager_gdbus_firewall_init(stc_s *stc)
154 __STC_LOG_FUNC_ENTER__;
158 StcObjectSkeleton *object = NULL;
159 StcFirewall *firewall = NULL;
160 s = g_strdup_printf(STC_DBUS_SERVICE_FIREWALL_PATH);
162 /* Add interface to default object path */
163 object = stc_object_skeleton_new(s);
166 firewall = stc_firewall_skeleton_new();
167 stc_object_skeleton_set_firewall(object, firewall);
168 g_object_unref(firewall);
170 /* Register for method callbacks as signal callbacks */
172 g_signal_connect(firewall, "handle-lock",
173 G_CALLBACK(handle_firewall_lock),
176 g_signal_connect(firewall, "handle-unlock",
177 G_CALLBACK(handle_firewall_unlock),
180 g_signal_connect(firewall, "handle-get-lock",
181 G_CALLBACK(handle_firewall_get_lock),
184 g_signal_connect(firewall, "handle-add-chain",
185 G_CALLBACK(handle_firewall_add_chain),
188 g_signal_connect(firewall, "handle-remove-chain",
189 G_CALLBACK(handle_firewall_remove_chain),
192 g_signal_connect(firewall, "handle-flush-chain",
193 G_CALLBACK(handle_firewall_flush_chain),
196 g_signal_connect(firewall, "handle-get-all-chain",
197 G_CALLBACK(handle_firewall_get_all_chain),
200 g_signal_connect(firewall, "handle-set-chain",
201 G_CALLBACK(handle_firewall_set_chain),
204 g_signal_connect(firewall, "handle-unset-chain",
205 G_CALLBACK(handle_firewall_unset_chain),
208 g_signal_connect(firewall, "handle-add-rule",
209 G_CALLBACK(handle_firewall_add_rule),
212 g_signal_connect(firewall, "handle-remove-rule",
213 G_CALLBACK(handle_firewall_remove_rule),
216 g_signal_connect(firewall, "handle-update-rule",
217 G_CALLBACK(handle_firewall_update_rule),
220 g_signal_connect(firewall, "handle-get-all-rule",
221 G_CALLBACK(handle_firewall_get_all_rule),
224 /* Export the object (@manager takes its own reference to @object) */
225 g_dbus_object_manager_server_export(stc->obj_mgr,
226 G_DBUS_OBJECT_SKELETON(object));
227 g_object_unref(object);
229 stc->firewall_obj = (gpointer)firewall;
231 __STC_LOG_FUNC_EXIT__;
235 static gboolean __stc_manager_gdbus_manager_init(stc_s *stc)
237 __STC_LOG_FUNC_ENTER__;
241 StcObjectSkeleton *object = NULL;
242 StcManager *manager = NULL;
243 s = g_strdup_printf(STC_DBUS_SERVICE_MANAGER_PATH);
245 object = stc_object_skeleton_new(s);
248 manager = stc_manager_skeleton_new();
249 stc_object_skeleton_set_manager(object, manager);
250 g_object_unref(manager);
252 g_signal_connect(manager, "handle-stop",
253 G_CALLBACK(handle_manager_stop), stc);
255 g_signal_connect(manager, "handle-commit-iptables",
256 G_CALLBACK(handle_manager_commit_iptables), stc);
258 g_signal_connect(manager, "handle-commit-ip6tables",
259 G_CALLBACK(handle_manager_commit_ip6tables), stc);
261 g_dbus_object_manager_server_export(stc->obj_mgr,
262 G_DBUS_OBJECT_SKELETON(object));
263 g_object_unref(object);
265 stc->manager_obj = (gpointer)manager;
267 __STC_LOG_FUNC_EXIT__;
272 static void __stc_manager_gdbus_on_bus_acquired(GDBusConnection *connection,
276 __STC_LOG_FUNC_ENTER__;
277 stc_s* stc = (stc_s*)user_data;
279 stc->obj_mgr = g_dbus_object_manager_server_new("/net/stc");
281 STC_LOGD("path : %s", name);
283 stc->connection = connection;
285 if (__stc_manager_gdbus_statistics_init(stc) == FALSE) {
286 STC_LOGE("Can not signal connect to statistics"); //LCOV_EXCL_LINE
287 /* Deinitialize and quit manager */
290 if (__stc_manager_gdbus_restriction_init(stc) == FALSE) {
291 STC_LOGE("Cannot signal connect to restriction"); //LCOV_EXCL_LINE
292 /* Deinitialize and quit manager */
295 if (__stc_manager_gdbus_firewall_init(stc) == FALSE) {
296 STC_LOGE("Cannot signal connect to firewall"); //LCOV_EXCL_LINE
297 /* Deinitialize and quit manager */
300 if (__stc_manager_gdbus_manager_init(stc) == FALSE) {
301 STC_LOGE("Cannot signal connect to manager"); //LCOV_EXCL_LINE
302 /* Deinitialize and quit manager */
305 g_dbus_object_manager_server_set_connection(stc->obj_mgr,
309 stc_connection_monitor_init(stc);
311 stc_plugin_appstatus_register_state_changed_cb(stc,
312 stc_plugin_procfs_app_status_changed, NULL);
314 __STC_LOG_FUNC_EXIT__;
317 static void __stc_manager_gdbus_on_name_acquired(GDBusConnection *connection,
321 STC_LOGD("name : %s", name);
325 static void __stc_manager_gdbus_on_name_lost(GDBusConnection *connection,
329 STC_LOGD("name : %s", name);
333 void stc_manager_gdbus_init(gpointer stc_data)
335 __STC_LOG_FUNC_ENTER__;
336 stc_s *stc = (stc_s *)stc_data;
338 stc->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
340 G_BUS_NAME_OWNER_FLAGS_NONE,
341 __stc_manager_gdbus_on_bus_acquired,
342 __stc_manager_gdbus_on_name_acquired,
343 __stc_manager_gdbus_on_name_lost,
347 __STC_LOG_FUNC_EXIT__;
350 void stc_manager_gdbus_deinit(gpointer stc_data)
352 __STC_LOG_FUNC_ENTER__;
353 stc_s *stc = (stc_s *)stc_data;
355 stc_plugin_appstatus_deregister_state_changed_cb(stc);
356 stc_connection_monitor_deinit(stc);
358 g_bus_unown_name(stc->gdbus_owner_id);
360 stc->statistics_obj = NULL;
361 stc->restriction_obj = NULL;
362 stc->firewall_obj = NULL;
363 stc->manager_obj = NULL;
364 __STC_LOG_FUNC_EXIT__;
367 GVariant *stc_manager_gdbus_call_sync(GDBusConnection *connection,
368 const char *dest, const char *path,
369 const char *interface_name,
370 const char *method, GVariant *params)
372 GError *error = NULL;
373 GVariant *reply = NULL;
375 if (connection == NULL) {
376 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
377 return reply; //LCOV_EXCL_LINE
380 reply = g_dbus_connection_call_sync(connection,
387 G_DBUS_CALL_FLAGS_NONE,
388 (5 * 1000), /* 5 seconds timeout */
394 STC_LOGE("g_dbus_connection_call_sync() failed" //LCOV_EXCL_LINE
395 " error [%d: %s]", error->code, error->message);
396 g_error_free(error); //LCOV_EXCL_LINE
398 STC_LOGE("g_dbus_connection_call_sync() failed"); //LCOV_EXCL_LINE
407 guint stc_manager_gdbus_subscribe_signal(GDBusConnection *connection,
409 const gchar *interface_name,
411 const gchar *object_path,
413 GDBusSignalFlags flags,
414 GDBusSignalCallback callback,
416 GDestroyNotify user_data_free_func)
418 if (connection == NULL) {
419 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
420 return 0; //LCOV_EXCL_LINE
423 return g_dbus_connection_signal_subscribe(connection,
429 G_DBUS_SIGNAL_FLAGS_NONE,
432 user_data_free_func);
435 void stc_manager_gdbus_unsubscribe_signal(GDBusConnection *connection,
436 guint subscription_id)
438 if (connection == NULL) {
439 STC_LOGE("Failed to get GDBusconnection"); //LCOV_EXCL_LINE
440 return; //LCOV_EXCL_LINE
443 g_dbus_connection_signal_unsubscribe(connection, subscription_id);
446 void stc_manager_gdbus_dict_foreach(GVariantIter *iter, dbus_dict_cb cb,
449 __STC_LOG_FUNC_ENTER__;
452 GVariant *value = NULL;
455 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
456 return; //LCOV_EXCL_LINE
459 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
460 /* DEBUG_GDBUS_KEY_VALUE(key, value); */
462 cb(key, value, user_data);
465 __STC_LOG_FUNC_EXIT__;
468 gboolean stc_manager_dbus_emit_signal(GDBusConnection *connection,
469 const gchar *object_path,
470 const gchar *interface_name,
471 const gchar *signal_name,
472 GVariant *parameters)
475 GError *error = NULL;
477 if (connection == NULL) {
478 STC_LOGE("GDBusconnection is NULL"); //LCOV_EXCL_LINE
482 DEBUG_GDBUS_VARIANT("Signal params: ", parameters);
484 rv = g_dbus_connection_emit_signal(connection,
492 STC_LOGE("Failed to emit signal [%s] interface [%s] Error [%s]", //LCOV_EXCL_LINE
493 signal_name, interface_name, error->message);
494 g_error_free(error); //LCOV_EXCL_LINE
496 STC_LOGD("[%s] signal sent on [%s] interface", signal_name,
503 gboolean handle_manager_stop(StcManager *object,
504 GDBusMethodInvocation *invocation)
506 __STC_LOG_FUNC_ENTER__;
507 GVariant *return_parameters = NULL;
509 STC_LOGI("stc manager stop");
511 return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
513 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
514 STC_DBUS_REPLY(invocation, return_parameters);
518 __STC_LOG_FUNC_EXIT__;
522 gboolean handle_manager_commit_iptables(StcManager *object,
523 GDBusMethodInvocation *invocation,
527 __STC_LOG_FUNC_ENTER__;
528 GVariant *return_parameters = NULL;
529 int ret = STC_ERROR_NONE;
531 char *err_str = NULL;
532 char cmd[STC_CMD_SIZE] = { 0, };
534 if (option == NULL) {
535 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
536 STC_ERROR_INVALID_PARAMETER);
537 __STC_LOG_FUNC_EXIT__;
541 STC_LOGD("[%s]", option);
542 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IPTABLES, option);
544 ret = stc_commit_iptables(cmd, &err_num, &err_str);
546 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
548 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
549 STC_DBUS_REPLY(invocation, return_parameters);
551 __STC_LOG_FUNC_EXIT__;
555 gboolean handle_manager_commit_ip6tables(StcManager *object,
556 GDBusMethodInvocation *invocation,
560 __STC_LOG_FUNC_ENTER__;
561 GVariant *return_parameters = NULL;
562 int ret = STC_ERROR_NONE;
564 char *err_str = NULL;
565 char cmd[STC_CMD_SIZE] = { 0, };
567 if (option == NULL) {
568 STC_MANAGER_DBUS_REPLY_ERROR(invocation,
569 STC_ERROR_INVALID_PARAMETER);
570 __STC_LOG_FUNC_EXIT__;
574 STC_LOGD("[%s]", option);
575 g_snprintf(cmd, STC_CMD_SIZE, "%s %s", STC_IP6TABLES, option);
577 ret = stc_commit_iptables(cmd, &err_num, &err_str);
579 return_parameters = g_variant_new("(iis)", ret, err_num, err_str);
581 DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
582 STC_DBUS_REPLY(invocation, return_parameters);
584 __STC_LOG_FUNC_EXIT__;