|
|
|
@ -2,7 +2,7 @@ package backend
|
|
|
|
|
|
|
|
|
|
import "github.com/miekg/dns"
|
|
|
|
|
import "github.com/golang/groupcache/lru"
|
|
|
|
|
import "gopkg.in/hlandau/madns.v1/merr"
|
|
|
|
|
import "gopkg.in/hlandau/madns.v2/merr"
|
|
|
|
|
import "github.com/namecoin/ncdns/namecoin"
|
|
|
|
|
import "github.com/namecoin/ncdns/util"
|
|
|
|
|
import "github.com/namecoin/ncdns/ncdomain"
|
|
|
|
@ -109,7 +109,7 @@ func convertEmail(email string) (string, error) {
|
|
|
|
|
|
|
|
|
|
// Do low-level queries against an abstract zone file. This is the per-query
|
|
|
|
|
// entrypoint from madns.
|
|
|
|
|
func (b *Backend) Lookup(qname string) (rrs []dns.RR, err error) {
|
|
|
|
|
func (b *Backend) Lookup(qname, streamIsolationID string) (rrs []dns.RR, err error) {
|
|
|
|
|
err = lookupReadyError()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
@ -118,6 +118,7 @@ func (b *Backend) Lookup(qname string) (rrs []dns.RR, err error) {
|
|
|
|
|
btx := &btx{}
|
|
|
|
|
btx.b = b
|
|
|
|
|
btx.qname = qname
|
|
|
|
|
btx.streamIsolationID = streamIsolationID
|
|
|
|
|
return btx.Do()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -126,6 +127,8 @@ type btx struct {
|
|
|
|
|
b *Backend
|
|
|
|
|
qname string
|
|
|
|
|
|
|
|
|
|
streamIsolationID string
|
|
|
|
|
|
|
|
|
|
subname, basename, rootname string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -269,7 +272,7 @@ func (tx *btx) doUserDomain() (rrs []dns.RR, err error) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d, err := tx.b.getNamecoinEntry(ncname)
|
|
|
|
|
d, err := tx.b.getNamecoinEntry(ncname, tx.streamIsolationID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
@ -287,13 +290,13 @@ type domain struct {
|
|
|
|
|
ncv *ncdomain.Value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *Backend) getNamecoinEntry(name string) (*domain, error) {
|
|
|
|
|
func (b *Backend) getNamecoinEntry(name, streamIsolationID string) (*domain, error) {
|
|
|
|
|
d := b.getNamecoinEntryCache(name)
|
|
|
|
|
if d != nil {
|
|
|
|
|
return d, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d, err := b.getNamecoinEntryLL(name)
|
|
|
|
|
d, err := b.getNamecoinEntryLL(name, streamIsolationID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
@ -321,13 +324,13 @@ func (b *Backend) addNamecoinEntryToCache(name string, d *domain) {
|
|
|
|
|
b.cache.Add(name, d)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *Backend) getNamecoinEntryLL(name string) (*domain, error) {
|
|
|
|
|
v, err := b.resolveName(name)
|
|
|
|
|
func (b *Backend) getNamecoinEntryLL(name, streamIsolationID string) (*domain, error) {
|
|
|
|
|
v, err := b.resolveName(name, streamIsolationID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d, err := b.jsonToDomain(name, v)
|
|
|
|
|
d, err := b.jsonToDomain(name, v, streamIsolationID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
@ -335,7 +338,7 @@ func (b *Backend) getNamecoinEntryLL(name string) (*domain, error) {
|
|
|
|
|
return d, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *Backend) resolveName(name string) (jsonValue string, err error) {
|
|
|
|
|
func (b *Backend) resolveName(name, streamIsolationID string) (jsonValue string, err error) {
|
|
|
|
|
if fv, ok := b.cfg.FakeNames[name]; ok {
|
|
|
|
|
if fv == "NX" {
|
|
|
|
|
return "", merr.ErrNoSuchDomain
|
|
|
|
@ -349,7 +352,7 @@ func (b *Backend) resolveName(name string) (jsonValue string, err error) {
|
|
|
|
|
// Namecoin JSON-RPC seem sluggish sometimes.
|
|
|
|
|
result := make(chan struct{}, 1)
|
|
|
|
|
go func() {
|
|
|
|
|
jsonValue, err = b.nc.Query(name)
|
|
|
|
|
jsonValue, err = b.nc.Query(name, streamIsolationID)
|
|
|
|
|
log.Errore(err, "failed to query namecoin")
|
|
|
|
|
result <- struct{}{}
|
|
|
|
|
}()
|
|
|
|
@ -362,10 +365,14 @@ func (b *Backend) resolveName(name string) (jsonValue string, err error) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *Backend) jsonToDomain(name, jsonValue string) (*domain, error) {
|
|
|
|
|
func (b *Backend) jsonToDomain(name, jsonValue, streamIsolationID string) (*domain, error) {
|
|
|
|
|
d := &domain{}
|
|
|
|
|
|
|
|
|
|
v := ncdomain.ParseValue(name, jsonValue, b.resolveExtraName, nil)
|
|
|
|
|
resolveExtraIsolated := func(n string) (string, error) {
|
|
|
|
|
return b.resolveExtraName(n, streamIsolationID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v := ncdomain.ParseValue(name, jsonValue, resolveExtraIsolated, nil)
|
|
|
|
|
if v == nil {
|
|
|
|
|
return nil, fmt.Errorf("couldn't parse value")
|
|
|
|
|
}
|
|
|
|
@ -375,8 +382,8 @@ func (b *Backend) jsonToDomain(name, jsonValue string) (*domain, error) {
|
|
|
|
|
return d, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (b *Backend) resolveExtraName(name string) (jsonValue string, err error) {
|
|
|
|
|
return b.resolveName(name)
|
|
|
|
|
func (b *Backend) resolveExtraName(name, streamIsolationID string) (jsonValue string, err error) {
|
|
|
|
|
return b.resolveName(name, streamIsolationID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (tx *btx) doUnderDomain(d *domain) (rrs []dns.RR, err error) {
|
|
|
|
|