Fixed build warning for mismatch
[platform/core/connectivity/stc-iptables.git] / src / stc-iptables-util.c
1 /*
2  *  Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License version 2 as
6  *  published by the Free Software Foundation.
7  *
8  *  This program is distributed in the hope that it will be useful,
9  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  *  GNU General Public License for more details.
12  *
13  *  You should have received a copy of the GNU General Public License
14  *  along with this program; if not, write to the Free Software
15  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
16  */
17
18 #include <string.h>
19
20 #include "stc-iptables.h"
21 #include "stc-iptables-util.h"
22 #include "helper-iptables.h"
23 #include "helper-ip6tables.h"
24
25 #define BUF_SIZE_FOR_IP 64
26
27 #define RULE_CHAIN      "chain"
28 #define RULE_DIRECTION  "direction"
29 #define RULE_IFNAME     "ifname"
30 #define RULE_CGROUP     "cgroup"
31 #define RULE_NFACCT     "nfacct"
32 #define RULE_PROTOCOL   "protocol"
33 #define RULE_TARGET     "target"
34 #define RULE_TARGETTYPE "target_type"
35
36 #define RULE_FAMILY     "family"
37 #define RULE_SIPTYPE    "s_ip_type"
38 #define RULE_SIP1       "s_ip1"
39 #define RULE_SIP2       "s_ip2"
40 #define RULE_DIPTYPE    "d_ip_type"
41 #define RULE_DIP1       "d_ip1"
42 #define RULE_DIP2       "d_ip2"
43 #define RULE_SPORTTYPE  "s_port_type"
44 #define RULE_SPORT1     "s_port1"
45 #define RULE_SPORT2     "s_port2"
46 #define RULE_DPORTTYPE  "d_port_type"
47 #define RULE_DPORT1     "d_port1"
48 #define RULE_DPORT2     "d_port2"
49
50 #define RULE_LOG_LEVEL       "log_level"
51 #define RULE_LOG_PREFIX      "log_prefix"
52 #define RULE_NFLOG_GROUP     "nflog_group"
53 #define RULE_NFLOG_PREFIX    "nflog_prefix"
54 #define RULE_NFLOG_RANGE     "nflog_range"
55 #define RULE_NFLOG_THRESHOLD "nflog_threshold"
56
57 #define STC_IPTABLES_DBUS_ERROR_NAME "net.stc.iptables.Error.Failed"
58
59 #define STC_IPTABLES_DBUS_REPLY(invocation, parameters) \
60                 g_dbus_method_invocation_return_value((invocation), parameters);
61
62 #define STC_IPTABLES_DBUS_REPLY_ERROR(invocation, err_num) \
63                 g_dbus_method_invocation_return_dbus_error((invocation), \
64                                                            STC_IPTABLES_DBUS_ERROR_NAME, \
65                                                            stc_iptables_err_strs[-(err_num)])
66
67 static const gchar *stc_iptables_err_strs[] = {
68                 "ERROR_NONE",
69                 "NOT_PERMITTED",
70                 "OUT_OF_MEMORY",
71                 "PERMISSION_DENIED",
72                 "INVALID_OPERATION",
73                 "INVALID_PARAMETER",
74                 "OPERATION_FAILED"
75         };
76
77 void __stc_extract_rule(const char *key, GVariant *value,
78                                void *user_data)
79 {
80         iptables_rule_s *rule = (iptables_rule_s *)user_data;
81         if (rule == NULL)
82                 return;
83
84         if (!g_strcmp0(key, RULE_CHAIN)) {
85                 gsize len = 0;
86                 rule->chain = g_variant_dup_string(value, &len);
87                 STC_LOGD("%s: [%s]", RULE_CHAIN, rule->chain);
88
89         } else if (!g_strcmp0(key, RULE_DIRECTION)) {
90                 rule->direction = g_variant_get_uint16(value);
91                 STC_LOGD("%s: [%u]", RULE_DIRECTION, rule->direction);
92
93         } else if (!g_strcmp0(key, RULE_SIPTYPE)) {
94                 rule->s_ip_type = g_variant_get_uint16(value);
95                 STC_LOGD("%s: [%u]", RULE_SIPTYPE, rule->s_ip_type);
96
97         } else if (!g_strcmp0(key, RULE_DIPTYPE)) {
98                 rule->d_ip_type = g_variant_get_uint16(value);
99                 STC_LOGD("%s: [%u]", RULE_DIPTYPE, rule->d_ip_type);
100
101         } else if (!g_strcmp0(key, RULE_SPORTTYPE)) {
102                 rule->s_port_type = g_variant_get_uint16(value);
103                 STC_LOGD("%s: [%u]", RULE_SPORTTYPE, rule->s_port_type);
104
105         } else if (!g_strcmp0(key, RULE_DPORTTYPE)) {
106                 rule->d_port_type = g_variant_get_uint16(value);
107                 STC_LOGD("%s: [%u]", RULE_DPORTTYPE, rule->d_port_type);
108
109         } else if (!g_strcmp0(key, RULE_SIP1)) {
110                 if (rule->s_ip_type != IPTABLES_IP_NONE) {
111                         rule->s_ip1.s_addr = g_variant_get_uint32(value);
112                         STC_LOGD("%s: [%08x]", RULE_SIP1, rule->s_ip1.s_addr);
113                 }
114
115         } else if (!g_strcmp0(key, RULE_SIP2)) {
116                 if (rule->s_ip_type != IPTABLES_IP_NONE) {
117                         rule->s_ip2.s_addr = g_variant_get_uint32(value);
118                         STC_LOGD("%s: [%08x]", RULE_SIP2, rule->s_ip2.s_addr);
119                 }
120
121         } else if (!g_strcmp0(key, RULE_DIP1)) {
122                 if (rule->d_ip_type != IPTABLES_IP_NONE) {
123                         rule->d_ip1.s_addr = g_variant_get_uint32(value);
124                         STC_LOGD("%s: [%08x]", RULE_DIP1, rule->d_ip1.s_addr);
125                 }
126
127         } else if (!g_strcmp0(key, RULE_DIP2)) {
128                 if (rule->d_ip_type != IPTABLES_IP_NONE) {
129                         rule->d_ip2.s_addr = g_variant_get_uint32(value);
130                         STC_LOGD("%s: [%08x]", RULE_DIP2, rule->d_ip2.s_addr);
131                 }
132
133         } else if (!g_strcmp0(key, RULE_SPORT1)) {
134                 if (rule->s_port_type != IPTABLES_PORT_NONE) {
135                         rule->s_port1 = g_variant_get_uint32(value);
136                         STC_LOGD("%s: [%04x]", RULE_SPORT1, rule->s_port1);
137                 }
138
139         } else if (!g_strcmp0(key, RULE_SPORT2)) {
140                 if (rule->s_port_type != IPTABLES_PORT_NONE) {
141                         rule->s_port2 = g_variant_get_uint32(value);
142                         STC_LOGD("%s: [%04x]", RULE_SPORT2, rule->s_port2);
143                 }
144
145         } else if (!g_strcmp0(key, RULE_DPORT1)) {
146                 if (rule->d_port_type != IPTABLES_PORT_NONE) {
147                         rule->d_port1 = g_variant_get_uint32(value);
148                         STC_LOGD("%s: [%04x]", RULE_DPORT1, rule->d_port1);
149                 }
150
151         } else if (!g_strcmp0(key, RULE_DPORT2)) {
152                 if (rule->d_port_type != IPTABLES_PORT_NONE) {
153                         rule->d_port2 = g_variant_get_uint32(value);
154                         STC_LOGD("%s: [%04x]", RULE_DPORT2, rule->d_port2);
155                 }
156
157         } else if (!g_strcmp0(key, RULE_IFNAME)) {
158                 if (rule->direction != IPTABLES_DIRECTION_NONE) {
159                         gsize len = 0;
160                         rule->ifname = g_variant_dup_string(value, &len);
161                         STC_LOGD("%s: [%s]", RULE_IFNAME, rule->ifname);
162                 }
163
164         } else if (!g_strcmp0(key, RULE_CGROUP)) {
165                 rule->classid = g_variant_get_uint32(value);
166                 STC_LOGD("%s: [%u]", RULE_CGROUP, rule->classid);
167
168         } else if (!g_strcmp0(key, RULE_NFACCT)) {
169                 gsize len = 0;
170                 rule->nfacct_name = g_variant_dup_string(value, &len);
171                 STC_LOGD("%s: [%s]", RULE_NFACCT, rule->nfacct_name);
172
173         } else if (!g_strcmp0(key, RULE_PROTOCOL)) {
174                 rule->protocol = g_variant_get_uint16(value);
175                 STC_LOGD("%s: [%u]", RULE_PROTOCOL, rule->protocol);
176
177         } else if (!g_strcmp0(key, RULE_TARGET)) {
178                 gsize len = 0;
179                 rule->target = g_variant_dup_string(value, &len);
180                 STC_LOGD("%s: [%s]", RULE_TARGET, rule->target);
181
182         } else if (!g_strcmp0(key, RULE_TARGETTYPE)) {
183                 rule->target_type = g_variant_get_uint16(value);
184                 STC_LOGD("%s: [%u]", RULE_TARGETTYPE, rule->target_type);
185
186         } else if (!g_strcmp0(key, RULE_LOG_LEVEL)) {
187                 if (rule->target_type == IPTABLES_ACTION_LOG) {
188                         rule->log_level = g_variant_get_uint16(value);
189                         STC_LOGD("%s: [%u]", RULE_LOG_LEVEL, rule->log_level);
190                 }
191
192         } else if (!g_strcmp0(key, RULE_LOG_PREFIX)) {
193                 if (rule->target_type == IPTABLES_ACTION_LOG) {
194                         gsize len = 0;
195                         rule->log_prefix = g_variant_dup_string(value, &len);
196                         STC_LOGD("%s: [%s]", RULE_LOG_PREFIX, rule->log_prefix);
197                 }
198
199         } else if (!g_strcmp0(key, RULE_NFLOG_GROUP)) {
200                 if (rule->target_type == IPTABLES_ACTION_NFLOG) {
201                         rule->nflog_group = g_variant_get_uint16(value);
202                         STC_LOGD("%s: [%u]", RULE_NFLOG_GROUP, rule->nflog_group);
203                 }
204
205         } else if (!g_strcmp0(key, RULE_NFLOG_PREFIX)) {
206                 if (rule->target_type == IPTABLES_ACTION_NFLOG) {
207                         gsize len = 0;
208                         rule->nflog_prefix = g_variant_dup_string(value, &len);
209                         STC_LOGD("%s: [%s]", RULE_NFLOG_PREFIX, rule->nflog_prefix);
210                 }
211
212         } else if (!g_strcmp0(key, RULE_NFLOG_RANGE)) {
213                 if (rule->target_type == IPTABLES_ACTION_NFLOG) {
214                         rule->nflog_range = g_variant_get_uint16(value);
215                         STC_LOGD("%s: [%u]", RULE_NFLOG_RANGE, rule->nflog_range);
216                 }
217
218         } else if (!g_strcmp0(key, RULE_NFLOG_THRESHOLD)) {
219                 if (rule->target_type == IPTABLES_ACTION_NFLOG) {
220                         rule->nflog_threshold = g_variant_get_uint16(value);
221                         STC_LOGD("%s: [%u]", RULE_NFLOG_THRESHOLD, rule->nflog_threshold);
222                 }
223
224         } else {
225                 STC_LOGD("Unknown rule [%s]", key); //LCOV_EXCL_LINE
226         }
227 }
228
229 void __stc_extract_6_rule(const char *key, GVariant *value,
230                                void *user_data)
231 {
232         ip6tables_rule_s *rule = (ip6tables_rule_s *)user_data;
233         if (rule == NULL)
234                 return;
235
236         if (!g_strcmp0(key, RULE_CHAIN)) {
237                 gsize len = 0;
238                 rule->chain = g_variant_dup_string(value, &len);
239                 STC_LOGD("%s: [%s]", RULE_CHAIN, rule->chain);
240
241         } else if (!g_strcmp0(key, RULE_DIRECTION)) {
242                 rule->direction = g_variant_get_uint16(value);
243                 STC_LOGD("%s: [%u]", RULE_DIRECTION, rule->direction);
244
245         } else if (!g_strcmp0(key, RULE_SIPTYPE)) {
246                 rule->s_ip_type = g_variant_get_uint16(value);
247                 STC_LOGD("%s: [%u]", RULE_SIPTYPE, rule->s_ip_type);
248
249         } else if (!g_strcmp0(key, RULE_DIPTYPE)) {
250                 rule->d_ip_type = g_variant_get_uint16(value);
251                 STC_LOGD("%s: [%u]", RULE_DIPTYPE, rule->d_ip_type);
252
253         } else if (!g_strcmp0(key, RULE_SPORTTYPE)) {
254                 rule->s_port_type = g_variant_get_uint16(value);
255                 STC_LOGD("%s: [%u]", RULE_SPORTTYPE, rule->s_port_type);
256
257         } else if (!g_strcmp0(key, RULE_DPORTTYPE)) {
258                 rule->d_port_type = g_variant_get_uint16(value);
259                 STC_LOGD("%s: [%u]", RULE_DPORTTYPE, rule->d_port_type);
260
261         } else if (!g_strcmp0(key, RULE_SIP1)) {
262                 if (rule->s_ip_type != IP6TABLES_IP_NONE) {
263                         gsize len = 0;
264                         char *str = g_variant_dup_string(value, &len);
265                         sscanf(str, "%08x:%08x:%08x:%08x",
266                                 &(rule->s_ip1.s6_addr32[0]), &(rule->s_ip1.s6_addr32[1]),
267                                 &(rule->s_ip1.s6_addr32[2]), &(rule->s_ip1.s6_addr32[3]));
268                         STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP1,
269                                 rule->s_ip1.s6_addr32[0], rule->s_ip1.s6_addr32[1],
270                                 rule->s_ip1.s6_addr32[2], rule->s_ip1.s6_addr32[3]);
271                         FREE(str);
272                 }
273
274         } else if (!g_strcmp0(key, RULE_SIP2)) {
275                 if (rule->s_ip_type != IP6TABLES_IP_NONE) {
276                         gsize len = 0;
277                         char *str = g_variant_dup_string(value, &len);
278                         sscanf(str, "%08x:%08x:%08x:%08x",
279                                 &(rule->s_ip2.s6_addr32[0]), &(rule->s_ip2.s6_addr32[1]),
280                                 &(rule->s_ip2.s6_addr32[2]), &(rule->s_ip2.s6_addr32[3]));
281                         STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP2,
282                                 rule->s_ip2.s6_addr32[0], rule->s_ip2.s6_addr32[1],
283                                 rule->s_ip2.s6_addr32[2], rule->s_ip2.s6_addr32[3]);
284                         FREE(str);
285                 }
286
287         } else if (!g_strcmp0(key, RULE_DIP1)) {
288                 if (rule->d_ip_type != IP6TABLES_IP_NONE) {
289                         gsize len = 0;
290                         char *str = g_variant_dup_string(value, &len);
291                         sscanf(str, "%08x:%08x:%08x:%08x",
292                                 &(rule->d_ip1.s6_addr32[0]), &(rule->d_ip1.s6_addr32[1]),
293                                 &(rule->d_ip1.s6_addr32[2]), &(rule->d_ip1.s6_addr32[3]));
294                         STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP1,
295                                 rule->d_ip1.s6_addr32[0], rule->d_ip1.s6_addr32[1],
296                                 rule->d_ip1.s6_addr32[2], rule->d_ip1.s6_addr32[3]);
297                         FREE(str);
298                 }
299
300         } else if (!g_strcmp0(key, RULE_DIP2)) {
301                 if (rule->d_ip_type != IP6TABLES_IP_NONE) {
302                         gsize len = 0;
303                         char *str = g_variant_dup_string(value, &len);
304                         sscanf(str, "%08x:%08x:%08x:%08x",
305                                 &(rule->d_ip2.s6_addr32[0]), &(rule->d_ip2.s6_addr32[1]),
306                                 &(rule->d_ip2.s6_addr32[2]), &(rule->d_ip2.s6_addr32[3]));
307                         STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP2,
308                                 rule->d_ip2.s6_addr32[0], rule->d_ip2.s6_addr32[1],
309                                 rule->d_ip2.s6_addr32[2], rule->d_ip2.s6_addr32[3]);
310                         FREE(str);
311                 }
312
313         } else if (!g_strcmp0(key, RULE_SPORT1)) {
314                 if (rule->s_port_type != IP6TABLES_PORT_NONE) {
315                         rule->s_port1 = g_variant_get_uint32(value);
316                         STC_LOGD("%s: [%04x]", RULE_SPORT1, rule->s_port1);
317                 }
318
319         } else if (!g_strcmp0(key, RULE_SPORT2)) {
320                 if (rule->s_port_type != IP6TABLES_PORT_NONE) {
321                         rule->s_port2 = g_variant_get_uint32(value);
322                         STC_LOGD("%s: [%04x]", RULE_SPORT2, rule->s_port2);
323                 }
324
325         } else if (!g_strcmp0(key, RULE_DPORT1)) {
326                 if (rule->d_port_type != IP6TABLES_PORT_NONE) {
327                         rule->d_port1 = g_variant_get_uint32(value);
328                         STC_LOGD("%s: [%04x]", RULE_DPORT1, rule->d_port1);
329                 }
330
331         } else if (!g_strcmp0(key, RULE_DPORT2)) {
332                 if (rule->d_port_type != IP6TABLES_PORT_NONE) {
333                         rule->d_port2 = g_variant_get_uint32(value);
334                         STC_LOGD("%s: [%04x]", RULE_DPORT2, rule->d_port2);
335                 }
336
337         } else if (!g_strcmp0(key, RULE_IFNAME)) {
338                 if (rule->direction != IP6TABLES_DIRECTION_NONE) {
339                         gsize len = 0;
340                         rule->ifname = g_variant_dup_string(value, &len);
341                         STC_LOGD("%s: [%s]", RULE_IFNAME, rule->ifname);
342                 }
343
344         } else if (!g_strcmp0(key, RULE_CGROUP)) {
345                 rule->classid = g_variant_get_uint32(value);
346                 STC_LOGD("%s: [%u]", RULE_CGROUP, rule->classid);
347
348         } else if (!g_strcmp0(key, RULE_NFACCT)) {
349                 gsize len = 0;
350                 rule->nfacct_name = g_variant_dup_string(value, &len);
351                 STC_LOGD("%s: [%s]", RULE_NFACCT, rule->nfacct_name);
352
353         } else if (!g_strcmp0(key, RULE_PROTOCOL)) {
354                 rule->protocol = g_variant_get_uint16(value);
355                 STC_LOGD("%s: [%u]", RULE_PROTOCOL, rule->protocol);
356
357         } else if (!g_strcmp0(key, RULE_TARGET)) {
358                 gsize len = 0;
359                 rule->target = g_variant_dup_string(value, &len);
360                 STC_LOGD("%s: [%s]", RULE_TARGET, rule->target);
361
362         } else if (!g_strcmp0(key, RULE_TARGETTYPE)) {
363                 rule->target_type = g_variant_get_uint16(value);
364                 STC_LOGD("%s: [%u]", RULE_TARGETTYPE, rule->target_type);
365
366         } else if (!g_strcmp0(key, RULE_LOG_LEVEL)) {
367                 if (rule->target_type == IP6TABLES_ACTION_LOG) {
368                         rule->log_level = g_variant_get_uint16(value);
369                         STC_LOGD("%s: [%u]", RULE_LOG_LEVEL, rule->log_level);
370                 }
371
372         } else if (!g_strcmp0(key, RULE_LOG_PREFIX)) {
373                 if (rule->target_type == IP6TABLES_ACTION_LOG) {
374                         gsize len = 0;
375                         rule->log_prefix = g_variant_dup_string(value, &len);
376                         STC_LOGD("%s: [%s]", RULE_LOG_PREFIX, rule->log_prefix);
377                 }
378
379         } else if (!g_strcmp0(key, RULE_NFLOG_GROUP)) {
380                 if (rule->target_type == IP6TABLES_ACTION_NFLOG) {
381                         rule->nflog_group = g_variant_get_uint16(value);
382                         STC_LOGD("%s: [%u]", RULE_NFLOG_GROUP, rule->nflog_group);
383                 }
384
385         } else if (!g_strcmp0(key, RULE_NFLOG_PREFIX)) {
386                 if (rule->target_type == IP6TABLES_ACTION_NFLOG) {
387                         gsize len = 0;
388                         rule->nflog_prefix = g_variant_dup_string(value, &len);
389                         STC_LOGD("%s: [%s]", RULE_NFLOG_PREFIX, rule->nflog_prefix);
390                 }
391
392         } else if (!g_strcmp0(key, RULE_NFLOG_RANGE)) {
393                 if (rule->target_type == IP6TABLES_ACTION_NFLOG) {
394                         rule->nflog_range = g_variant_get_uint16(value);
395                         STC_LOGD("%s: [%u]", RULE_NFLOG_RANGE, rule->nflog_range);
396                 }
397
398         } else if (!g_strcmp0(key, RULE_NFLOG_THRESHOLD)) {
399                 if (rule->target_type == IP6TABLES_ACTION_NFLOG) {
400                         rule->nflog_threshold = g_variant_get_uint16(value);
401                         STC_LOGD("%s: [%u]", RULE_NFLOG_THRESHOLD, rule->nflog_threshold);
402                 }
403
404         } else {
405                 STC_LOGD("Unknown rule [%s]", key); //LCOV_EXCL_LINE
406         }
407 }
408
409 static void __free_rule(iptables_rule_s *rule)
410 {
411         FREE(rule->chain);
412         FREE(rule->ifname);
413         FREE(rule->nfacct_name);
414         FREE(rule->target);
415         FREE(rule->log_prefix);
416         FREE(rule->nflog_prefix);
417         FREE(rule);
418 }
419
420 static void __free_6_rule(ip6tables_rule_s *rule)
421 {
422         FREE(rule->chain);
423         FREE(rule->ifname);
424         FREE(rule->nfacct_name);
425         FREE(rule->target);
426         FREE(rule->log_prefix);
427         FREE(rule->nflog_prefix);
428         FREE(rule);
429 }
430
431 gboolean handle_iptables_stop(StcManager *object,
432                                    GDBusMethodInvocation *invocation)
433 {
434         __STC_LOG_FUNC_ENTER__;
435         GVariant *return_parameters = NULL;
436
437         STC_LOGI("stc manager stop");
438
439         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
440
441         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
442         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
443
444         stc_stop_iptables();
445
446         __STC_LOG_FUNC_EXIT__;
447         return TRUE;
448 }
449
450 gboolean handle_iptables_add_rule(StcRule *object,
451                                GDBusMethodInvocation *invocation,
452                                GVariant *rules,
453                                void *user_data)
454 {
455         __STC_LOG_FUNC_ENTER__;
456         stc_error_e ret = STC_ERROR_NONE;
457         GVariant *return_parameters = NULL;
458
459         if (rules != NULL) {
460                 GVariantIter *iter = NULL;
461
462                 g_variant_get(rules, "a{sv}", &iter);
463
464                 iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
465                 if (rule != NULL) {
466                         memset(rule, 0, sizeof(iptables_rule_s));
467
468                         stc_iptables_gdbus_dict_foreach(iter,
469                                                         __stc_extract_rule,
470                                                         rule);
471
472                         ret = iptables_add_rule(rule);
473                         if (ret != STC_ERROR_NONE) {
474                                  //LCOV_EXCL_START
475                                 STC_LOGE("Failed add rule [%s:%d:%s:%d:%s:%s]", rule->chain,
476                                          rule->direction, rule->ifname, rule->classid,
477                                          rule->nfacct_name, rule->target);
478
479                                 __free_rule(rule);
480                                 g_variant_iter_free(iter);
481
482                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
483                                 __STC_LOG_FUNC_EXIT__;
484                                 return TRUE;
485                                  //LCOV_EXCL_STOP
486                         }
487
488                         __free_rule(rule);
489                 }
490
491                 g_variant_iter_free(iter);
492         } else {
493                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
494                                               STC_ERROR_INVALID_PARAMETER);
495                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
496                 return TRUE; //LCOV_EXCL_LINE
497         }
498
499         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
500
501         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
502         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
503
504         __STC_LOG_FUNC_EXIT__;
505         return TRUE;
506 }
507
508 gboolean handle_iptables_insert_rule(StcRule *object,
509                                GDBusMethodInvocation *invocation,
510                                GVariant *rules,
511                                void *user_data)
512 {
513         __STC_LOG_FUNC_ENTER__;
514         stc_error_e ret = STC_ERROR_NONE;
515         GVariant *return_parameters = NULL;
516
517         if (rules != NULL) {
518                 GVariantIter *iter = NULL;
519
520                 g_variant_get(rules, "a{sv}", &iter);
521
522                 iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
523                 if (rule != NULL) {
524                         memset(rule, 0, sizeof(iptables_rule_s));
525
526                         stc_iptables_gdbus_dict_foreach(iter,
527                                                         __stc_extract_rule,
528                                                         rule);
529
530                         ret = iptables_insert_rule(rule);
531                         if (ret != STC_ERROR_NONE) {
532                                  //LCOV_EXCL_START
533                                 STC_LOGE("Failed insert rule [%s:%d:%s:%d:%s:%s]", rule->chain,
534                                          rule->direction, rule->ifname, rule->classid,
535                                          rule->nfacct_name, rule->target);
536
537                                 __free_rule(rule);
538                                 g_variant_iter_free(iter);
539
540                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
541                                 __STC_LOG_FUNC_EXIT__;
542                                 return TRUE;
543                                  //LCOV_EXCL_STOP
544                         }
545
546                         __free_rule(rule);
547                 }
548
549                 g_variant_iter_free(iter);
550         } else {
551                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
552                                               STC_ERROR_INVALID_PARAMETER);
553                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
554                 return TRUE; //LCOV_EXCL_LINE
555         }
556
557         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
558
559         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
560         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
561
562         __STC_LOG_FUNC_EXIT__;
563         return TRUE;
564 }
565
566 gboolean handle_iptables_remove_rule(StcRule *object,
567                                GDBusMethodInvocation *invocation,
568                                GVariant *rules,
569                                void *user_data)
570 {
571         __STC_LOG_FUNC_ENTER__;
572         stc_error_e ret = STC_ERROR_NONE;
573         GVariant *return_parameters = NULL;
574
575         if (rules != NULL) {
576                 GVariantIter *iter = NULL;
577                 g_variant_get(rules, "a{sv}", &iter);
578
579                 iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
580                 if (rule != NULL) {
581                         memset(rule, 0, sizeof(iptables_rule_s));
582
583                         stc_iptables_gdbus_dict_foreach(iter,
584                                                         __stc_extract_rule,
585                                                         rule);
586
587                         ret = iptables_remove_rule(rule);
588                         if (ret != STC_ERROR_NONE) {
589                                  //LCOV_EXCL_START
590                                 STC_LOGE("Failed remove rule [%s:%d:%s:%d:%s:%s]", rule->chain,
591                                          rule->direction, rule->ifname, rule->classid,
592                                          rule->nfacct_name, rule->target);
593
594                                 __free_rule(rule);
595                                 g_variant_iter_free(iter);
596
597                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
598                                 __STC_LOG_FUNC_EXIT__;
599                                 return TRUE;
600                                  //LCOV_EXCL_STOP
601                         }
602
603                         __free_rule(rule);
604                 }
605
606                 g_variant_iter_free(iter);
607         } else {
608                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
609                                               STC_ERROR_INVALID_PARAMETER);
610                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
611                 return TRUE; //LCOV_EXCL_LINE
612         }
613
614         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
615
616         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
617         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
618
619         __STC_LOG_FUNC_EXIT__;
620         return TRUE;
621 }
622
623 gboolean handle_iptables_add_chain(StcChain *object,
624                                    GDBusMethodInvocation *invocation,
625                                    const gchar *chain,
626                                    void *user_data)
627 {
628         __STC_LOG_FUNC_ENTER__;
629         stc_error_e ret = STC_ERROR_NONE;
630         GVariant *return_parameters = NULL;
631
632         ret = iptables_add_chain(chain);
633         if (ret < STC_ERROR_NONE) {
634                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
635                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
636                 return TRUE; //LCOV_EXCL_LINE
637         }
638
639         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
640
641         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
642         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
643
644         __STC_LOG_FUNC_EXIT__;
645         return TRUE;
646 }
647
648 gboolean handle_iptables_remove_chain(StcChain *object,
649                                GDBusMethodInvocation *invocation,
650                                const gchar *chain,
651                                void *user_data)
652 {
653         __STC_LOG_FUNC_ENTER__;
654         stc_error_e ret = STC_ERROR_NONE;
655         GVariant *return_parameters = NULL;
656
657         ret = iptables_remove_chain(chain);
658         if (ret < STC_ERROR_NONE) {
659                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
660                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
661                 return TRUE; //LCOV_EXCL_LINE
662         }
663
664         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
665
666         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
667         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
668
669         __STC_LOG_FUNC_EXIT__;
670         return TRUE;
671 }
672
673 gboolean handle_iptables_flush_chain(StcChain *object,
674                                GDBusMethodInvocation *invocation,
675                                const gchar *chain,
676                                void *user_data)
677 {
678         __STC_LOG_FUNC_ENTER__;
679         stc_error_e ret = STC_ERROR_NONE;
680         GVariant *return_parameters = NULL;
681
682         ret = iptables_flush_chain(chain);
683         if (ret < STC_ERROR_NONE) {
684                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
685                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
686                 return TRUE; //LCOV_EXCL_LINE
687         }
688
689         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
690
691         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
692         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
693
694         __STC_LOG_FUNC_EXIT__;
695         return TRUE;
696 }
697
698 gboolean handle_ip6tables_add_rule(StcRule *object,
699                                GDBusMethodInvocation *invocation,
700                                GVariant *rules,
701                                void *user_data)
702 {
703         __STC_LOG_FUNC_ENTER__;
704         stc_error_e ret = STC_ERROR_NONE;
705         GVariant *return_parameters = NULL;
706
707         if (rules != NULL) {
708                 GVariantIter *iter = NULL;
709
710                 g_variant_get(rules, "a{sv}", &iter);
711
712                 ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
713                 if (rule != NULL) {
714                         memset(rule, 0, sizeof(ip6tables_rule_s));
715
716                         stc_iptables_gdbus_dict_foreach(iter,
717                                                         __stc_extract_6_rule,
718                                                         rule);
719
720                         ret = ip6tables_add_rule(rule);
721                         if (ret != STC_ERROR_NONE) {
722                                  //LCOV_EXCL_START
723                                 STC_LOGE("Failed add rule [%s:%d:%s:%d:%s:%s]", rule->chain,
724                                          rule->direction, rule->ifname, rule->classid,
725                                          rule->nfacct_name, rule->target);
726
727                                 __free_6_rule(rule);
728                                 g_variant_iter_free(iter);
729
730                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
731                                 __STC_LOG_FUNC_EXIT__;
732                                 return TRUE;
733                                  //LCOV_EXCL_STOP
734                         }
735
736                         __free_6_rule(rule);
737                 }
738
739                 g_variant_iter_free(iter);
740         } else {
741                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
742                                               STC_ERROR_INVALID_PARAMETER);
743                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
744                 return TRUE; //LCOV_EXCL_LINE
745         }
746
747         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
748
749         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
750         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
751
752         __STC_LOG_FUNC_EXIT__;
753         return TRUE;
754 }
755
756 gboolean handle_ip6tables_insert_rule(StcRule *object,
757                                GDBusMethodInvocation *invocation,
758                                GVariant *rules,
759                                void *user_data)
760 {
761         __STC_LOG_FUNC_ENTER__;
762         stc_error_e ret = STC_ERROR_NONE;
763         GVariant *return_parameters = NULL;
764
765         if (rules != NULL) {
766                 GVariantIter *iter = NULL;
767
768                 g_variant_get(rules, "a{sv}", &iter);
769
770                 ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
771                 if (rule != NULL) {
772                         memset(rule, 0, sizeof(ip6tables_rule_s));
773
774                         stc_iptables_gdbus_dict_foreach(iter,
775                                                         __stc_extract_6_rule,
776                                                         rule);
777
778                         ret = ip6tables_insert_rule(rule);
779                         if (ret != STC_ERROR_NONE) {
780                                  //LCOV_EXCL_START
781                                 STC_LOGE("Failed insert rule [%s:%d:%s:%d:%s:%s]", rule->chain,
782                                          rule->direction, rule->ifname, rule->classid,
783                                          rule->nfacct_name, rule->target);
784
785                                 __free_6_rule(rule);
786                                 g_variant_iter_free(iter);
787
788                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
789                                 __STC_LOG_FUNC_EXIT__;
790                                 return TRUE;
791                                  //LCOV_EXCL_STOP
792                         }
793
794                         __free_6_rule(rule);
795                 }
796
797                 g_variant_iter_free(iter);
798         } else {
799                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
800                                               STC_ERROR_INVALID_PARAMETER);
801                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
802                 return TRUE; //LCOV_EXCL_LINE
803         }
804
805         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
806
807         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
808         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
809
810         __STC_LOG_FUNC_EXIT__;
811         return TRUE;
812 }
813
814 gboolean handle_ip6tables_remove_rule(StcRule *object,
815                                GDBusMethodInvocation *invocation,
816                                GVariant *rules,
817                                void *user_data)
818 {
819         __STC_LOG_FUNC_ENTER__;
820         stc_error_e ret = STC_ERROR_NONE;
821         GVariant *return_parameters = NULL;
822
823         if (rules != NULL) {
824                 GVariantIter *iter = NULL;
825                 g_variant_get(rules, "a{sv}", &iter);
826
827                 ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
828                 if (rule != NULL) {
829                         memset(rule, 0, sizeof(ip6tables_rule_s));
830
831                         stc_iptables_gdbus_dict_foreach(iter,
832                                                         __stc_extract_6_rule,
833                                                         rule);
834
835                         ret = ip6tables_remove_rule(rule);
836                         if (ret != STC_ERROR_NONE) {
837                                  //LCOV_EXCL_START
838                                 STC_LOGE("Failed remove rule [%s:%d:%s:%d:%s:%s]", rule->chain,
839                                          rule->direction, rule->ifname, rule->classid,
840                                          rule->nfacct_name, rule->target);
841
842                                 __free_6_rule(rule);
843                                 g_variant_iter_free(iter);
844
845                                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
846                                 __STC_LOG_FUNC_EXIT__;
847                                 return TRUE;
848                                  //LCOV_EXCL_STOP
849                         }
850
851                         __free_6_rule(rule);
852                 }
853
854                 g_variant_iter_free(iter);
855         } else {
856                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
857                                               STC_ERROR_INVALID_PARAMETER);
858                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
859                 return TRUE; //LCOV_EXCL_LINE
860         }
861
862         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
863
864         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
865         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
866
867         __STC_LOG_FUNC_EXIT__;
868         return TRUE;
869 }
870
871 gboolean handle_ip6tables_add_chain(StcChain *object,
872                                GDBusMethodInvocation *invocation,
873                                const gchar *chain,
874                                void *user_data)
875 {
876         __STC_LOG_FUNC_ENTER__;
877         stc_error_e ret = STC_ERROR_NONE;
878         GVariant *return_parameters = NULL;
879
880         ret = ip6tables_add_chain(chain);
881         if (ret < STC_ERROR_NONE) {
882                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
883                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
884                 return TRUE; //LCOV_EXCL_LINE
885         }
886
887         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
888
889         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
890         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
891
892         __STC_LOG_FUNC_EXIT__;
893         return TRUE;
894 }
895
896 gboolean handle_ip6tables_remove_chain(StcChain *object,
897                                GDBusMethodInvocation *invocation,
898                                const gchar *chain,
899                                void *user_data)
900 {
901         __STC_LOG_FUNC_ENTER__;
902         stc_error_e ret = STC_ERROR_NONE;
903         GVariant *return_parameters = NULL;
904
905         ret = ip6tables_remove_chain(chain);
906         if (ret < STC_ERROR_NONE) {
907                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
908                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
909                 return TRUE; //LCOV_EXCL_LINE
910         }
911
912         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
913
914         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
915         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
916
917         __STC_LOG_FUNC_EXIT__;
918         return TRUE;
919 }
920
921 gboolean handle_ip6tables_flush_chain(StcChain *object,
922                                GDBusMethodInvocation *invocation,
923                                const gchar *chain,
924                                void *user_data)
925 {
926         __STC_LOG_FUNC_ENTER__;
927         stc_error_e ret = STC_ERROR_NONE;
928         GVariant *return_parameters = NULL;
929
930         ret = ip6tables_flush_chain(chain);
931         if (ret < STC_ERROR_NONE) {
932                 STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret); //LCOV_EXCL_LINE
933                 __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
934                 return TRUE; //LCOV_EXCL_LINE
935         }
936
937         return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
938
939         STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
940         STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
941
942         __STC_LOG_FUNC_EXIT__;
943         return TRUE;
944 }