From e557971ae884e960ab4b5e25641b79b1669f1e63 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Wed, 11 Mar 2026 13:20:27 +0000 Subject: [PATCH] hotfix(dns): allow to use plain upstream type with selected builtin providers --- internal/configuration/settings/dns.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/internal/configuration/settings/dns.go b/internal/configuration/settings/dns.go index dcd29c36..567812c6 100644 --- a/internal/configuration/settings/dns.go +++ b/internal/configuration/settings/dns.go @@ -69,19 +69,27 @@ func (d DNS) validate() (err error) { } providers := provider.NewProviders() + selectedHasPlainIPv4, selectedHasPlainIPv6 := false, false for _, providerName := range d.Providers { - _, err := providers.Get(providerName) + provider, err := providers.Get(providerName) if err != nil { return err } + if !selectedHasPlainIPv4 && len(provider.Plain.IPv4) > 0 { + selectedHasPlainIPv4 = true + } + if !selectedHasPlainIPv6 && len(provider.Plain.IPv6) > 0 { + selectedHasPlainIPv6 = true + } } if d.UpstreamType == DNSUpstreamTypePlain { - if *d.IPv6 && !slices.ContainsFunc(d.UpstreamPlainAddresses, func(addrPort netip.AddrPort) bool { - return addrPort.Addr().Is6() - }) { + if *d.IPv6 && !selectedHasPlainIPv6 && + !slices.ContainsFunc(d.UpstreamPlainAddresses, func(addrPort netip.AddrPort) bool { + return addrPort.Addr().Is6() + }) { return fmt.Errorf("%w: in %d addresses", ErrDNSUpstreamPlainNoIPv6, len(d.UpstreamPlainAddresses)) - } else if !slices.ContainsFunc(d.UpstreamPlainAddresses, func(addrPort netip.AddrPort) bool { + } else if !selectedHasPlainIPv4 && !slices.ContainsFunc(d.UpstreamPlainAddresses, func(addrPort netip.AddrPort) bool { return addrPort.Addr().Is4() }) { return fmt.Errorf("%w: in %d addresses", ErrDNSUpstreamPlainNoIPv4, len(d.UpstreamPlainAddresses))