From 0ef2f8c9eac4b4f2716f4d4e3d10bbfeefdced5e Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 13 Apr 2021 17:48:20 +0300 Subject: [PATCH] update resolver config parsing, add eth. resolver by default --- core/node/dns.go | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/core/node/dns.go b/core/node/dns.go index 878ebc43d..50f0f609e 100644 --- a/core/node/dns.go +++ b/core/node/dns.go @@ -7,21 +7,48 @@ import ( config "github.com/ipfs/go-ipfs-config" doh "github.com/libp2p/go-doh-resolver" madns "github.com/multiformats/go-multiaddr-dns" + + "github.com/miekg/dns" ) +const ethResolverURL = "https://eth.link/dns-query" + +func newResolver(url string) (madns.BasicResolver, error) { + if !strings.HasPrefix(url, "https://") { + return nil, fmt.Errorf("invalid resolver url: %s", url) + } + + return doh.NewResolver(url), nil +} + func DNSResolver(cfg *config.Config) (*madns.Resolver, error) { var opts []madns.Option - if url := cfg.DNS.DefaultResolver; url != "" { - if !strings.HasPrefix(url, "https://") { - return nil, fmt.Errorf("invalid default resolver url: %s", url) + + hasEth := false + for domain, url := range cfg.DNS.Resolvers { + if !dns.IsFqdn(domain) { + return nil, fmt.Errorf("invalid domain %s; must be FQDN", domain) } - opts = append(opts, madns.WithDefaultResolver(doh.NewResolver(url))) - } - for domain, url := range cfg.DNS.CustomResolvers { - if !strings.HasPrefix(url, "https://") { - return nil, fmt.Errorf("invalid domain resolver url for %s: %s", domain, url) + + rslv, err := newResolver(url) + if err != nil { + return nil, fmt.Errorf("bad resolver for %s: %w", domain, err) + } + + if domain != "." { + opts = append(opts, madns.WithDomainResolver(domain, rslv)) + } else { + opts = append(opts, madns.WithDefaultResolver(rslv)) + } + + if domain == "eth." { + hasEth = true } - opts = append(opts, madns.WithDomainResolver(domain, doh.NewResolver(url))) } + + if !hasEth { + opts = append(opts, madns.WithDomainResolver("eth.", doh.NewResolver(ethResolverURL))) + } + return madns.NewResolver(opts...) }