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 }