}
} else if (!g_strcmp0(key, RULE_SPORT1)) {
- if (rule->s_ip_type != IPTABLES_IP_NONE) {
+ if (rule->s_port_type != IPTABLES_PORT_NONE) {
rule->s_port1 = g_variant_get_uint32(value);
STC_LOGD("%s: [%04x]", RULE_SPORT1, rule->s_port1);
}
} else if (!g_strcmp0(key, RULE_SPORT2)) {
- if (rule->s_ip_type != IPTABLES_IP_NONE) {
+ if (rule->s_port_type != IPTABLES_PORT_NONE) {
rule->s_port2 = g_variant_get_uint32(value);
STC_LOGD("%s: [%04x]", RULE_SPORT2, rule->s_port2);
}
} else if (!g_strcmp0(key, RULE_DPORT1)) {
- if (rule->d_ip_type != IPTABLES_IP_NONE) {
+ if (rule->d_port_type != IPTABLES_PORT_NONE) {
rule->d_port1 = g_variant_get_uint32(value);
STC_LOGD("%s: [%04x]", RULE_DPORT1, rule->d_port1);
}
} else if (!g_strcmp0(key, RULE_DPORT2)) {
- if (rule->d_ip_type != IPTABLES_IP_NONE) {
+ if (rule->d_port_type != IPTABLES_PORT_NONE) {
rule->d_port2 = g_variant_get_uint32(value);
STC_LOGD("%s: [%04x]", RULE_DPORT2, rule->d_port2);
}
STC_LOGD("%s: [%u]", RULE_DPORTTYPE, rule->d_port_type);
} else if (!g_strcmp0(key, RULE_SIP1)) {
- gsize len = 0;
- char *str = g_variant_dup_string(value, &len);
- sscanf(str, "%08x:%08x:%08x:%08x",
- &(rule->s_ip1.s6_addr32[0]), &(rule->s_ip1.s6_addr32[1]),
- &(rule->s_ip1.s6_addr32[2]), &(rule->s_ip1.s6_addr32[3]));
- STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP1,
- rule->s_ip1.s6_addr32[0], rule->s_ip1.s6_addr32[1],
- rule->s_ip1.s6_addr32[2], rule->s_ip1.s6_addr32[3]);
- FREE(str);
+ if (rule->s_ip_type != IPTABLES_IP_NONE) {
+ gsize len = 0;
+ char *str = g_variant_dup_string(value, &len);
+ sscanf(str, "%08x:%08x:%08x:%08x",
+ &(rule->s_ip1.s6_addr32[0]), &(rule->s_ip1.s6_addr32[1]),
+ &(rule->s_ip1.s6_addr32[2]), &(rule->s_ip1.s6_addr32[3]));
+ STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP1,
+ rule->s_ip1.s6_addr32[0], rule->s_ip1.s6_addr32[1],
+ rule->s_ip1.s6_addr32[2], rule->s_ip1.s6_addr32[3]);
+ FREE(str);
+ }
} else if (!g_strcmp0(key, RULE_SIP2)) {
- gsize len = 0;
- char *str = g_variant_dup_string(value, &len);
- sscanf(str, "%08x:%08x:%08x:%08x",
- &(rule->s_ip2.s6_addr32[0]), &(rule->s_ip2.s6_addr32[1]),
- &(rule->s_ip2.s6_addr32[2]), &(rule->s_ip2.s6_addr32[3]));
- STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP2,
- rule->s_ip2.s6_addr32[0], rule->s_ip2.s6_addr32[1],
- rule->s_ip2.s6_addr32[2], rule->s_ip2.s6_addr32[3]);
- FREE(str);
+ if (rule->s_ip_type != IPTABLES_IP_NONE) {
+ gsize len = 0;
+ char *str = g_variant_dup_string(value, &len);
+ sscanf(str, "%08x:%08x:%08x:%08x",
+ &(rule->s_ip2.s6_addr32[0]), &(rule->s_ip2.s6_addr32[1]),
+ &(rule->s_ip2.s6_addr32[2]), &(rule->s_ip2.s6_addr32[3]));
+ STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_SIP2,
+ rule->s_ip2.s6_addr32[0], rule->s_ip2.s6_addr32[1],
+ rule->s_ip2.s6_addr32[2], rule->s_ip2.s6_addr32[3]);
+ FREE(str);
+ }
} else if (!g_strcmp0(key, RULE_DIP1)) {
- gsize len = 0;
- char *str = g_variant_dup_string(value, &len);
- sscanf(str, "%08x:%08x:%08x:%08x",
- &(rule->d_ip1.s6_addr32[0]), &(rule->d_ip1.s6_addr32[1]),
- &(rule->d_ip1.s6_addr32[2]), &(rule->d_ip1.s6_addr32[3]));
- STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP1,
- rule->d_ip1.s6_addr32[0], rule->d_ip1.s6_addr32[1],
- rule->d_ip1.s6_addr32[2], rule->d_ip1.s6_addr32[3]);
- FREE(str);
+ if (rule->d_ip_type != IPTABLES_IP_NONE) {
+ gsize len = 0;
+ char *str = g_variant_dup_string(value, &len);
+ sscanf(str, "%08x:%08x:%08x:%08x",
+ &(rule->d_ip1.s6_addr32[0]), &(rule->d_ip1.s6_addr32[1]),
+ &(rule->d_ip1.s6_addr32[2]), &(rule->d_ip1.s6_addr32[3]));
+ STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP1,
+ rule->d_ip1.s6_addr32[0], rule->d_ip1.s6_addr32[1],
+ rule->d_ip1.s6_addr32[2], rule->d_ip1.s6_addr32[3]);
+ FREE(str);
+ }
} else if (!g_strcmp0(key, RULE_DIP2)) {
- gsize len = 0;
- char *str = g_variant_dup_string(value, &len);
- sscanf(str, "%08x:%08x:%08x:%08x",
- &(rule->d_ip2.s6_addr32[0]), &(rule->d_ip2.s6_addr32[1]),
- &(rule->d_ip2.s6_addr32[2]), &(rule->d_ip2.s6_addr32[3]));
- STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP2,
- rule->d_ip2.s6_addr32[0], rule->d_ip2.s6_addr32[1],
- rule->d_ip2.s6_addr32[2], rule->d_ip2.s6_addr32[3]);
- FREE(str);
+ if (rule->d_ip_type != IPTABLES_IP_NONE) {
+ gsize len = 0;
+ char *str = g_variant_dup_string(value, &len);
+ sscanf(str, "%08x:%08x:%08x:%08x",
+ &(rule->d_ip2.s6_addr32[0]), &(rule->d_ip2.s6_addr32[1]),
+ &(rule->d_ip2.s6_addr32[2]), &(rule->d_ip2.s6_addr32[3]));
+ STC_LOGD("%s: [%08x:%08x:%08x:%08x]", RULE_DIP2,
+ rule->d_ip2.s6_addr32[0], rule->d_ip2.s6_addr32[1],
+ rule->d_ip2.s6_addr32[2], rule->d_ip2.s6_addr32[3]);
+ FREE(str);
+ }
} else if (!g_strcmp0(key, RULE_SPORT1)) {
- rule->s_port1 = g_variant_get_uint32(value);
- STC_LOGD("%s: [%04x]", RULE_SPORT1, rule->s_port1);
+ if (rule->s_port_type != IPTABLES_PORT_NONE) {
+ rule->s_port1 = g_variant_get_uint32(value);
+ STC_LOGD("%s: [%04x]", RULE_SPORT1, rule->s_port1);
+ }
} else if (!g_strcmp0(key, RULE_SPORT2)) {
- rule->s_port2 = g_variant_get_uint32(value);
- STC_LOGD("%s: [%04x]", RULE_SPORT2, rule->s_port2);
+ if (rule->s_port_type != IPTABLES_PORT_NONE) {
+ rule->s_port2 = g_variant_get_uint32(value);
+ STC_LOGD("%s: [%04x]", RULE_SPORT2, rule->s_port2);
+ }
} else if (!g_strcmp0(key, RULE_DPORT1)) {
- rule->d_port1 = g_variant_get_uint32(value);
- STC_LOGD("%s: [%04x]", RULE_DPORT1, rule->d_port1);
+ if (rule->d_port_type != IPTABLES_PORT_NONE) {
+ rule->d_port1 = g_variant_get_uint32(value);
+ STC_LOGD("%s: [%04x]", RULE_DPORT1, rule->d_port1);
+ }
} else if (!g_strcmp0(key, RULE_DPORT2)) {
- rule->d_port2 = g_variant_get_uint32(value);
- STC_LOGD("%s: [%04x]", RULE_DPORT2, rule->d_port2);
+ if (rule->d_port_type != IPTABLES_PORT_NONE) {
+ rule->d_port2 = g_variant_get_uint32(value);
+ STC_LOGD("%s: [%04x]", RULE_DPORT2, rule->d_port2);
+ }
} else if (!g_strcmp0(key, RULE_IFNAME)) {
- gsize len = 0;
- rule->ifname = g_variant_dup_string(value, &len);
- STC_LOGD("%s: [%s]", RULE_IFNAME, rule->ifname);
+ if (rule->direction != IPTABLES_DIRECTION_NONE) {
+ gsize len = 0;
+ rule->ifname = g_variant_dup_string(value, &len);
+ STC_LOGD("%s: [%s]", RULE_IFNAME, rule->ifname);
+ }
} else if (!g_strcmp0(key, RULE_CGROUP)) {
rule->classid = g_variant_get_uint32(value);
STC_LOGD("%s: [%u]", RULE_TARGETTYPE, rule->target_type);
} else if (!g_strcmp0(key, RULE_LOG_LEVEL)) {
- rule->log_level = g_variant_get_uint16(value);
- STC_LOGD("%s: [%u]", RULE_LOG_LEVEL, rule->log_level);
+ if (rule->target_type == IPTABLES_ACTION_LOG) {
+ rule->log_level = g_variant_get_uint16(value);
+ STC_LOGD("%s: [%u]", RULE_LOG_LEVEL, rule->log_level);
+ }
} else if (!g_strcmp0(key, RULE_LOG_PREFIX)) {
- gsize len = 0;
- rule->log_prefix = g_variant_dup_string(value, &len);
- STC_LOGD("%s: [%s]", RULE_LOG_PREFIX, rule->log_prefix);
+ if (rule->target_type == IPTABLES_ACTION_LOG) {
+ gsize len = 0;
+ rule->log_prefix = g_variant_dup_string(value, &len);
+ STC_LOGD("%s: [%s]", RULE_LOG_PREFIX, rule->log_prefix);
+ }
} else if (!g_strcmp0(key, RULE_NFLOG_GROUP)) {
- rule->nflog_group = g_variant_get_uint16(value);
- STC_LOGD("%s: [%u]", RULE_NFLOG_GROUP, rule->nflog_group);
+ if (rule->target_type == IPTABLES_ACTION_NFLOG) {
+ rule->nflog_group = g_variant_get_uint16(value);
+ STC_LOGD("%s: [%u]", RULE_NFLOG_GROUP, rule->nflog_group);
+ }
} else if (!g_strcmp0(key, RULE_NFLOG_PREFIX)) {
- gsize len = 0;
- rule->nflog_prefix = g_variant_dup_string(value, &len);
- STC_LOGD("%s: [%s]", RULE_NFLOG_PREFIX, rule->nflog_prefix);
+ if (rule->target_type == IPTABLES_ACTION_NFLOG) {
+ gsize len = 0;
+ rule->nflog_prefix = g_variant_dup_string(value, &len);
+ STC_LOGD("%s: [%s]", RULE_NFLOG_PREFIX, rule->nflog_prefix);
+ }
} else if (!g_strcmp0(key, RULE_NFLOG_RANGE)) {
- rule->nflog_range = g_variant_get_uint16(value);
- STC_LOGD("%s: [%u]", RULE_NFLOG_RANGE, rule->nflog_range);
+ if (rule->target_type == IPTABLES_ACTION_NFLOG) {
+ rule->nflog_range = g_variant_get_uint16(value);
+ STC_LOGD("%s: [%u]", RULE_NFLOG_RANGE, rule->nflog_range);
+ }
} else if (!g_strcmp0(key, RULE_NFLOG_THRESHOLD)) {
- rule->nflog_threshold = g_variant_get_uint16(value);
- STC_LOGD("%s: [%u]", RULE_NFLOG_THRESHOLD, rule->nflog_threshold);
+ if (rule->target_type == IPTABLES_ACTION_NFLOG) {
+ rule->nflog_threshold = g_variant_get_uint16(value);
+ STC_LOGD("%s: [%u]", RULE_NFLOG_THRESHOLD, rule->nflog_threshold);
+ }
} else {
STC_LOGD("Unknown rule [%s]", key); //LCOV_EXCL_LINE
return TRUE;
}
+gboolean handle_iptables_insert_rule(StcRule *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *rules,
+ void *user_data)
+{
+ __STC_LOG_FUNC_ENTER__;
+ stc_error_e ret = STC_ERROR_NONE;
+ GVariant *return_parameters = NULL;
+
+ if (rules != NULL) {
+ GVariantIter *iter = NULL;
+
+ g_variant_get(rules, "a{sv}", &iter);
+
+ iptables_rule_s *rule = MALLOC0(iptables_rule_s, 1);
+ if (rule != NULL) {
+ memset(rule, 0, sizeof(iptables_rule_s));
+
+ stc_iptables_gdbus_dict_foreach(iter,
+ __stc_extract_rule,
+ rule);
+
+ ret = iptables_insert_rule(rule);
+ if (ret != STC_ERROR_NONE) {
+ //LCOV_EXCL_START
+ STC_LOGE("Failed insert rule [%s:%d:%s:%d:%s:%s]", rule->chain,
+ rule->direction, rule->ifname, rule->classid,
+ rule->nfacct_name, rule->target);
+
+ __free_rule(rule);
+
+ STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
+ __STC_LOG_FUNC_EXIT__;
+ return TRUE;
+ //LCOV_EXCL_STOP
+ }
+
+ __free_rule(rule);
+ }
+
+ g_variant_iter_free(iter);
+ } else {
+ STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
+ STC_ERROR_INVALID_PARAMETER);
+ __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+ return TRUE; //LCOV_EXCL_LINE
+ }
+
+ return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
+
+ STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
+ STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
+
+ __STC_LOG_FUNC_EXIT__;
+ return TRUE;
+}
+
gboolean handle_iptables_remove_rule(StcRule *object,
GDBusMethodInvocation *invocation,
GVariant *rules,
return TRUE;
}
+gboolean handle_ip6tables_insert_rule(StcRule *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *rules,
+ void *user_data)
+{
+ __STC_LOG_FUNC_ENTER__;
+ stc_error_e ret = STC_ERROR_NONE;
+ GVariant *return_parameters = NULL;
+
+ if (rules != NULL) {
+ GVariantIter *iter = NULL;
+
+ g_variant_get(rules, "a{sv}", &iter);
+
+ ip6tables_rule_s *rule = MALLOC0(ip6tables_rule_s, 1);
+ if (rule != NULL) {
+ memset(rule, 0, sizeof(ip6tables_rule_s));
+
+ stc_iptables_gdbus_dict_foreach(iter,
+ __stc_extract_6_rule,
+ rule);
+
+ ret = ip6tables_insert_rule(rule);
+ if (ret != STC_ERROR_NONE) {
+ //LCOV_EXCL_START
+ STC_LOGE("Failed insert rule [%s:%d:%s:%d:%s:%s]", rule->chain,
+ rule->direction, rule->ifname, rule->classid,
+ rule->nfacct_name, rule->target);
+
+ __free_6_rule(rule);
+
+ STC_IPTABLES_DBUS_REPLY_ERROR(invocation, ret);
+ __STC_LOG_FUNC_EXIT__;
+ return TRUE;
+ //LCOV_EXCL_STOP
+ }
+
+ __free_6_rule(rule);
+ }
+
+ g_variant_iter_free(iter);
+ } else {
+ STC_IPTABLES_DBUS_REPLY_ERROR(invocation, //LCOV_EXCL_LINE
+ STC_ERROR_INVALID_PARAMETER);
+ __STC_LOG_FUNC_EXIT__; //LCOV_EXCL_LINE
+ return TRUE; //LCOV_EXCL_LINE
+ }
+
+ return_parameters = g_variant_new("(i)", STC_ERROR_NONE);
+
+ STC_DEBUG_GDBUS_VARIANT("Return parameters: ", return_parameters);
+ STC_IPTABLES_DBUS_REPLY(invocation, return_parameters);
+
+ __STC_LOG_FUNC_EXIT__;
+ return TRUE;
+}
+
gboolean handle_ip6tables_remove_rule(StcRule *object,
GDBusMethodInvocation *invocation,
GVariant *rules,