diff --git a/core/commands/dns.go b/core/commands/dns.go index 43c5f3d78..42a7c98c1 100644 --- a/core/commands/dns.go +++ b/core/commands/dns.go @@ -61,9 +61,14 @@ The resolver can recursively resolve: cmds.BoolOption(dnsRecursiveOptionName, "r", "Resolve until the result is not a DNS link.").WithDefault(true), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + recursive, _ := req.Options[dnsRecursiveOptionName].(bool) name := req.Arguments[0] - resolver := namesys.NewDNSResolver() + resolver := namesys.NewDNSResolver(node.DNSResolver.LookupTXT) var routing []nsopts.ResolveOpt if !recursive { diff --git a/core/commands/swarm.go b/core/commands/swarm.go index ad0526a25..b82a95630 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -360,6 +360,11 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N cmds.StringArg("address", true, true, "Address of peer to connect to.").EnableStdin(), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + api, err := cmdenv.GetApi(env, req) if err != nil { return err @@ -367,7 +372,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N addrs := req.Arguments - pis, err := parseAddresses(req.Context, addrs) + pis, err := parseAddresses(req.Context, addrs, node.DNSResolver) if err != nil { return err } @@ -408,12 +413,17 @@ it will reconnect. cmds.StringArg("address", true, true, "Address of peer to disconnect from.").EnableStdin(), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { + node, err := cmdenv.GetNode(env) + if err != nil { + return err + } + api, err := cmdenv.GetApi(env, req) if err != nil { return err } - addrs, err := parseAddresses(req.Context, req.Arguments) + addrs, err := parseAddresses(req.Context, req.Arguments, node.DNSResolver) if err != nil { return err } @@ -453,9 +463,9 @@ it will reconnect. // parseAddresses is a function that takes in a slice of string peer addresses // (multiaddr + peerid) and returns a slice of properly constructed peers -func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error) { +func parseAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]peer.AddrInfo, error) { // resolve addresses - maddrs, err := resolveAddresses(ctx, addrs) + maddrs, err := resolveAddresses(ctx, addrs, rslv) if err != nil { return nil, err } @@ -464,7 +474,7 @@ func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error } // resolveAddresses resolves addresses parallelly -func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, error) { +func resolveAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]ma.Multiaddr, error) { ctx, cancel := context.WithTimeout(ctx, dnsResolveTimeout) defer cancel() @@ -488,7 +498,7 @@ func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, erro wg.Add(1) go func(maddr ma.Multiaddr) { defer wg.Done() - raddrs, err := madns.Resolve(ctx, maddr) + raddrs, err := rslv.Resolve(ctx, maddr) if err != nil { resolveErrC <- err return diff --git a/core/core.go b/core/core.go index 7c8737a6a..75fc95ff7 100644 --- a/core/core.go +++ b/core/core.go @@ -40,6 +40,7 @@ import ( "github.com/libp2p/go-libp2p/p2p/discovery" p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic" ma "github.com/multiformats/go-multiaddr" + madns "github.com/multiformats/go-multiaddr-dns" "github.com/ipfs/go-ipfs/core/bootstrap" "github.com/ipfs/go-ipfs/core/node" @@ -88,6 +89,7 @@ type IpfsNode struct { Filters *ma.Filters `optional:"true"` Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper Routing routing.Routing `optional:"true"` // the routing system. recommend ipfs-dht + DNSResolver *madns.Resolver // the DNS resolver Exchange exchange.Interface // the block exchange + strategy (bitswap) Namesys namesys.NameSystem // the name system, resolves paths to hashes Provider provider.System // the value provider system diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go index 672b42645..309f4863c 100644 --- a/core/coreapi/coreapi.go +++ b/core/coreapi/coreapi.go @@ -36,6 +36,7 @@ import ( routing "github.com/libp2p/go-libp2p-core/routing" pubsub "github.com/libp2p/go-libp2p-pubsub" record "github.com/libp2p/go-libp2p-record" + madns "github.com/multiformats/go-multiaddr-dns" "github.com/ipfs/go-ipfs/core" "github.com/ipfs/go-ipfs/core/node" @@ -62,8 +63,9 @@ type CoreAPI struct { recordValidator record.Validator exchange exchange.Interface - namesys namesys.NameSystem - routing routing.Routing + namesys namesys.NameSystem + routing routing.Routing + dnsResolver *madns.Resolver provider provider.System @@ -174,6 +176,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e recordValidator: n.RecordValidator, exchange: n.Exchange, routing: n.Routing, + dnsResolver: n.DNSResolver, provider: n.Provider, @@ -212,7 +215,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e } subApi.routing = offlineroute.NewOfflineRouter(subApi.repo.Datastore(), subApi.recordValidator) - subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), cs) + subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), subApi.dnsResolver, cs) subApi.provider = provider.NewOfflineProvider() subApi.peerstore = nil diff --git a/core/coreapi/name.go b/core/coreapi/name.go index babb7c4a8..213e7f6af 100644 --- a/core/coreapi/name.go +++ b/core/coreapi/name.go @@ -95,7 +95,7 @@ func (api *NameAPI) Search(ctx context.Context, name string, opts ...caopts.Name var resolver namesys.Resolver = api.namesys if !options.Cache { - resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), 0) + resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), api.dnsResolver, 0) } if !strings.HasPrefix(name, "/ipns/") { diff --git a/core/node/dns.go b/core/node/dns.go new file mode 100644 index 000000000..72c89903c --- /dev/null +++ b/core/node/dns.go @@ -0,0 +1,11 @@ +package node + +import ( + config "github.com/ipfs/go-ipfs-config" + madns "github.com/multiformats/go-multiaddr-dns" +) + +func DNSResolver(cfg *config.Config) (*madns.Resolver, error) { + // TODO custom resolvers from config + return madns.DefaultResolver, nil +} diff --git a/core/node/groups.go b/core/node/groups.go index 90245ba05..686304339 100644 --- a/core/node/groups.go +++ b/core/node/groups.go @@ -30,6 +30,7 @@ var BaseLibP2P = fx.Options( fx.Provide(libp2p.PNet), fx.Provide(libp2p.ConnectionManager), fx.Provide(libp2p.Host), + fx.Provide(libp2p.MultiaddrResolver), fx.Provide(libp2p.DiscoveryHandler), @@ -264,6 +265,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option { return fx.Options( fx.Provide(OnlineExchange(shouldBitswapProvide)), maybeProvide(Graphsync, cfg.Experimental.GraphsyncEnabled), + fx.Provide(DNSResolver), fx.Provide(Namesys(ipnsCacheSize)), fx.Provide(Peering), PeerWith(cfg.Peering.Peers...), @@ -281,6 +283,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option { func Offline(cfg *config.Config) fx.Option { return fx.Options( fx.Provide(offline.Exchange), + fx.Provide(DNSResolver), fx.Provide(Namesys(0)), fx.Provide(offroute.NewOfflineRouter), OfflineProviders(cfg.Experimental.StrategicProviding, cfg.Reprovider.Strategy, cfg.Reprovider.Interval), diff --git a/core/node/ipns.go b/core/node/ipns.go index 4b2c17389..98f2de79c 100644 --- a/core/node/ipns.go +++ b/core/node/ipns.go @@ -10,6 +10,7 @@ import ( "github.com/libp2p/go-libp2p-core/peerstore" "github.com/libp2p/go-libp2p-core/routing" "github.com/libp2p/go-libp2p-record" + madns "github.com/multiformats/go-multiaddr-dns" "github.com/ipfs/go-ipfs/repo" "github.com/ipfs/go-namesys" @@ -27,9 +28,9 @@ func RecordValidator(ps peerstore.Peerstore) record.Validator { } // Namesys creates new name system -func Namesys(cacheSize int) func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) { - return func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) { - return namesys.NewNameSystem(rt, repo.Datastore(), cacheSize), nil +func Namesys(cacheSize int) func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) { + return func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) { + return namesys.NewNameSystem(rt, repo.Datastore(), rslv, cacheSize), nil } } diff --git a/core/node/libp2p/dns.go b/core/node/libp2p/dns.go new file mode 100644 index 000000000..1c56a2c0a --- /dev/null +++ b/core/node/libp2p/dns.go @@ -0,0 +1,11 @@ +package libp2p + +import ( + "github.com/libp2p/go-libp2p" + madns "github.com/multiformats/go-multiaddr-dns" +) + +func MultiaddrResolver(rslv *madns.Resolver) (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, libp2p.MultiaddrResolver(rslv)) + return opts, nil +}