aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarson Reinke <carson@reinke.co>2018-12-29 19:03:43 -0500
committerAndreas Schneider <asn@cryptomilk.org>2019-10-20 14:59:54 +0200
commitf311332a634b42c3962a2b89c01adf435c4ccd4a (patch)
tree3353e195ebf48e3f5e11fb7ed6c382658c3c4b1e
parent5aaed66e6fe7a4d9598889b5532d6cf6d407e3d0 (diff)
downloadresolv_wrapper-f311332a634b42c3962a2b89c01adf435c4ccd4a.tar.gz
resolv_wrapper-f311332a634b42c3962a2b89c01adf435c4ccd4a.tar.xz
resolv_wrapper-f311332a634b42c3962a2b89c01adf435c4ccd4a.zip
Added fake resolving of TXT records
Signed-off-by: Carson Reinke <carson@reinke.co> Reviewed-by: Andreas Schneider <asn@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
-rw-r--r--doc/resolv_wrapper.1.txt1
-rw-r--r--src/resolv_wrapper.c49
-rw-r--r--tests/fake_hosts.in1
-rw-r--r--tests/test_dns_fake.c35
4 files changed, 86 insertions, 0 deletions
diff --git a/doc/resolv_wrapper.1.txt b/doc/resolv_wrapper.1.txt
index cf6c62b..dcd161d 100644
--- a/doc/resolv_wrapper.1.txt
+++ b/doc/resolv_wrapper.1.txt
@@ -48,6 +48,7 @@ For example:
CNAME kerberos.cwrap.org dc.cwrap.org
SRV _kerberos._tcp.cwrap.org kerberos.cwrap.org 88
URI _vpn.cwrap.org https://vpn.cwrap.org/VPN
+ TXT cwrap.org v=spf1 mx
*RESOLV_WRAPPER_DEBUGLEVEL*::
diff --git a/src/resolv_wrapper.c b/src/resolv_wrapper.c
index 5e9abc2..08e3020 100644
--- a/src/resolv_wrapper.c
+++ b/src/resolv_wrapper.c
@@ -194,6 +194,7 @@ struct rwrap_fake_rr {
struct rwrap_soa_rrdata soa_rec;
char cname_rec[MAXDNAME];
char ptr_rec[MAXDNAME];
+ char txt_rec[MAXDNAME];
} rrdata;
char key[MAXDNAME];
@@ -329,6 +330,17 @@ static int rwrap_create_fake_uri_rr(const char *key,
return 0;
}
+static int rwrap_create_fake_txt_rr(const char *key,
+ const char *value,
+ struct rwrap_fake_rr *rr)
+{
+ memcpy(rr->rrdata.txt_rec, value, strlen(value) + 1);
+
+ memcpy(rr->key, key, strlen(key) + 1);
+ rr->type = ns_t_txt;
+ return 0;
+}
+
static int rwrap_create_fake_soa_rr(const char *key,
const char *value,
struct rwrap_fake_rr *rr)
@@ -651,6 +663,34 @@ static ssize_t rwrap_fake_uri(struct rwrap_fake_rr *rr,
return resp_size;
}
+static ssize_t rwrap_fake_txt(struct rwrap_fake_rr *rr,
+ uint8_t *answer,
+ size_t anslen)
+{
+ uint8_t *a = answer;
+ ssize_t resp_size;
+ size_t rdata_size;
+ size_t txt_len;
+
+ if (rr->type != ns_t_txt) {
+ RWRAP_LOG(RWRAP_LOG_ERROR, "Wrong type!\n");
+ return -1;
+ }
+ RWRAP_LOG(RWRAP_LOG_TRACE, "Adding TXT RR");
+ txt_len = strlen(rr->rrdata.txt_rec) + 1;
+ rdata_size = txt_len;
+
+ resp_size = rwrap_fake_rdata_common(ns_t_txt, rdata_size,
+ rr->key, anslen, &a);
+ if (resp_size < 0) {
+ return -1;
+ }
+
+ memcpy(a, rr->rrdata.txt_rec, txt_len);
+
+ return resp_size;
+}
+
static ssize_t rwrap_fake_soa(struct rwrap_fake_rr *rr,
uint8_t *answer,
size_t anslen)
@@ -947,6 +987,11 @@ static int rwrap_get_record(const char *hostfile, unsigned recursion,
rc = rwrap_create_fake_ptr_rr(key, value, rr);
break;
}
+ else if (TYPE_MATCH(type, ns_t_txt,
+ rec_type, "TXT", key, query)) {
+ rc = rwrap_create_fake_txt_rr(key, value, rr);
+ break;
+ }
}
if (rc == ENOENT && recursion == 0 && key != NULL) {
@@ -998,6 +1043,7 @@ static inline bool rwrap_known_type(int type)
case ns_t_soa:
case ns_t_cname:
case ns_t_ptr:
+ case ns_t_txt:
return true;
}
@@ -1088,6 +1134,9 @@ static ssize_t rwrap_add_rr(struct rwrap_fake_rr *rr,
case ns_t_ptr:
resp_data = rwrap_fake_ptr(rr, answer, anslen);
break;
+ case ns_t_txt:
+ resp_data = rwrap_fake_txt(rr, answer, anslen);
+ break;
default:
return -1;
}
diff --git a/tests/fake_hosts.in b/tests/fake_hosts.in
index 824af57..931f004 100644
--- a/tests/fake_hosts.in
+++ b/tests/fake_hosts.in
@@ -17,3 +17,4 @@ URI _vpn.cwrap.org https://vpn2.cwrap.org/VPN 2 10
URI _vpn.cwrap.org https://vpn3.cwrap.org/VPN 2 20
URI _ftp.cwrap.org ftp://ftp.cwrap.org/public
PTR 22.0.0.127.in-addr.arpa www.cwrap.org
+TXT cwrap.org v=spf1 mx
diff --git a/tests/test_dns_fake.c b/tests/test_dns_fake.c
index 28ee57a..420d32b 100644
--- a/tests/test_dns_fake.c
+++ b/tests/test_dns_fake.c
@@ -714,6 +714,40 @@ static void test_res_fake_ptr_query(void **state)
assert_string_equal(ptrname, "www.cwrap.org");
}
+static void test_res_fake_txt_query(void **state)
+{
+ int rv;
+ struct __res_state dnsstate;
+ unsigned char answer[ANSIZE];
+ ns_msg handle;
+ ns_rr rr; /* expanded resource record */
+ const uint8_t *rrdata;
+
+ (void) state; /* unused */
+
+ memset(&dnsstate, 0, sizeof(struct __res_state));
+ rv = res_ninit(&dnsstate);
+ assert_int_equal(rv, 0);
+
+ rv = res_nquery(&dnsstate, "cwrap.org", ns_c_in, ns_t_txt,
+ answer, sizeof(answer));
+ assert_in_range(rv, 1, 256);
+
+ ns_initparse(answer, sizeof(answer), &handle);
+
+ /*
+ * The query must finish w/o an error, have one answer and the answer
+ * must be a parseable RR of type TXT
+ */
+ assert_int_equal(ns_msg_getflag(handle, ns_f_rcode), ns_r_noerror);
+ assert_int_equal(ns_msg_count(handle, ns_s_an), 1);
+ assert_int_equal(ns_parserr(&handle, ns_s_an, 0, &rr), 0);
+ assert_int_equal(ns_rr_type(rr), ns_t_txt);
+
+ rrdata = ns_rr_rdata(rr);
+ assert_string_equal(rrdata, "v=spf1 mx");
+}
+
int main(void)
{
int rc;
@@ -733,6 +767,7 @@ int main(void)
cmocka_unit_test(test_res_fake_cname_query),
cmocka_unit_test(test_res_fake_a_via_cname),
cmocka_unit_test(test_res_fake_ptr_query),
+ cmocka_unit_test(test_res_fake_txt_query),
};
rc = cmocka_run_group_tests(fake_tests, NULL, NULL);