Merge pull request #1564 from munnerz/rfc2136-test-server

Improve RFC2136 test DNS server
This commit is contained in:
jetstack-bot 2019-04-18 18:46:03 +01:00 committed by GitHub
commit dca819df80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 28 deletions

View File

@ -20,6 +20,7 @@ go_test(
"//pkg/issuer/acme/dns/util:go_default_library",
"//vendor/github.com/miekg/dns:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
],
)

View File

@ -32,6 +32,7 @@ import (
"github.com/jetstack/cert-manager/pkg/issuer/acme/dns/util"
"github.com/miekg/dns"
"github.com/stretchr/testify/assert"
"k8s.io/klog"
)
var (
@ -45,8 +46,6 @@ var (
rfc2136TestTsigSecret = "IwBTJx9wrDp4Y1RyC3H0gA=="
)
var reqChan = make(chan *dns.Msg, 10)
func TestRFC2136CanaryLocalTestServer(t *testing.T) {
dns.HandleFunc("example.com.", serverHandlerHello)
defer dns.HandleRemove("example.com.")
@ -208,7 +207,7 @@ func TestRFC2136InvalidTSIGAlgorithm(t *testing.T) {
}
func TestRFC2136ValidUpdatePacket(t *testing.T) {
dns.HandleFunc(rfc2136TestZone, serverHandlerPassBackRequest)
dns.HandleFunc(rfc2136TestZone, (&basicStatefulServer{}).serverHandlerPassBackRequest)
defer dns.HandleRemove(rfc2136TestZone)
server, addrstr, err := runLocalDNSTestServer("127.0.0.1:0", false)
@ -239,21 +238,6 @@ func TestRFC2136ValidUpdatePacket(t *testing.T) {
}
assert.NoError(t, err)
//rcvMsg := <-reqChan
//rcvMsg.Id = m.Id
//actual, err := rcvMsg.Pack()
//if err != nil {
// t.Fatalf("Error packing actual msg: %v", err)
//}
//if !bytes.Equal(actual, expect) {
// tmp := new(dns.Msg)
// if err := tmp.Unpack(actual); err != nil {
// t.Fatalf("Error unpacking actual msg: %v", err)
// }
// t.Errorf("Expected msg:\n%s", expectstr)
// t.Errorf("Actual msg:\n%v", tmp)
//}
}
func runLocalDNSTestServer(listenAddr string, tsig bool) (*dns.Server, string, error) {
@ -315,14 +299,18 @@ func serverHandlerReturnErr(w dns.ResponseWriter, req *dns.Msg) {
w.WriteMsg(m)
}
func serverHandlerPassBackRequest(w dns.ResponseWriter, req *dns.Msg) {
type basicStatefulServer struct {
txtRecords map[string][]string
}
func (b *basicStatefulServer) serverHandlerPassBackRequest(w dns.ResponseWriter, req *dns.Msg) {
if b.txtRecords == nil {
b.txtRecords = make(map[string][]string)
}
m := new(dns.Msg)
m.SetReply(req)
if req.Opcode == dns.OpcodeQuery && req.Question[0].Qtype == dns.TypeSOA && req.Question[0].Qclass == dns.ClassINET {
// Return SOA to appease findZoneByFqdn()
soaRR, _ := dns.NewRR(fmt.Sprintf("%s %d IN SOA ns1.%s admin.%s 2016022801 28800 7200 2419200 1200", rfc2136TestZone, rfc2136TestTTL, rfc2136TestZone, rfc2136TestZone))
m.Answer = []dns.RR{soaRR}
}
defer w.WriteMsg(m)
if t := req.IsTsig(); t != nil {
if w.TsigStatus() == nil {
@ -331,9 +319,35 @@ func serverHandlerPassBackRequest(w dns.ResponseWriter, req *dns.Msg) {
}
}
w.WriteMsg(m)
if req.Opcode != dns.OpcodeQuery || req.Question[0].Qtype != dns.TypeSOA || req.Question[0].Qclass != dns.ClassINET {
// Only talk back when it is not the SOA RR.
reqChan <- req
if (req.Opcode != dns.OpcodeUpdate && req.Opcode != dns.OpcodeQuery) || req.Question[0].Qclass != dns.ClassINET {
klog.Infof("skipping dns packet: %#v", req)
//m.Rcode = dns.RcodeServerFailure
return
}
if req.Opcode == dns.OpcodeUpdate {
for _, rr := range req.Ns {
txt := rr.(*dns.TXT)
if rr.Header().Class == dns.ClassNONE {
klog.Infof("deleting val %q", txt.Hdr.Name)
delete(b.txtRecords, txt.Hdr.Name)
continue
}
klog.Infof("setting value %q: %v", txt.Hdr.Name, txt.Txt)
b.txtRecords[txt.Hdr.Name] = txt.Txt
}
}
switch req.Question[0].Qtype {
case dns.TypeSOA:
// Return SOA to appease findZoneByFqdn()
soaRR, _ := dns.NewRR(fmt.Sprintf("%s %d IN SOA ns1.%s admin.%s 2016022801 28800 7200 2419200 1200", rfc2136TestZone, rfc2136TestTTL, rfc2136TestZone, rfc2136TestZone))
m.Answer = []dns.RR{soaRR}
case dns.TypeTXT:
for _, rr := range b.txtRecords[req.Question[0].Name] {
klog.Infof("returning %q", fmt.Sprintf("%s %d IN TXT %s", req.Question[0].Name, rfc2136TestTTL, rr))
txtRR, _ := dns.NewRR(fmt.Sprintf("%s %d IN TXT %s", req.Question[0].Name, rfc2136TestTTL, rr))
m.Answer = append(m.Answer, txtRR)
}
}
}