From 813102f2263a25294192dd20aa826e951926f481 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Fri, 11 Jun 2021 14:40:22 +0300 Subject: [PATCH] Pull request: filtering: fix fqdn support in ptr dnsrewrite Updates #3256. Squashed commit of the following: commit 304c7bc9c22086aa004faabe147e8392749bee7f Author: Ainar Garipov Date: Fri Jun 11 14:20:45 2021 +0300 filtering: fix fqdn support in ptr dnsrewrite --- CHANGELOG.md | 3 + go.mod | 2 +- go.sum | 4 +- internal/filtering/dnsrewrite_test.go | 89 +++++++++++++++++++++------ 4 files changed, 75 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1fe5cb3..ab942ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ released by then. ### Fixed +- Treatment of domain names and FQDNs in custom rules with `$dnsrewrite` that + use the `PTR` type ([#3256]). - Redundant hostname generating while loading static leases with empty hostname ([#3166]). - Domain name case in responses ([#3194]). @@ -70,6 +72,7 @@ released by then. [#3186]: https://github.com/AdguardTeam/AdGuardHome/issues/3186 [#3194]: https://github.com/AdguardTeam/AdGuardHome/issues/3194 [#3198]: https://github.com/AdguardTeam/AdGuardHome/issues/3198 +[#3256]: https://github.com/AdguardTeam/AdGuardHome/issues/3256 diff --git a/go.mod b/go.mod index cbc9935c..75696dc7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( github.com/AdguardTeam/dnsproxy v0.37.6 github.com/AdguardTeam/golibs v0.8.0 - github.com/AdguardTeam/urlfilter v0.14.5 + github.com/AdguardTeam/urlfilter v0.14.6 github.com/NYTimes/gziphandler v1.1.1 github.com/ameshkov/dnscrypt/v2 v2.1.3 github.com/digineo/go-ipset/v2 v2.2.1 diff --git a/go.sum b/go.sum index 78d0d3a3..c3200daa 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/AdguardTeam/golibs v0.4.4/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKU github.com/AdguardTeam/golibs v0.8.0 h1:rHo+yIgT2fivFG0yW2Cwk/DPc2+t/Aw6QvzPpiIFre0= github.com/AdguardTeam/golibs v0.8.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4= github.com/AdguardTeam/gomitmproxy v0.2.0/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU= -github.com/AdguardTeam/urlfilter v0.14.5 h1:WyF0hg0MwKevsqNPkoaZFH8f5WRi/yuy/7qePtYt5Ts= -github.com/AdguardTeam/urlfilter v0.14.5/go.mod h1:klx4JbOfc4EaNb5lWLqOwfg+pVcyRukmoJRvO55lL5U= +github.com/AdguardTeam/urlfilter v0.14.6 h1:emqoKZElooHACYehRBYENeKVN1a/rspxiqTIMYLuoIo= +github.com/AdguardTeam/urlfilter v0.14.6/go.mod h1:klx4JbOfc4EaNb5lWLqOwfg+pVcyRukmoJRvO55lL5U= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= diff --git a/internal/filtering/dnsrewrite_test.go b/internal/filtering/dnsrewrite_test.go index 4e93aa5c..c471aa5f 100644 --- a/internal/filtering/dnsrewrite_test.go +++ b/internal/filtering/dnsrewrite_test.go @@ -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) + }) }