Commit 5d2e4db9 authored by Miek Gieben's avatar Miek Gieben Committed by GitHub

middleware/file: include sigs in additional (#456)

When asked for the NSset include glue and possible sigs in the
additional section.

Fixes #411
parent 187e1dc5
This diff is collapsed.
...@@ -44,7 +44,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR, ...@@ -44,7 +44,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR,
} }
if qtype == dns.TypeNS && qname == z.origin { if qtype == dns.TypeNS && qname == z.origin {
nsrrs := z.ns(do) nsrrs := z.ns(do)
glue := z.Glue(nsrrs) glue := z.Glue(nsrrs, do)
return nsrrs, nil, glue, Success return nsrrs, nil, glue, Success
} }
...@@ -97,7 +97,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR, ...@@ -97,7 +97,7 @@ func (z *Zone) Lookup(state request.Request, qname string) ([]dns.RR, []dns.RR,
// If we see NS records, it means the name as been delegated, and we should return the delegation. // If we see NS records, it means the name as been delegated, and we should return the delegation.
if nsrrs := elem.Types(dns.TypeNS); nsrrs != nil { if nsrrs := elem.Types(dns.TypeNS); nsrrs != nil {
glue := z.Glue(nsrrs) glue := z.Glue(nsrrs, do)
// If qtype == NS, we should returns success to put RRs in answer. // If qtype == NS, we should returns success to put RRs in answer.
if qtype == dns.TypeNS { if qtype == dns.TypeNS {
return nsrrs, nil, glue, Success return nsrrs, nil, glue, Success
...@@ -359,28 +359,38 @@ func signatureForSubType(rrs []dns.RR, subtype uint16) []dns.RR { ...@@ -359,28 +359,38 @@ func signatureForSubType(rrs []dns.RR, subtype uint16) []dns.RR {
} }
// Glue returns any potential glue records for nsrrs. // Glue returns any potential glue records for nsrrs.
func (z *Zone) Glue(nsrrs []dns.RR) []dns.RR { func (z *Zone) Glue(nsrrs []dns.RR, do bool) []dns.RR {
glue := []dns.RR{} glue := []dns.RR{}
for _, rr := range nsrrs { for _, rr := range nsrrs {
if ns, ok := rr.(*dns.NS); ok && dns.IsSubDomain(ns.Header().Name, ns.Ns) { if ns, ok := rr.(*dns.NS); ok && dns.IsSubDomain(ns.Header().Name, ns.Ns) {
glue = append(glue, z.searchGlue(ns.Ns)...) glue = append(glue, z.searchGlue(ns.Ns, do)...)
} }
} }
return glue return glue
} }
// searchGlue looks up A and AAAA for name. // searchGlue looks up A and AAAA for name.
func (z *Zone) searchGlue(name string) []dns.RR { func (z *Zone) searchGlue(name string, do bool) []dns.RR {
glue := []dns.RR{} glue := []dns.RR{}
// A // A
if elem, found := z.Tree.Search(name); found { if elem, found := z.Tree.Search(name); found {
glue = append(glue, elem.Types(dns.TypeA)...) glue = append(glue, elem.Types(dns.TypeA)...)
if do {
sigs := elem.Types(dns.TypeRRSIG)
sigs = signatureForSubType(sigs, dns.TypeA)
glue = append(glue, sigs...)
}
} }
// AAAA // AAAA
if elem, found := z.Tree.Search(name); found { if elem, found := z.Tree.Search(name); found {
glue = append(glue, elem.Types(dns.TypeAAAA)...) glue = append(glue, elem.Types(dns.TypeAAAA)...)
if do {
sigs := elem.Types(dns.TypeRRSIG)
sigs = signatureForSubType(sigs, dns.TypeAAAA)
glue = append(glue, sigs...)
}
} }
return glue return glue
} }
......
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