Commit a718e16e authored by vyzo's avatar vyzo

make DNS resolver pluggable, use new madns.BasicResolver interface

parent 22432d19
......@@ -11,13 +11,14 @@ import (
path "github.com/ipfs/go-path"
opts "github.com/ipfs/interface-go-ipfs-core/options/namesys"
isd "github.com/jbenet/go-is-domain"
madns "github.com/multiformats/go-multiaddr-dns"
)
const ethTLD = "eth"
const linkTLD = "domains"
// LookupTXTFunc is a generic type for a function that lookups TXT record values.
type LookupTXTFunc func(name string) (txt []string, err error)
type LookupTXTFunc func(ctx context.Context, name string) (txt []string, err error)
// DNSResolver implements a Resolver on DNS domains
type DNSResolver struct {
......@@ -27,8 +28,8 @@ type DNSResolver struct {
}
// NewDNSResolver constructs a name resolver using DNS TXT records.
func NewDNSResolver() *DNSResolver {
return &DNSResolver{lookupTXT: net.LookupTXT}
func NewDNSResolver(rslv madns.BasicResolver) *DNSResolver {
return &DNSResolver{lookupTXT: rslv.LookupTXT}
}
// Resolve implements Resolver.
......@@ -75,10 +76,10 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options
}
rootChan := make(chan lookupRes, 1)
go workDomain(r, fqdn, rootChan)
go workDomain(ctx, r, fqdn, rootChan)
subChan := make(chan lookupRes, 1)
go workDomain(r, "_dnslink."+fqdn, subChan)
go workDomain(ctx, r, "_dnslink."+fqdn, subChan)
appendPath := func(p path.Path) (path.Path, error) {
if len(segments) > 1 {
......@@ -139,10 +140,10 @@ func (r *DNSResolver) resolveOnceAsync(ctx context.Context, name string, options
return out
}
func workDomain(r *DNSResolver, name string, res chan lookupRes) {
func workDomain(ctx context.Context, r *DNSResolver, name string, res chan lookupRes) {
defer close(res)
txt, err := r.lookupTXT(name)
txt, err := r.lookupTXT(ctx, name)
if err != nil {
if dnsErr, ok := err.(*net.DNSError); ok {
// If no TXT records found, return same error as when no text
......
package namesys
import (
"context"
"fmt"
"testing"
......@@ -11,7 +12,7 @@ type mockDNS struct {
entries map[string][]string
}
func (m *mockDNS) lookupTXT(name string) (txt []string, err error) {
func (m *mockDNS) lookupTXT(ctx context.Context, name string) (txt []string, err error) {
txt, ok := m.entries[name]
if !ok {
return nil, fmt.Errorf("no TXT entry for %s", name)
......
This diff is collapsed.
......@@ -29,6 +29,7 @@ import (
ci "github.com/libp2p/go-libp2p-core/crypto"
peer "github.com/libp2p/go-libp2p-core/peer"
routing "github.com/libp2p/go-libp2p-core/routing"
madns "github.com/multiformats/go-multiaddr-dns"
)
// mpns (a multi-protocol NameSystem) implements generic IPFS naming.
......@@ -49,7 +50,7 @@ type mpns struct {
}
// NewNameSystem will construct the IPFS naming system based on Routing
func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSystem {
func NewNameSystem(r routing.ValueStore, ds ds.Datastore, rslv madns.BasicResolver, cachesize int) NameSystem {
var (
cache *lru.Cache
staticMap map[string]path.Path
......@@ -73,7 +74,7 @@ func NewNameSystem(r routing.ValueStore, ds ds.Datastore, cachesize int) NameSys
}
return &mpns{
dnsResolver: NewDNSResolver(),
dnsResolver: NewDNSResolver(rslv),
proquintResolver: new(ProquintResolver),
ipnsResolver: NewIpnsResolver(r),
ipnsPublisher: NewIpnsPublisher(r, ds),
......
......@@ -17,6 +17,7 @@ import (
peer "github.com/libp2p/go-libp2p-core/peer"
pstoremem "github.com/libp2p/go-libp2p-peerstore/pstoremem"
record "github.com/libp2p/go-libp2p-record"
madns "github.com/multiformats/go-multiaddr-dns"
)
type mockResolver struct {
......@@ -109,7 +110,7 @@ func TestPublishWithCache0(t *testing.T) {
"pk": record.PublicKeyValidator{},
})
nsys := NewNameSystem(routing, dst, 0)
nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 0)
// CID is arbitrary.
p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn")
if err != nil {
......@@ -142,7 +143,7 @@ func TestPublishWithTTL(t *testing.T) {
"pk": record.PublicKeyValidator{},
})
nsys := NewNameSystem(routing, dst, 128)
nsys := NewNameSystem(routing, dst, madns.DefaultResolver, 128)
// CID is arbitrary.
p, err := path.ParsePath("QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn")
if err != nil {
......
......@@ -22,6 +22,8 @@ import (
ipns_pb "github.com/ipfs/go-ipns/pb"
path "github.com/ipfs/go-path"
madns "github.com/multiformats/go-multiaddr-dns"
keystore "github.com/ipfs/go-ipfs-keystore"
namesys "github.com/ipfs/go-namesys"
. "github.com/ipfs/go-namesys/republisher"
......@@ -74,7 +76,7 @@ func TestRepublish(t *testing.T) {
var nodes []*mockNode
for i := 0; i < 10; i++ {
n := getMockNode(t, ctx)
ns := namesys.NewNameSystem(n.dht, n.store, 0)
ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0)
nsystems = append(nsystems, ns)
nodes = append(nodes, n)
......@@ -153,7 +155,7 @@ func TestLongEOLRepublish(t *testing.T) {
var nodes []*mockNode
for i := 0; i < 10; i++ {
n := getMockNode(t, ctx)
ns := namesys.NewNameSystem(n.dht, n.store, 0)
ns := namesys.NewNameSystem(n.dht, n.store, madns.DefaultResolver, 0)
nsystems = append(nsystems, ns)
nodes = append(nodes, n)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment