@cryptotaxi247 / kubo / commits / 543c5da34

explicit construction of DNS resolver

vyzo committed Apr 12, 2021 at 13:46 UTC 543c5da34a9678b72dfeaaa28bcb66e8d57cd263
9 files changed +60 -14
core/commands/dns.go
+6 -1
@@ -61,9 +61,14 @@ The resolver can recursively resolve:
61 cmds.BoolOption(dnsRecursiveOptionName, "r", "Resolve until the result is not a DNS link.").WithDefault(true),
62 },
63 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
64 + node, err := cmdenv.GetNode(env)
65 + if err != nil {
66 + return err
67 + }
68 +
69 recursive, _ := req.Options[dnsRecursiveOptionName].(bool)
70 name := req.Arguments[0]
66 - resolver := namesys.NewDNSResolver()
71 + resolver := namesys.NewDNSResolver(node.DNSResolver.LookupTXT)
72
73 var routing []nsopts.ResolveOpt
74 if !recursive {
core/commands/swarm.go
+16 -6
@@ -360,6 +360,11 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N
360 cmds.StringArg("address", true, true, "Address of peer to connect to.").EnableStdin(),
361 },
362 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
363 + node, err := cmdenv.GetNode(env)
364 + if err != nil {
365 + return err
366 + }
367 +
368 api, err := cmdenv.GetApi(env, req)
369 if err != nil {
370 return err
@@ -367,7 +372,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N
372
373 addrs := req.Arguments
374
370 - pis, err := parseAddresses(req.Context, addrs)
375 + pis, err := parseAddresses(req.Context, addrs, node.DNSResolver)
376 if err != nil {
377 return err
378 }
@@ -408,12 +413,17 @@ it will reconnect.
413 cmds.StringArg("address", true, true, "Address of peer to disconnect from.").EnableStdin(),
414 },
415 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
416 + node, err := cmdenv.GetNode(env)
417 + if err != nil {
418 + return err
419 + }
420 +
421 api, err := cmdenv.GetApi(env, req)
422 if err != nil {
423 return err
424 }
425
416 - addrs, err := parseAddresses(req.Context, req.Arguments)
426 + addrs, err := parseAddresses(req.Context, req.Arguments, node.DNSResolver)
427 if err != nil {
428 return err
429 }
@@ -453,9 +463,9 @@ it will reconnect.
463
464 // parseAddresses is a function that takes in a slice of string peer addresses
465 // (multiaddr + peerid) and returns a slice of properly constructed peers
456 -func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error) {
466 +func parseAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]peer.AddrInfo, error) {
467 // resolve addresses
458 - maddrs, err := resolveAddresses(ctx, addrs)
468 + maddrs, err := resolveAddresses(ctx, addrs, rslv)
469 if err != nil {
470 return nil, err
471 }
@@ -464,7 +474,7 @@ func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error
474 }
475
476 // resolveAddresses resolves addresses parallelly
467 -func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, error) {
477 +func resolveAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]ma.Multiaddr, error) {
478 ctx, cancel := context.WithTimeout(ctx, dnsResolveTimeout)
479 defer cancel()
480
@@ -488,7 +498,7 @@ func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, erro
498 wg.Add(1)
499 go func(maddr ma.Multiaddr) {
500 defer wg.Done()
491 - raddrs, err := madns.Resolve(ctx, maddr)
501 + raddrs, err := rslv.Resolve(ctx, maddr)
502 if err != nil {
503 resolveErrC <- err
504 return
core/core.go
+2
@@ -40,6 +40,7 @@ import (
40 "github.com/libp2p/go-libp2p/p2p/discovery"
41 p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic"
42 ma "github.com/multiformats/go-multiaddr"
43 + madns "github.com/multiformats/go-multiaddr-dns"
44
45 "github.com/ipfs/go-ipfs/core/bootstrap"
46 "github.com/ipfs/go-ipfs/core/node"
@@ -88,6 +89,7 @@ type IpfsNode struct {
89 Filters *ma.Filters `optional:"true"`
90 Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper
91 Routing routing.Routing `optional:"true"` // the routing system. recommend ipfs-dht
92 + DNSResolver *madns.Resolver // the DNS resolver
93 Exchange exchange.Interface // the block exchange + strategy (bitswap)
94 Namesys namesys.NameSystem // the name system, resolves paths to hashes
95 Provider provider.System // the value provider system
core/coreapi/coreapi.go
+6 -3
@@ -36,6 +36,7 @@ import (
36 routing "github.com/libp2p/go-libp2p-core/routing"
37 pubsub "github.com/libp2p/go-libp2p-pubsub"
38 record "github.com/libp2p/go-libp2p-record"
39 + madns "github.com/multiformats/go-multiaddr-dns"
40
41 "github.com/ipfs/go-ipfs/core"
42 "github.com/ipfs/go-ipfs/core/node"
@@ -62,8 +63,9 @@ type CoreAPI struct {
63 recordValidator record.Validator
64 exchange exchange.Interface
65
65 - namesys namesys.NameSystem
66 - routing routing.Routing
66 + namesys namesys.NameSystem
67 + routing routing.Routing
68 + dnsResolver *madns.Resolver
69
70 provider provider.System
71
@@ -174,6 +176,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
176 recordValidator: n.RecordValidator,
177 exchange: n.Exchange,
178 routing: n.Routing,
179 + dnsResolver: n.DNSResolver,
180
181 provider: n.Provider,
182
@@ -212,7 +215,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
215 }
216
217 subApi.routing = offlineroute.NewOfflineRouter(subApi.repo.Datastore(), subApi.recordValidator)
215 - subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), cs)
218 + subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), subApi.dnsResolver, cs)
219 subApi.provider = provider.NewOfflineProvider()
220
221 subApi.peerstore = nil
core/coreapi/name.go
+1 -1
@@ -95,7 +95,7 @@ func (api *NameAPI) Search(ctx context.Context, name string, opts ...caopts.Name
95 var resolver namesys.Resolver = api.namesys
96
97 if !options.Cache {
98 - resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), 0)
98 + resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), api.dnsResolver, 0)
99 }
100
101 if !strings.HasPrefix(name, "/ipns/") {
core/node/dns.go new
+11
@@ -0,0 +1,11 @@
1 +package node
2 +
3 +import (
4 + config "github.com/ipfs/go-ipfs-config"
5 + madns "github.com/multiformats/go-multiaddr-dns"
6 +)
7 +
8 +func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
9 + // TODO custom resolvers from config
10 + return madns.DefaultResolver, nil
11 +}
core/node/groups.go
+3
@@ -30,6 +30,7 @@ var BaseLibP2P = fx.Options(
30 fx.Provide(libp2p.PNet),
31 fx.Provide(libp2p.ConnectionManager),
32 fx.Provide(libp2p.Host),
33 + fx.Provide(libp2p.MultiaddrResolver),
34
35 fx.Provide(libp2p.DiscoveryHandler),
36
@@ -264,6 +265,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
265 return fx.Options(
266 fx.Provide(OnlineExchange(shouldBitswapProvide)),
267 maybeProvide(Graphsync, cfg.Experimental.GraphsyncEnabled),
268 + fx.Provide(DNSResolver),
269 fx.Provide(Namesys(ipnsCacheSize)),
270 fx.Provide(Peering),
271 PeerWith(cfg.Peering.Peers...),
@@ -281,6 +283,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
283 func Offline(cfg *config.Config) fx.Option {
284 return fx.Options(
285 fx.Provide(offline.Exchange),
286 + fx.Provide(DNSResolver),
287 fx.Provide(Namesys(0)),
288 fx.Provide(offroute.NewOfflineRouter),
289 OfflineProviders(cfg.Experimental.StrategicProviding, cfg.Reprovider.Strategy, cfg.Reprovider.Interval),
core/node/ipns.go
+4 -3
@@ -10,6 +10,7 @@ import (
10 "github.com/libp2p/go-libp2p-core/peerstore"
11 "github.com/libp2p/go-libp2p-core/routing"
12 "github.com/libp2p/go-libp2p-record"
13 + madns "github.com/multiformats/go-multiaddr-dns"
14
15 "github.com/ipfs/go-ipfs/repo"
16 "github.com/ipfs/go-namesys"
@@ -27,9 +28,9 @@ func RecordValidator(ps peerstore.Peerstore) record.Validator {
28 }
29
30 // Namesys creates new name system
30 -func Namesys(cacheSize int) func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) {
31 - return func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) {
32 - return namesys.NewNameSystem(rt, repo.Datastore(), cacheSize), nil
31 +func Namesys(cacheSize int) func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
32 + return func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
33 + return namesys.NewNameSystem(rt, repo.Datastore(), rslv, cacheSize), nil
34 }
35 }
36
core/node/libp2p/dns.go new
+11
@@ -0,0 +1,11 @@
1 +package libp2p
2 +
3 +import (
4 + "github.com/libp2p/go-libp2p"
5 + madns "github.com/multiformats/go-multiaddr-dns"
6 +)
7 +
8 +func MultiaddrResolver(rslv *madns.Resolver) (opts Libp2pOpts, err error) {
9 + opts.Opts = append(opts.Opts, libp2p.MultiaddrResolver(rslv))
10 + return opts, nil
11 +}