master
go 56 lines 2.06 KB
Raw
1 package node
2
3 import (
4 "math"
5 "time"
6
7 "github.com/ipfs/boxo/gateway"
8 config "github.com/ipfs/kubo/config"
9 doh "github.com/libp2p/go-doh-resolver"
10 madns "github.com/multiformats/go-multiaddr-dns"
11 )
12
13 // Compile-time interface check: *madns.Resolver (returned by gateway.NewDNSResolver
14 // and madns.NewResolver) must implement madns.BasicResolver for p2pForgeResolver fallback.
15 var _ madns.BasicResolver = (*madns.Resolver)(nil)
16
17 func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
18 var dohOpts []doh.Option
19 if !cfg.DNS.MaxCacheTTL.IsDefault() {
20 dohOpts = append(dohOpts, doh.WithMaxCacheTTL(cfg.DNS.MaxCacheTTL.WithDefault(time.Duration(math.MaxUint32)*time.Second)))
21 }
22
23 // Replace "auto" DNS resolver placeholders with autoconf values
24 resolvers := cfg.DNSResolversWithAutoConf()
25
26 // Get base resolver from boxo (handles custom DoH resolvers per eTLD)
27 baseResolver, err := gateway.NewDNSResolver(resolvers, dohOpts...)
28 if err != nil {
29 return nil, err
30 }
31
32 // Check if we should skip network DNS lookups for p2p-forge domains
33 skipAutoTLSDNS := cfg.AutoTLS.SkipDNSLookup.WithDefault(config.DefaultAutoTLSSkipDNSLookup)
34 if !skipAutoTLSDNS {
35 // Local resolution disabled, use network DNS for everything
36 return baseResolver, nil
37 }
38
39 // Build list of p2p-forge domains to resolve locally without network I/O.
40 // AutoTLS hostnames encode IP addresses directly (e.g., 1-2-3-4.peerID.libp2p.direct),
41 // so DNS lookups are wasteful. We resolve these in-memory when possible.
42 forgeDomains := []string{config.DefaultDomainSuffix}
43 customDomain := cfg.AutoTLS.DomainSuffix.WithDefault(config.DefaultDomainSuffix)
44 if customDomain != config.DefaultDomainSuffix {
45 forgeDomains = append(forgeDomains, customDomain)
46 }
47 forgeResolver := NewP2PForgeResolver(forgeDomains, baseResolver)
48
49 // Register p2p-forge resolver for each domain, fallback to baseResolver for others
50 opts := []madns.Option{madns.WithDefaultResolver(baseResolver)}
51 for _, domain := range forgeDomains {
52 opts = append(opts, madns.WithDomainResolver(domain+".", forgeResolver))
53 }
54
55 return madns.NewResolver(opts...)
56 }