all: rewrites
This commit is contained in:
@@ -947,12 +947,11 @@ func TestRewrite(t *testing.T) {
|
|||||||
reply, eerr = dns.Exchange(req, addr.String())
|
reply, eerr = dns.Exchange(req, addr.String())
|
||||||
require.NoError(t, eerr)
|
require.NoError(t, eerr)
|
||||||
|
|
||||||
// TODO (d.kolyshev): Investigate
|
require.Len(t, reply.Answer, 2)
|
||||||
// require.Len(t, reply.Answer, 2)
|
|
||||||
|
|
||||||
// assert.Equal(t, "test.com.", reply.Answer[0].(*dns.CNAME).Target)
|
assert.Equal(t, "test.com.", reply.Answer[0].(*dns.CNAME).Target)
|
||||||
// assert.True(t, net.IP{1, 2, 3, 4}.Equal(reply.Answer[1].(*dns.A).A))
|
assert.Equal(t, dns.TypeA, reply.Answer[1].Header().Rrtype)
|
||||||
assert.True(t, net.IP{1, 2, 3, 4}.Equal(reply.Answer[0].(*dns.A).A))
|
assert.True(t, net.IP{1, 2, 3, 4}.Equal(reply.Answer[1].(*dns.A).A))
|
||||||
|
|
||||||
req = createTestMessageWithType("my.alias.example.org.", dns.TypeA)
|
req = createTestMessageWithType("my.alias.example.org.", dns.TypeA)
|
||||||
reply, eerr = dns.Exchange(req, addr.String())
|
reply, eerr = dns.Exchange(req, addr.String())
|
||||||
@@ -963,11 +962,10 @@ func TestRewrite(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, "my.alias.example.org.", reply.Question[0].Name)
|
assert.Equal(t, "my.alias.example.org.", reply.Question[0].Name)
|
||||||
|
|
||||||
// TODO (d.kolyshev): Investigate
|
require.Len(t, reply.Answer, 2)
|
||||||
//require.Len(t, reply.Answer, 2)
|
|
||||||
//
|
assert.Equal(t, "example.org.", reply.Answer[0].(*dns.CNAME).Target)
|
||||||
//assert.Equal(t, "example.org.", reply.Answer[0].(*dns.CNAME).Target)
|
assert.Equal(t, dns.TypeA, reply.Answer[1].Header().Rrtype)
|
||||||
//assert.Equal(t, dns.TypeA, reply.Answer[1].Header().Rrtype)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, protect := range []bool{true, false} {
|
for _, protect := range []bool{true, false} {
|
||||||
|
|||||||
@@ -577,6 +577,8 @@ func setRewriteResult(res *Result, host string, dnsr []*rules.DNSRewrite, qtype
|
|||||||
res.IPList = append(res.IPList, ip)
|
res.IPList = append(res.IPList, ip)
|
||||||
|
|
||||||
log.Debug("rewrite: a/aaaa for %s is %s", host, ip)
|
log.Debug("rewrite: a/aaaa for %s is %s", host, ip)
|
||||||
|
} else if dnsRewrite.NewCNAME != "" {
|
||||||
|
res.CanonName = dnsRewrite.NewCNAME
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,25 +87,27 @@ func (s *DefaultStorage) MatchRequest(dReq *urlfilter.DNSRequest) (rws []*rules.
|
|||||||
// TODO(a.garipov): Check cnames for cycles on initialisation.
|
// TODO(a.garipov): Check cnames for cycles on initialisation.
|
||||||
cnames := stringutil.NewSet()
|
cnames := stringutil.NewSet()
|
||||||
host := dReq.Hostname
|
host := dReq.Hostname
|
||||||
|
var lastCNAMERule *rules.NetworkRule
|
||||||
for len(rrules) > 0 && rrules[0].DNSRewrite != nil && rrules[0].DNSRewrite.NewCNAME != "" {
|
for len(rrules) > 0 && rrules[0].DNSRewrite != nil && rrules[0].DNSRewrite.NewCNAME != "" {
|
||||||
rule := rrules[0]
|
lastCNAMERule = rrules[0]
|
||||||
rwAns := rule.DNSRewrite.NewCNAME
|
lastDNSRewrite := lastCNAMERule.DNSRewrite
|
||||||
|
rwAns := lastDNSRewrite.NewCNAME
|
||||||
|
|
||||||
log.Debug("rewrite: cname for %s is %s", host, rwAns)
|
log.Debug("rewrite: cname for %s is %s", host, rwAns)
|
||||||
|
|
||||||
if dReq.Hostname == rwAns {
|
if dReq.Hostname == rwAns {
|
||||||
// A request for the hostname itself is an exception rule.
|
// A request for the hostname itself is an exception lastCNAMERule.
|
||||||
// TODO(d.kolyshev): Check rewrite of a pattern onto itself.
|
// TODO(d.kolyshev): Check rewrite of a pattern onto itself.
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if host == rwAns && isWildcard(rule.RuleText) {
|
if host == rwAns && isWildcard(lastCNAMERule.RuleText) {
|
||||||
// An "*.example.com → sub.example.com" rewrite matching in a loop.
|
// An "*.example.com → sub.example.com" rewrite matching in a loop.
|
||||||
//
|
//
|
||||||
// See https://github.com/AdguardTeam/AdGuardHome/issues/4016.
|
// See https://github.com/AdguardTeam/AdGuardHome/issues/4016.
|
||||||
|
|
||||||
return []*rules.DNSRewrite{rule.DNSRewrite}
|
return []*rules.DNSRewrite{lastDNSRewrite}
|
||||||
}
|
}
|
||||||
|
|
||||||
if cnames.Has(rwAns) {
|
if cnames.Has(rwAns) {
|
||||||
@@ -129,14 +131,19 @@ func (s *DefaultStorage) MatchRequest(dReq *urlfilter.DNSRequest) (rws []*rules.
|
|||||||
host = rwAns
|
host = rwAns
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.collectDNSRewrites(rrules, dReq.DNSType)
|
return s.collectDNSRewrites(rrules, lastCNAMERule, dReq.DNSType)
|
||||||
}
|
}
|
||||||
|
|
||||||
// collectDNSRewrites filters DNSRewrite by question type.
|
// collectDNSRewrites filters DNSRewrite by question type.
|
||||||
func (s *DefaultStorage) collectDNSRewrites(
|
func (s *DefaultStorage) collectDNSRewrites(
|
||||||
rewrites []*rules.NetworkRule,
|
rewrites []*rules.NetworkRule,
|
||||||
|
cnameRule *rules.NetworkRule,
|
||||||
qtyp uint16,
|
qtyp uint16,
|
||||||
) (rws []*rules.DNSRewrite) {
|
) (rws []*rules.DNSRewrite) {
|
||||||
|
if cnameRule != nil {
|
||||||
|
rewrites = append([]*rules.NetworkRule{cnameRule}, rewrites...)
|
||||||
|
}
|
||||||
|
|
||||||
for _, rewrite := range rewrites {
|
for _, rewrite := range rewrites {
|
||||||
dnsRewrite := rewrite.DNSRewrite
|
dnsRewrite := rewrite.DNSRewrite
|
||||||
if matchesQType(dnsRewrite, qtyp) {
|
if matchesQType(dnsRewrite, qtyp) {
|
||||||
@@ -224,16 +231,16 @@ func (s *DefaultStorage) resetRules() (err error) {
|
|||||||
|
|
||||||
// matchesQType returns true if dnsrewrite matches the question type qt.
|
// matchesQType returns true if dnsrewrite matches the question type qt.
|
||||||
func matchesQType(dnsrr *rules.DNSRewrite, qt uint16) (ok bool) {
|
func matchesQType(dnsrr *rules.DNSRewrite, qt uint16) (ok bool) {
|
||||||
// Add CNAMEs, since they match for all types requests.
|
|
||||||
if dnsrr.RRType == dns.TypeCNAME || dnsrr.NewCNAME != "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reject types other than A and AAAA.
|
// Reject types other than A and AAAA.
|
||||||
if qt != dns.TypeA && qt != dns.TypeAAAA {
|
if qt != dns.TypeA && qt != dns.TypeAAAA {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add CNAMEs, since they match for all types requests.
|
||||||
|
if dnsrr.RRType == dns.TypeCNAME || dnsrr.NewCNAME != "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
return dnsrr.RRType == qt
|
return dnsrr.RRType == qt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ func TestDefaultStorage_MatchRequest(t *testing.T) {
|
|||||||
name: "rewritten_a",
|
name: "rewritten_a",
|
||||||
host: "www.host.com",
|
host: "www.host.com",
|
||||||
wantDNSRewrites: []*rules.DNSRewrite{{
|
wantDNSRewrites: []*rules.DNSRewrite{{
|
||||||
|
Value: nil,
|
||||||
|
NewCNAME: "host.com",
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeNone,
|
||||||
|
}, {
|
||||||
Value: net.IP{1, 2, 3, 4}.To16(),
|
Value: net.IP{1, 2, 3, 4}.To16(),
|
||||||
NewCNAME: "",
|
NewCNAME: "",
|
||||||
RCode: dns.RcodeSuccess,
|
RCode: dns.RcodeSuccess,
|
||||||
@@ -138,6 +143,11 @@ func TestDefaultStorage_MatchRequest(t *testing.T) {
|
|||||||
name: "rewritten_aaaa",
|
name: "rewritten_aaaa",
|
||||||
host: "www.host.com",
|
host: "www.host.com",
|
||||||
wantDNSRewrites: []*rules.DNSRewrite{{
|
wantDNSRewrites: []*rules.DNSRewrite{{
|
||||||
|
Value: nil,
|
||||||
|
NewCNAME: "host.com",
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeNone,
|
||||||
|
}, {
|
||||||
Value: net.ParseIP("1:2:3::4"),
|
Value: net.ParseIP("1:2:3::4"),
|
||||||
NewCNAME: "",
|
NewCNAME: "",
|
||||||
RCode: dns.RcodeSuccess,
|
RCode: dns.RcodeSuccess,
|
||||||
@@ -169,6 +179,11 @@ func TestDefaultStorage_MatchRequest(t *testing.T) {
|
|||||||
name: "wildcard_cname_interaction",
|
name: "wildcard_cname_interaction",
|
||||||
host: "www.host2.com",
|
host: "www.host2.com",
|
||||||
wantDNSRewrites: []*rules.DNSRewrite{{
|
wantDNSRewrites: []*rules.DNSRewrite{{
|
||||||
|
Value: nil,
|
||||||
|
NewCNAME: "host.com",
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeNone,
|
||||||
|
}, {
|
||||||
Value: net.IP{1, 2, 3, 4}.To16(),
|
Value: net.IP{1, 2, 3, 4}.To16(),
|
||||||
NewCNAME: "",
|
NewCNAME: "",
|
||||||
RCode: dns.RcodeSuccess,
|
RCode: dns.RcodeSuccess,
|
||||||
@@ -184,6 +199,11 @@ func TestDefaultStorage_MatchRequest(t *testing.T) {
|
|||||||
name: "two_cnames",
|
name: "two_cnames",
|
||||||
host: "b.host.com",
|
host: "b.host.com",
|
||||||
wantDNSRewrites: []*rules.DNSRewrite{{
|
wantDNSRewrites: []*rules.DNSRewrite{{
|
||||||
|
Value: nil,
|
||||||
|
NewCNAME: "somehost.com",
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeNone,
|
||||||
|
}, {
|
||||||
Value: net.IP{0, 0, 0, 0}.To16(),
|
Value: net.IP{0, 0, 0, 0}.To16(),
|
||||||
NewCNAME: "",
|
NewCNAME: "",
|
||||||
RCode: dns.RcodeSuccess,
|
RCode: dns.RcodeSuccess,
|
||||||
@@ -194,6 +214,11 @@ func TestDefaultStorage_MatchRequest(t *testing.T) {
|
|||||||
name: "two_cnames_and_wildcard",
|
name: "two_cnames_and_wildcard",
|
||||||
host: "b.host3.com",
|
host: "b.host3.com",
|
||||||
wantDNSRewrites: []*rules.DNSRewrite{{
|
wantDNSRewrites: []*rules.DNSRewrite{{
|
||||||
|
Value: nil,
|
||||||
|
NewCNAME: "x.host.com",
|
||||||
|
RCode: dns.RcodeSuccess,
|
||||||
|
RRType: dns.TypeNone,
|
||||||
|
}, {
|
||||||
Value: net.IP{1, 2, 3, 5}.To16(),
|
Value: net.IP{1, 2, 3, 5}.To16(),
|
||||||
NewCNAME: "",
|
NewCNAME: "",
|
||||||
RCode: dns.RcodeSuccess,
|
RCode: dns.RcodeSuccess,
|
||||||
|
|||||||
Reference in New Issue
Block a user