Pull request: filtering: fix fqdn support in ptr dnsrewrite

Updates #3256.

Squashed commit of the following:

commit 304c7bc9c22086aa004faabe147e8392749bee7f
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Fri Jun 11 14:20:45 2021 +0300

    filtering: fix fqdn support in ptr dnsrewrite
This commit is contained in:
Ainar Garipov
2021-06-11 14:40:22 +03:00
parent fcbf4fbc09
commit 813102f226
4 changed files with 75 additions and 23 deletions

View File

@@ -44,6 +44,9 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
|disable-all^$dnsrewrite=127.0.0.1
|disable-all^$dnsrewrite=127.0.0.2
@@||disable-all^$dnsrewrite
|1.2.3.4.in-addr.arpa^$dnsrewrite=NOERROR;PTR;new-ptr
|1.2.3.5.in-addr.arpa^$dnsrewrite=NOERROR;PTR;new-ptr-with-dot.
`
f := newForTest(nil, []Filter{{ID: 0, Data: []byte(text)}})
@@ -58,47 +61,49 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
testCasesA := []struct {
name string
dtyp uint16
rcode int
want []interface{}
rcode int
dtyp uint16
}{{
name: "a-record",
dtyp: dns.TypeA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv4p1},
dtyp: dns.TypeA,
}, {
name: "aaaa-record",
dtyp: dns.TypeAAAA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv6p1},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeAAAA,
}, {
name: "txt-record",
dtyp: dns.TypeTXT,
rcode: dns.RcodeSuccess,
want: []interface{}{"hello-world"},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeTXT,
}, {
name: "refused",
want: nil,
rcode: dns.RcodeRefused,
dtyp: 0,
}, {
name: "a-records",
dtyp: dns.TypeA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv4p1, ipv4p2},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeA,
}, {
name: "aaaa-records",
dtyp: dns.TypeAAAA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv6p1, ipv6p2},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeAAAA,
}, {
name: "disable-one",
dtyp: dns.TypeA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv4p2},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeA,
}, {
name: "disable-cname",
dtyp: dns.TypeA,
rcode: dns.RcodeSuccess,
want: []interface{}{ipv4p1},
rcode: dns.RcodeSuccess,
dtyp: dns.TypeA,
}}
for _, tc := range testCasesA {
@@ -106,18 +111,19 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
host := path.Base(tc.name)
res, err := f.CheckHostRules(host, tc.dtyp, setts)
require.Nil(t, err)
require.NoError(t, err)
dnsrr := res.DNSRewriteResult
require.NotNil(t, dnsrr)
assert.Equal(t, tc.rcode, dnsrr.RCode)
assert.Equal(t, tc.rcode, dnsrr.RCode)
if tc.rcode == dns.RcodeRefused {
return
}
ipVals := dnsrr.Response[tc.dtyp]
require.Len(t, ipVals, len(tc.want))
for i, val := range tc.want {
require.Equal(t, val, ipVals[i])
}
@@ -129,7 +135,8 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
host := path.Base(t.Name())
res, err := f.CheckHostRules(host, dtyp, setts)
require.Nil(t, err)
require.NoError(t, err)
assert.Equal(t, "new-cname", res.CanonName)
})
@@ -138,7 +145,8 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
host := path.Base(t.Name())
res, err := f.CheckHostRules(host, dtyp, setts)
require.Nil(t, err)
require.NoError(t, err)
assert.Equal(t, "new-cname-2", res.CanonName)
assert.Nil(t, res.DNSRewriteResult)
})
@@ -148,8 +156,49 @@ func TestDNSFilter_CheckHostRules_dnsrewrite(t *testing.T) {
host := path.Base(t.Name())
res, err := f.CheckHostRules(host, dtyp, setts)
require.Nil(t, err)
require.NoError(t, err)
assert.Empty(t, res.CanonName)
assert.Empty(t, res.Rules)
})
t.Run("1.2.3.4.in-addr.arpa", func(t *testing.T) {
dtyp := dns.TypePTR
host := path.Base(t.Name())
res, err := f.CheckHostRules(host, dtyp, setts)
require.NoError(t, err)
require.NotNil(t, res.DNSRewriteResult)
rr := res.DNSRewriteResult
require.NotEmpty(t, rr.Response)
resps := rr.Response[dtyp]
require.Len(t, resps, 1)
ptr, ok := resps[0].(string)
require.True(t, ok)
assert.Equal(t, "new-ptr.", ptr)
})
t.Run("1.2.3.5.in-addr.arpa", func(t *testing.T) {
dtyp := dns.TypePTR
host := path.Base(t.Name())
res, err := f.CheckHostRules(host, dtyp, setts)
require.NoError(t, err)
require.NotNil(t, res.DNSRewriteResult)
rr := res.DNSRewriteResult
require.NotEmpty(t, rr.Response)
resps := rr.Response[dtyp]
require.Len(t, resps, 1)
ptr, ok := resps[0].(string)
require.True(t, ok)
assert.Equal(t, "new-ptr-with-dot.", ptr)
})
}