Pull request: 3846 hosts querylog
Merge in DNS/adguard-home from 3846-hosts-querylog to master
Updates #3846.
Squashed commit of the following:
commit 722e96628b1ccca1a5b5a716b8bcb1da2aefcc3b
Merge: a20ad71e ed868fa4
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Nov 23 17:52:08 2021 +0300
Merge branch 'master' into 3846-hosts-querylog
commit a20ad71e723dbfa3483c3bdf9e4c8fd15c8b0e3c
Author: Ildar Kamalov <ik@adguard.com>
Date: Tue Nov 23 17:28:12 2021 +0300
client: fix variable name
commit 7013bff05d6cff75c6c25a38d614db8b4b2f0b87
Author: Ildar Kamalov <ik@adguard.com>
Date: Tue Nov 23 17:03:26 2021 +0300
client: fix missing import
commit 8e4a0fb047b4d39ab44a285f59420573d7ba5eec
Author: Ildar Kamalov <ik@adguard.com>
Date: Tue Nov 23 16:56:50 2021 +0300
client: handle system host filter id
commit abbbf662d2f3ea3f5d3569a9c45418e356adbf3c
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Nov 22 13:54:52 2021 +0300
all: imp code
commit c2df63e46e75f84f70a610d18deccbeee672ebda
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Nov 22 12:50:51 2021 +0300
querylog: rm unused test data
commit 8a1d47d266254fd4aedd4c61c7ea9e48168ea375
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Mon Nov 22 02:52:50 2021 +0300
aghnet: final imps
commit ade3acb4bebc8bdd755e56f314cdf19bc9375557
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Fri Nov 19 15:48:40 2021 +0300
all: add hosts container rule list support
This commit is contained in:
@@ -291,10 +291,13 @@ func decodeResultRules(dec *json.Decoder, ent *logEntry) {
|
||||
}
|
||||
|
||||
if d, ok := keyToken.(json.Delim); ok {
|
||||
if d == '}' {
|
||||
switch d {
|
||||
case '}':
|
||||
i++
|
||||
} else if d == ']' {
|
||||
case ']':
|
||||
return
|
||||
default:
|
||||
// Go on.
|
||||
}
|
||||
|
||||
continue
|
||||
@@ -312,6 +315,11 @@ func decodeResultRules(dec *json.Decoder, ent *logEntry) {
|
||||
}
|
||||
}
|
||||
|
||||
// decodeResultReverseHosts parses the dec's tokens into ent interpreting it as
|
||||
// the result of hosts container's $dnsrewrite rule. It assumes there are no
|
||||
// other occurrences of DNSRewriteResult in the entry since hosts container's
|
||||
// rewrites currently has the highest priority along the entire filtering
|
||||
// pipeline.
|
||||
func decodeResultReverseHosts(dec *json.Decoder, ent *logEntry) {
|
||||
for {
|
||||
itemToken, err := dec.Token()
|
||||
@@ -335,7 +343,25 @@ func decodeResultReverseHosts(dec *json.Decoder, ent *logEntry) {
|
||||
|
||||
return
|
||||
case string:
|
||||
ent.Result.ReverseHosts = append(ent.Result.ReverseHosts, v)
|
||||
v = dns.Fqdn(v)
|
||||
if res := &ent.Result; res.DNSRewriteResult == nil {
|
||||
res.DNSRewriteResult = &filtering.DNSRewriteResult{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Response: filtering.DNSRewriteResultResponse{
|
||||
dns.TypePTR: []rules.RRValue{v},
|
||||
},
|
||||
}
|
||||
|
||||
continue
|
||||
} else {
|
||||
res.DNSRewriteResult.RCode = dns.RcodeSuccess
|
||||
}
|
||||
|
||||
if rres := ent.Result.DNSRewriteResult; rres.Response == nil {
|
||||
rres.Response = filtering.DNSRewriteResultResponse{dns.TypePTR: []rules.RRValue{v}}
|
||||
} else {
|
||||
rres.Response[dns.TypePTR] = append(rres.Response[dns.TypePTR], v)
|
||||
}
|
||||
default:
|
||||
continue
|
||||
}
|
||||
@@ -407,9 +433,9 @@ func decodeResultDNSRewriteResultKey(key string, dec *json.Decoder, ent *logEntr
|
||||
ent.Result.DNSRewriteResult.Response = filtering.DNSRewriteResultResponse{}
|
||||
}
|
||||
|
||||
// TODO(a.garipov): I give up. This whole file is a mess.
|
||||
// Luckily, we can assume that this field is relatively rare and
|
||||
// just use the normal decoding and correct the values.
|
||||
// TODO(a.garipov): I give up. This whole file is a mess. Luckily, we
|
||||
// can assume that this field is relatively rare and just use the normal
|
||||
// decoding and correct the values.
|
||||
err = dec.Decode(&ent.Result.DNSRewriteResult.Response)
|
||||
if err != nil {
|
||||
log.Debug("decodeResultDNSRewriteResultKey response err: %s", err)
|
||||
@@ -463,7 +489,40 @@ func decodeResultDNSRewriteResult(dec *json.Decoder, ent *logEntry) {
|
||||
}
|
||||
}
|
||||
|
||||
// translateResult converts some fields of the ent.Result to the format
|
||||
// consistent with current implementation.
|
||||
func translateResult(ent *logEntry) {
|
||||
res := &ent.Result
|
||||
if res.Reason != filtering.RewrittenAutoHosts || len(res.IPList) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if res.DNSRewriteResult == nil {
|
||||
res.DNSRewriteResult = &filtering.DNSRewriteResult{
|
||||
RCode: dns.RcodeSuccess,
|
||||
}
|
||||
}
|
||||
|
||||
if res.DNSRewriteResult.Response == nil {
|
||||
res.DNSRewriteResult.Response = filtering.DNSRewriteResultResponse{}
|
||||
}
|
||||
|
||||
resp := res.DNSRewriteResult.Response
|
||||
for _, ip := range res.IPList {
|
||||
qType := dns.TypeAAAA
|
||||
if ip.To4() != nil {
|
||||
qType = dns.TypeA
|
||||
}
|
||||
|
||||
resp[qType] = append(resp[qType], ip)
|
||||
}
|
||||
|
||||
res.IPList = nil
|
||||
}
|
||||
|
||||
func decodeResult(dec *json.Decoder, ent *logEntry) {
|
||||
defer translateResult(ent)
|
||||
|
||||
for {
|
||||
keyToken, err := dec.Token()
|
||||
if err != nil {
|
||||
|
||||
@@ -36,7 +36,6 @@ func TestDecodeLogEntry(t *testing.T) {
|
||||
`"Result":{` +
|
||||
`"IsFiltered":true,` +
|
||||
`"Reason":3,` +
|
||||
`"ReverseHosts":["example.net"],` +
|
||||
`"IPList":["127.0.0.2"],` +
|
||||
`"Rules":[{"FilterListID":42,"Text":"||an.yandex.ru","IP":"127.0.0.2"},` +
|
||||
`{"FilterListID":43,"Text":"||an2.yandex.ru","IP":"127.0.0.3"}],` +
|
||||
@@ -58,10 +57,9 @@ func TestDecodeLogEntry(t *testing.T) {
|
||||
ClientProto: "",
|
||||
Answer: ans,
|
||||
Result: filtering.Result{
|
||||
IsFiltered: true,
|
||||
Reason: filtering.FilteredBlockList,
|
||||
ReverseHosts: []string{"example.net"},
|
||||
IPList: []net.IP{net.IPv4(127, 0, 0, 2)},
|
||||
IsFiltered: true,
|
||||
Reason: filtering.FilteredBlockList,
|
||||
IPList: []net.IP{net.IPv4(127, 0, 0, 2)},
|
||||
Rules: []*filtering.ResultRule{{
|
||||
FilterListID: 42,
|
||||
Text: "||an.yandex.ru",
|
||||
@@ -170,8 +168,7 @@ func TestDecodeLogEntry(t *testing.T) {
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
l := &logEntry{}
|
||||
decodeLogEntry(l, tc.log)
|
||||
decodeLogEntry(new(logEntry), tc.log)
|
||||
|
||||
s := logOutput.String()
|
||||
if tc.want == "" {
|
||||
@@ -185,3 +182,65 @@ func TestDecodeLogEntry(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeLogEntry_backwardCompatability(t *testing.T) {
|
||||
var (
|
||||
a1, a2 = net.IP{127, 0, 0, 1}.To16(), net.IP{127, 0, 0, 2}.To16()
|
||||
aaaa1, aaaa2 = net.ParseIP("::1"), net.ParseIP("::2")
|
||||
)
|
||||
|
||||
testCases := []struct {
|
||||
want *logEntry
|
||||
entry string
|
||||
name string
|
||||
}{{
|
||||
entry: `{"Result":{"ReverseHosts":["example.net","example.org"]}`,
|
||||
want: &logEntry{
|
||||
Result: filtering.Result{DNSRewriteResult: &filtering.DNSRewriteResult{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Response: filtering.DNSRewriteResultResponse{
|
||||
dns.TypePTR: []rules.RRValue{"example.net.", "example.org."},
|
||||
},
|
||||
}},
|
||||
},
|
||||
name: "reverse_hosts",
|
||||
}, {
|
||||
entry: `{"Result":{"IPList":["127.0.0.1","127.0.0.2","::1","::2"],"Reason":10}}`,
|
||||
want: &logEntry{
|
||||
Result: filtering.Result{
|
||||
DNSRewriteResult: &filtering.DNSRewriteResult{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Response: filtering.DNSRewriteResultResponse{
|
||||
dns.TypeA: []rules.RRValue{a1, a2},
|
||||
dns.TypeAAAA: []rules.RRValue{aaaa1, aaaa2},
|
||||
},
|
||||
},
|
||||
Reason: filtering.RewrittenAutoHosts,
|
||||
},
|
||||
},
|
||||
name: "iplist_autohosts",
|
||||
}, {
|
||||
entry: `{"Result":{"IPList":["127.0.0.1","127.0.0.2","::1","::2"],"Reason":9}}`,
|
||||
want: &logEntry{
|
||||
Result: filtering.Result{
|
||||
IPList: []net.IP{
|
||||
a1,
|
||||
a2,
|
||||
aaaa1,
|
||||
aaaa2,
|
||||
},
|
||||
Reason: filtering.Rewritten,
|
||||
},
|
||||
},
|
||||
name: "iplist_rewritten",
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
e := &logEntry{}
|
||||
decodeLogEntry(e, tc.entry)
|
||||
|
||||
assert.Equal(t, tc.want, e)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user