github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/namesys/dns.go (about)

     1  package namesys
     2  
     3  import (
     4  	"net"
     5  
     6  	b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58"
     7  	isd "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-is-domain"
     8  	mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
     9  )
    10  
    11  // DNSResolver implements a Resolver on DNS domains
    12  type DNSResolver struct {
    13  	// TODO: maybe some sort of caching?
    14  	// cache would need a timeout
    15  }
    16  
    17  // CanResolve implements Resolver
    18  func (r *DNSResolver) CanResolve(name string) bool {
    19  	return isd.IsDomain(name)
    20  }
    21  
    22  // Resolve implements Resolver
    23  // TXT records for a given domain name should contain a b58
    24  // encoded multihash.
    25  func (r *DNSResolver) Resolve(name string) (string, error) {
    26  	log.Info("DNSResolver resolving %v", name)
    27  	txt, err := net.LookupTXT(name)
    28  	if err != nil {
    29  		return "", err
    30  	}
    31  
    32  	for _, t := range txt {
    33  		chk := b58.Decode(t)
    34  		if len(chk) == 0 {
    35  			continue
    36  		}
    37  
    38  		_, err := mh.Cast(chk)
    39  		if err != nil {
    40  			continue
    41  		}
    42  		return t, nil
    43  	}
    44  
    45  	return "", ErrResolveFailed
    46  }