summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2024-11-19 07:17:07 +0000
committerliuxueli <[email protected]>2024-11-27 06:36:57 +0000
commit409833b463c7e43eec4b4cb332485d4755d92486 (patch)
treeccb82ecef23b17188f13ce344a5ea9f24be584ab
parent4e9246ba9bc553446ac76f1bcd5175c07eed964a (diff)
Security enforcer maat plugin table
-rw-r--r--enforcer/security/security_maat.c14
-rw-r--r--enforcer/security/test/gtest_security_maat.cpp422
2 files changed, 434 insertions, 2 deletions
diff --git a/enforcer/security/security_maat.c b/enforcer/security/security_maat.c
index e67cda3..608c8c7 100644
--- a/enforcer/security/security_maat.c
+++ b/enforcer/security/security_maat.c
@@ -379,6 +379,11 @@ void dns_answer_record_free(UT_array **answer_array, int n_array)
for(int i=0; i<n_array; i++)
{
+ if(answer_array[i]==NULL)
+ {
+ continue;
+ }
+
struct dns_answer_record *a_record=NULL;
while((a_record=(struct dns_answer_record *)utarray_next(answer_array[i], a_record))!=NULL)
{
@@ -709,6 +714,15 @@ static struct dns_setting_details *sub_action_dns_setting_details_parse(yyjson_v
dns_answer_record_parse(dns_setting, answer_array, qtype);
}
+ for(int i=0; i<DNS_ANSWER_TYPE_MAX; i++)
+ {
+ if(utarray_len(dns_setting->answer_array[i])==0)
+ {
+ utarray_free(dns_setting->answer_array[i]);
+ dns_setting->answer_array[i]=NULL;
+ }
+ }
+
return dns_setting;
}
diff --git a/enforcer/security/test/gtest_security_maat.cpp b/enforcer/security/test/gtest_security_maat.cpp
index 2d163e8..664f091 100644
--- a/enforcer/security/test/gtest_security_maat.cpp
+++ b/enforcer/security/test/gtest_security_maat.cpp
@@ -475,7 +475,7 @@ TEST(security_maat, security_rule_is_deny_tamper_random)
security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
}
-TEST(security_maat, security_rule_is_deny_alert_message)
+TEST(security_maat, security_rule_is_deny_alert200_message)
{
const char *table_line="{ \
\"uuid\": \"00000000-0000-0000-0000-000000000129\", \
@@ -511,7 +511,7 @@ TEST(security_maat, security_rule_is_deny_alert_message)
security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
}
-TEST(security_maat, security_rule_is_deny_alert_profile)
+TEST(security_maat, security_rule_is_deny_alert200_profile)
{
const char *table_line="{ \
\"uuid\": \"00000000-0000-0000-0000-000000000129\", \
@@ -549,6 +549,41 @@ TEST(security_maat, security_rule_is_deny_alert_profile)
security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
}
+TEST(security_maat, security_rule_is_deny_alert204)
+{
+ const char *table_line="{ \
+ \"uuid\": \"00000000-0000-0000-0000-000000000129\", \
+ \"action\": \"deny\", \
+ \"log_option\": \"all\", \
+ \"action_parameter\": { \
+ \"sub_action\": \"alert\", \
+ \"code\": 204 \
+ } \
+ }";
+
+ struct security_rule *p_rule=NULL;
+ security_rule_new("SECURITY_RULE_PLUGIN", "00000000-0000-0000-0000-000000000129", table_line, (void **)(&p_rule), 0, NULL);
+ EXPECT_NE(p_rule, nullptr);
+
+ char rule_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_rule->rule_uuid, rule_uuid_str);
+ EXPECT_STREQ(rule_uuid_str, "00000000-0000-0000-0000-000000000129");
+ EXPECT_EQ(p_rule->log_option, LOG_OPTION_ALL);
+
+ EXPECT_EQ(p_rule->action, SECURITY_RULE_ACTION_DENY);
+ EXPECT_STREQ(p_rule->action_str, "deny");
+ EXPECT_NE(p_rule->deny, nullptr);
+ EXPECT_EQ(p_rule->deny->origin, origin_override);
+ EXPECT_NE(p_rule->deny->override_action, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->sub_action_type, RULE_SUB_ACTION_ALERT);
+ EXPECT_NE(p_rule->deny->override_action->http_alert, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->http_alert->code, 204);
+ EXPECT_EQ(p_rule->deny->override_action->http_alert->rtype, RESPONSE_NO_CONTENT);
+ EXPECT_EQ(p_rule->deny->override_action->http_alert->message, nullptr);
+
+ security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
+}
+
TEST(security_maat, security_rule_is_deny_http_block403_message)
{
const char *table_line="{ \
@@ -907,4 +942,387 @@ TEST(security_maat, security_rule_is_deny_http_url_redirect303_variable)
EXPECT_STREQ(p_rule->deny->override_action->http_redirect->message, "https://www.redirect303.com/tsg_policy_uuid={{tsg_policy_uuid}}/tsg_subscriber_id={{tsg_subscriber_id}}/tsg_client_ip={{tsg_client_ip}}");
security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
+}
+
+TEST(security_maat, security_rule_is_deny_dns_redirect_CNAME_AAAA_Profile)
+{
+ const char *table_line="{ \
+ \"uuid\": \"00000000-0000-0000-0000-000000000129\", \
+ \"action\": \"deny\", \
+ \"log_option\": \"all\", \
+ \"action_parameter\": { \
+ \"sub_action\": \"redirect\", \
+ \"resolution\": [ \
+ { \
+ \"qtype\": \"AAAA\", \
+ \"answer\": [ \
+ { \
+ \"atype\": \"CNAME\", \
+ \"value\": \"www.cname.aaaa.net\", \
+ \"ttl\": { \
+ \"min\": 60, \
+ \"max\": 300 \
+ } \
+ }, \
+ { \
+ \"atype\": \"AAAA\", \
+ \"record_profile\": \"00000000-0000-0000-0000-000000000102\", \
+ \"selected_num\": 2, \
+ \"ttl\": { \
+ \"min\": 300, \
+ \"max\": 300 \
+ } \
+ } \
+ ] \
+ } \
+ ] \
+ } \
+ }";
+
+ struct security_rule *p_rule=NULL;
+ security_rule_new("SECURITY_RULE_PLUGIN", "00000000-0000-0000-0000-000000000129", table_line, (void **)(&p_rule), 0, NULL);
+ EXPECT_NE(p_rule, nullptr);
+
+ char rule_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_rule->rule_uuid, rule_uuid_str);
+ EXPECT_STREQ(rule_uuid_str, "00000000-0000-0000-0000-000000000129");
+ EXPECT_EQ(p_rule->log_option, LOG_OPTION_ALL);
+
+ EXPECT_EQ(p_rule->action, SECURITY_RULE_ACTION_DENY);
+ EXPECT_STREQ(p_rule->action_str, "deny");
+ EXPECT_NE(p_rule->deny, nullptr);
+ EXPECT_EQ(p_rule->deny->origin, origin_override);
+ EXPECT_NE(p_rule->deny->override_action, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->sub_action_type, RULE_SUB_ACTION_DNS_REDIRECT);
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect, nullptr);
+
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A], nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME], nullptr);
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA]), 1);
+ struct dns_answer_record *p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 300);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 2);
+ EXPECT_EQ(p_record->rtype, RESPONSE_PROFILE);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_AAAA);
+ EXPECT_EQ(p_record->atype, RR_TYPE_AAAA);
+ char profile_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_record->record_profile, profile_uuid_str);
+ EXPECT_STREQ(profile_uuid_str, "00000000-0000-0000-0000-000000000102");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 60);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 1);
+ EXPECT_EQ(p_record->rtype, RESPONSE_CNAME);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_AAAA);
+ EXPECT_EQ(p_record->atype, RR_TYPE_CNAME);
+ EXPECT_STREQ(p_record->cname, "www.cname.aaaa.net");
+
+ security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
+}
+
+TEST(security_maat, security_rule_is_deny_dns_redirect_CNAME_A_Profile)
+{
+ const char *table_line="{ \
+ \"uuid\": \"00000000-0000-0000-0000-000000000129\", \
+ \"action\": \"deny\", \
+ \"log_option\": \"all\", \
+ \"action_parameter\": { \
+ \"sub_action\": \"redirect\", \
+ \"resolution\": [ \
+ { \
+ \"qtype\": \"A\", \
+ \"answer\": [ \
+ { \
+ \"atype\": \"CNAME\", \
+ \"value\": \"www.cname.a.net\", \
+ \"ttl\": { \
+ \"min\": 60, \
+ \"max\": 300 \
+ } \
+ }, \
+ { \
+ \"atype\": \"A\", \
+ \"record_profile\": \"00000000-0000-0000-0000-000000000103\", \
+ \"selected_num\": 2, \
+ \"ttl\": { \
+ \"min\": 300, \
+ \"max\": 300 \
+ } \
+ } \
+ ] \
+ } \
+ ] \
+ } \
+ }";
+
+ struct security_rule *p_rule=NULL;
+ security_rule_new("SECURITY_RULE_PLUGIN", "00000000-0000-0000-0000-000000000129", table_line, (void **)(&p_rule), 0, NULL);
+ EXPECT_NE(p_rule, nullptr);
+
+ char rule_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_rule->rule_uuid, rule_uuid_str);
+ EXPECT_STREQ(rule_uuid_str, "00000000-0000-0000-0000-000000000129");
+ EXPECT_EQ(p_rule->log_option, LOG_OPTION_ALL);
+
+ EXPECT_EQ(p_rule->action, SECURITY_RULE_ACTION_DENY);
+ EXPECT_STREQ(p_rule->action_str, "deny");
+ EXPECT_NE(p_rule->deny, nullptr);
+ EXPECT_EQ(p_rule->deny->origin, origin_override);
+ EXPECT_NE(p_rule->deny->override_action, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->sub_action_type, RULE_SUB_ACTION_DNS_REDIRECT);
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect, nullptr);
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]), 1);
+ struct dns_answer_record *p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 300);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 2);
+ EXPECT_EQ(p_record->rtype, RESPONSE_PROFILE);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_A);
+ char profile_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_record->record_profile, profile_uuid_str);
+ EXPECT_STREQ(profile_uuid_str, "00000000-0000-0000-0000-000000000103");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 60);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 1);
+ EXPECT_EQ(p_record->rtype, RESPONSE_CNAME);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_CNAME);
+ EXPECT_STREQ(p_record->cname, "www.cname.a.net");
+
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA], nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME], nullptr);
+
+ security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
+
+}
+
+TEST(security_maat, security_rule_is_deny_dns_redirect_CNAME_Profile_A)
+{
+ const char *table_line="{ \
+ \"uuid\": \"00000000-0000-0000-0000-000000000129\", \
+ \"action\": \"deny\", \
+ \"log_option\": \"all\", \
+ \"action_parameter\": { \
+ \"sub_action\": \"redirect\", \
+ \"resolution\": [ \
+ { \
+ \"qtype\": \"A\", \
+ \"answer\": [ \
+ { \
+ \"atype\": \"A\", \
+ \"value\": \"192.168.0.3\", \
+ \"ttl\": { \
+ \"min\": 60, \
+ \"max\": 300 \
+ } \
+ }, \
+ { \
+ \"atype\": \"CNAME\", \
+ \"record_profile\": \"00000000-0000-0000-0000-000000000104\", \
+ \"selected_num\": 2, \
+ \"ttl\": { \
+ \"min\": 300, \
+ \"max\": 300 \
+ } \
+ } \
+ ] \
+ } \
+ ] \
+ } \
+ }";
+
+ struct security_rule *p_rule=NULL;
+ security_rule_new("SECURITY_RULE_PLUGIN", "00000000-0000-0000-0000-000000000129", table_line, (void **)(&p_rule), 0, NULL);
+ EXPECT_NE(p_rule, nullptr);
+
+ char rule_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_rule->rule_uuid, rule_uuid_str);
+ EXPECT_STREQ(rule_uuid_str, "00000000-0000-0000-0000-000000000129");
+ EXPECT_EQ(p_rule->log_option, LOG_OPTION_ALL);
+
+ EXPECT_EQ(p_rule->action, SECURITY_RULE_ACTION_DENY);
+ EXPECT_STREQ(p_rule->action_str, "deny");
+ EXPECT_NE(p_rule->deny, nullptr);
+ EXPECT_EQ(p_rule->deny->origin, origin_override);
+ EXPECT_NE(p_rule->deny->override_action, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->sub_action_type, RULE_SUB_ACTION_DNS_REDIRECT);
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect, nullptr);
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]), 1);
+ struct dns_answer_record *p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 60);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 1);
+ EXPECT_EQ(p_record->rtype, RESPONSE_IPV4);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_A);
+ char ipv4_addr_str[INET_ADDRSTRLEN];
+ inet_ntop(AF_INET, &(p_record->v4_addr), ipv4_addr_str, INET_ADDRSTRLEN);
+ EXPECT_STREQ(ipv4_addr_str, "192.168.0.3");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 300);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 2);
+ EXPECT_EQ(p_record->rtype, RESPONSE_PROFILE);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_CNAME);
+ char profile_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_record->record_profile, profile_uuid_str);
+ EXPECT_STREQ(profile_uuid_str, "00000000-0000-0000-0000-000000000104");
+
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA], nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME], nullptr);
+
+ security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
+}
+
+TEST(security_maat, security_rule_is_deny_dns_redirect_CNAME_Profile_AAAA)
+{
+ const char *table_line="{ \
+ \"uuid\": \"00000000-0000-0000-0000-000000000129\", \
+ \"action\": \"deny\", \
+ \"log_option\": \"all\", \
+ \"action_parameter\": { \
+ \"sub_action\": \"redirect\", \
+ \"resolution\": [ \
+ { \
+ \"qtype\": \"AAAA\", \
+ \"answer\": [ \
+ { \
+ \"atype\": \"CNAME\", \
+ \"value\": \"www.cname.aaaa.net\", \
+ \"ttl\": { \
+ \"min\": 60, \
+ \"max\": 300 \
+ } \
+ }, \
+ { \
+ \"atype\": \"AAAA\", \
+ \"record_profile\": \"00000000-0000-0000-0000-000000000102\", \
+ \"selected_num\": 2, \
+ \"ttl\": { \
+ \"min\": 300, \
+ \"max\": 300 \
+ } \
+ } \
+ ] \
+ }, \
+ { \
+ \"qtype\": \"A\", \
+ \"answer\": [ \
+ { \
+ \"atype\": \"CNAME\", \
+ \"value\": \"www.cname.a.net\", \
+ \"ttl\": { \
+ \"min\": 60, \
+ \"max\": 300 \
+ } \
+ }, \
+ { \
+ \"atype\": \"A\", \
+ \"record_profile\": \"00000000-0000-0000-0000-000000000103\", \
+ \"selected_num\": 2, \
+ \"ttl\": { \
+ \"min\": 300, \
+ \"max\": 300 \
+ } \
+ } \
+ ] \
+ } \
+ ] \
+ } \
+ }";
+
+ struct security_rule *p_rule=NULL;
+ security_rule_new("SECURITY_RULE_PLUGIN", "00000000-0000-0000-0000-000000000129", table_line, (void **)(&p_rule), 0, NULL);
+ EXPECT_NE(p_rule, nullptr);
+
+ char rule_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_rule->rule_uuid, rule_uuid_str);
+ EXPECT_STREQ(rule_uuid_str, "00000000-0000-0000-0000-000000000129");
+ EXPECT_EQ(p_rule->log_option, LOG_OPTION_ALL);
+
+ EXPECT_EQ(p_rule->action, SECURITY_RULE_ACTION_DENY);
+ EXPECT_STREQ(p_rule->action_str, "deny");
+ EXPECT_NE(p_rule->deny, nullptr);
+ EXPECT_EQ(p_rule->deny->origin, origin_override);
+ EXPECT_NE(p_rule->deny->override_action, nullptr);
+ EXPECT_EQ(p_rule->deny->override_action->sub_action_type, RULE_SUB_ACTION_DNS_REDIRECT);
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect, nullptr);
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]), 1);
+ struct dns_answer_record *p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_A]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 300);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 2);
+ EXPECT_EQ(p_record->rtype, RESPONSE_PROFILE);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_A);
+ char profile_uuid_str[UUID_STR_LEN];
+ uuid_unparse_lower(p_record->record_profile, profile_uuid_str);
+ EXPECT_STREQ(profile_uuid_str, "00000000-0000-0000-0000-000000000103");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_A_CNAME]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 60);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 1);
+ EXPECT_EQ(p_record->rtype, RESPONSE_CNAME);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_A);
+ EXPECT_EQ(p_record->atype, RR_TYPE_CNAME);
+ EXPECT_STREQ(p_record->cname, "www.cname.a.net");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_AAAA]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 300);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 2);
+ EXPECT_EQ(p_record->rtype, RESPONSE_PROFILE);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_AAAA);
+ EXPECT_EQ(p_record->atype, RR_TYPE_AAAA);
+ uuid_unparse_lower(p_record->record_profile, profile_uuid_str);
+ EXPECT_STREQ(profile_uuid_str, "00000000-0000-0000-0000-000000000102");
+
+ EXPECT_NE(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME], nullptr);
+ EXPECT_EQ(utarray_len(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME]), 1);
+ p_record=(struct dns_answer_record *)utarray_front(p_rule->deny->override_action->dns_redirect->answer_array[DNS_ANSWER_TYPE_AAAA_CNAME]);
+ EXPECT_NE(p_record, nullptr);
+ EXPECT_EQ(p_record->min_ttl, 60);
+ EXPECT_EQ(p_record->max_ttl, 300);
+ EXPECT_EQ(p_record->selected_num, 1);
+ EXPECT_EQ(p_record->rtype, RESPONSE_CNAME);
+ EXPECT_EQ(p_record->qtype, RR_TYPE_AAAA);
+ EXPECT_EQ(p_record->atype, RR_TYPE_CNAME);
+ EXPECT_STREQ(p_record->cname, "www.cname.aaaa.net");
+
+ security_rule_free("SECURITY_RULE_PLUGIN", (void **)(&p_rule), 0, NULL);
} \ No newline at end of file