Pull request: all: do not check local domains when dhcp srv is off

Updates #3028.

Squashed commit of the following:

commit 49d3ca5c9de0468ccb1792e9de263fd66e30d79c
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Thu Apr 29 15:35:32 2021 +0300

    all: do not check local domains when dhcp srv is off
This commit is contained in:
Ainar Garipov 2021-04-29 16:00:07 +03:00
parent c8092fe34d
commit a06543a1d5
6 changed files with 30 additions and 6 deletions

View File

@ -19,11 +19,13 @@ and this project adheres to
### Fixed ### Fixed
- Local domain name handling when the DHCP server is disabled ([#3028]).
- Normalization of perviously-saved invalid static DHCP leases ([#3027]). - Normalization of perviously-saved invalid static DHCP leases ([#3027]).
- Validation of IPv6 addresses with zones in system resolvers ([#3022]). - Validation of IPv6 addresses with zones in system resolvers ([#3022]).
[#3022]: https://github.com/AdguardTeam/AdGuardHome/issues/3022 [#3022]: https://github.com/AdguardTeam/AdGuardHome/issues/3022
[#3027]: https://github.com/AdguardTeam/AdGuardHome/issues/3027 [#3027]: https://github.com/AdguardTeam/AdGuardHome/issues/3027
[#3028]: https://github.com/AdguardTeam/AdGuardHome/issues/3028

View File

@ -133,6 +133,7 @@ type Server struct {
// ServerInterface is an interface for servers. // ServerInterface is an interface for servers.
type ServerInterface interface { type ServerInterface interface {
Enabled() (ok bool)
Leases(flags int) []Lease Leases(flags int) []Lease
SetOnLeaseChanged(onLeaseChanged OnLeaseChangedT) SetOnLeaseChanged(onLeaseChanged OnLeaseChangedT)
} }
@ -207,6 +208,11 @@ func Create(conf ServerConfig) *Server {
return s return s
} }
// Enabled returns true when the server is enabled.
func (s *Server) Enabled() (ok bool) {
return s.conf.Enabled
}
// server calls this function after DB is updated // server calls this function after DB is updated
func (s *Server) onNotify(flags uint32) { func (s *Server) onNotify(flags uint32) {
if flags == LeaseChangedDBStore { if flags == LeaseChangedDBStore {

View File

@ -249,6 +249,10 @@ func (s *Server) hostToIP(host string) (ip net.IP, ok bool) {
// //
// TODO(a.garipov): Adapt to AAAA as well. // TODO(a.garipov): Adapt to AAAA as well.
func (s *Server) processInternalHosts(dctx *dnsContext) (rc resultCode) { func (s *Server) processInternalHosts(dctx *dnsContext) (rc resultCode) {
if !s.dhcpServer.Enabled() {
return resultCodeSuccess
}
req := dctx.proxyCtx.Req req := dctx.proxyCtx.Req
q := req.Question[0] q := req.Question[0]

View File

@ -90,6 +90,7 @@ func TestServer_ProcessInternalHosts_localRestriction(t *testing.T) {
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
s := &Server{ s := &Server{
dhcpServer: &testDHCP{},
localDomainSuffix: defaultLocalDomainSuffix, localDomainSuffix: defaultLocalDomainSuffix,
tableHostToIP: hostToIPTable{ tableHostToIP: hostToIPTable{
"example": knownIP, "example": knownIP,
@ -201,6 +202,7 @@ func TestServer_ProcessInternalHosts(t *testing.T) {
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
s := &Server{ s := &Server{
dhcpServer: &testDHCP{},
localDomainSuffix: tc.suffix, localDomainSuffix: tc.suffix,
tableHostToIP: hostToIPTable{ tableHostToIP: hostToIPTable{
"example": knownIP, "example": knownIP,
@ -318,7 +320,7 @@ func TestLocalRestriction(t *testing.T) {
} }
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
err = s.handleDNSRequest(nil, pctx) err = s.handleDNSRequest(nil, pctx)
require.Nil(t, err) require.NoError(t, err)
require.NotNil(t, pctx.Res) require.NotNil(t, pctx.Res)
require.Len(t, pctx.Res.Answer, tc.wantLen) require.Len(t, pctx.Res.Answer, tc.wantLen)
if tc.wantLen > 0 { if tc.wantLen > 0 {

View File

@ -75,6 +75,7 @@ func createTestServer(
require.NotNil(t, snd) require.NotNil(t, snd)
s, err = NewServer(DNSCreateParams{ s, err = NewServer(DNSCreateParams{
DHCPServer: &testDHCP{},
DNSFilter: f, DNSFilter: f,
SubnetDetector: snd, SubnetDetector: snd,
}) })
@ -736,6 +737,7 @@ func TestBlockedCustomIP(t *testing.T) {
var s *Server var s *Server
s, err = NewServer(DNSCreateParams{ s, err = NewServer(DNSCreateParams{
DHCPServer: &testDHCP{},
DNSFilter: dnsfilter.New(&dnsfilter.Config{}, filters), DNSFilter: dnsfilter.New(&dnsfilter.Config{}, filters),
SubnetDetector: snd, SubnetDetector: snd,
}) })
@ -873,6 +875,7 @@ func TestRewrite(t *testing.T) {
var s *Server var s *Server
s, err = NewServer(DNSCreateParams{ s, err = NewServer(DNSCreateParams{
DHCPServer: &testDHCP{},
DNSFilter: f, DNSFilter: f,
SubnetDetector: snd, SubnetDetector: snd,
}) })
@ -1016,11 +1019,13 @@ func TestMatchDNSName(t *testing.T) {
type testDHCP struct{} type testDHCP struct{}
func (d *testDHCP) Enabled() (ok bool) { return true }
func (d *testDHCP) Leases(flags int) []dhcpd.Lease { func (d *testDHCP) Leases(flags int) []dhcpd.Lease {
l := dhcpd.Lease{ l := dhcpd.Lease{
IP: net.IP{127, 0, 0, 1}, IP: net.IP{192, 168, 12, 34},
HWAddr: net.HardwareAddr{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}, HWAddr: net.HardwareAddr{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA},
Hostname: "localhost", Hostname: "myhost",
} }
return []dhcpd.Lease{l} return []dhcpd.Lease{l}
@ -1056,7 +1061,7 @@ func TestPTRResponseFromDHCPLeases(t *testing.T) {
}) })
addr := s.dnsProxy.Addr(proxy.ProtoUDP) addr := s.dnsProxy.Addr(proxy.ProtoUDP)
req := createTestMessageWithType("1.0.0.127.in-addr.arpa.", dns.TypePTR) req := createTestMessageWithType("34.12.168.192.in-addr.arpa.", dns.TypePTR)
resp, err := dns.Exchange(req, addr.String()) resp, err := dns.Exchange(req, addr.String())
require.NoError(t, err) require.NoError(t, err)
@ -1064,11 +1069,11 @@ func TestPTRResponseFromDHCPLeases(t *testing.T) {
require.Len(t, resp.Answer, 1) require.Len(t, resp.Answer, 1)
assert.Equal(t, dns.TypePTR, resp.Answer[0].Header().Rrtype) assert.Equal(t, dns.TypePTR, resp.Answer[0].Header().Rrtype)
assert.Equal(t, "1.0.0.127.in-addr.arpa.", resp.Answer[0].Header().Name) assert.Equal(t, "34.12.168.192.in-addr.arpa.", resp.Answer[0].Header().Name)
ptr, ok := resp.Answer[0].(*dns.PTR) ptr, ok := resp.Answer[0].(*dns.PTR)
require.True(t, ok) require.True(t, ok)
assert.Equal(t, "localhost.", ptr.Ptr) assert.Equal(t, "myhost.", ptr.Ptr)
} }
func TestPTRResponseFromHosts(t *testing.T) { func TestPTRResponseFromHosts(t *testing.T) {
@ -1098,6 +1103,7 @@ func TestPTRResponseFromHosts(t *testing.T) {
var s *Server var s *Server
s, err = NewServer(DNSCreateParams{ s, err = NewServer(DNSCreateParams{
DHCPServer: &testDHCP{},
DNSFilter: dnsfilter.New(&c, nil), DNSFilter: dnsfilter.New(&c, nil),
SubnetDetector: snd, SubnetDetector: snd,
}) })

View File

@ -184,6 +184,10 @@ func setupConfig(args options) {
Context.dhcpServer = dhcpd.Create(config.DHCP) Context.dhcpServer = dhcpd.Create(config.DHCP)
if Context.dhcpServer == nil { if Context.dhcpServer == nil {
// TODO(a.garipov): There are a lot of places in the code right
// now which assume that the DHCP server can be nil despite this
// condition. Inspect them and perhaps rewrite them to use
// Enabled() instead.
log.Fatalf("can't initialize dhcp module") log.Fatalf("can't initialize dhcp module")
} }