Refactoring - improving coverage (#371)
* Increase code coverage in acmedns * More testing of ReadConfig() and its fallback mechanism * Found that if someone put a '"' double quote into the filename that we configure zap to log to, it would cause the the JSON created to be invalid. I have replaced the JSON string with proper config * Better handling of config options for api.TLS - we now error on an invalid value instead of silently failing. added a basic test for api.setupTLS() (to increase test coverage) * testing nameserver isOwnChallenge and isAuthoritative methods * add a unit test for nameserver answerOwnChallenge * fix linting errors * bump go and golangci-lint versions in github actions * Update golangci-lint.yml Bumping github-actions workflow versions to accommodate some changes in upstream golanci-lint * Bump Golang version to 1.23 (currently the oldest supported version) Bump golanglint-ci to 2.0.2 and migrate the config file. This should resolve the math/rand/v2 issue * bump golanglint-ci action version * Fixing up new golanglint-ci warnings and errors --------- Co-authored-by: Joona Hoikkala <5235109+joohoi@users.noreply.github.com>
This commit is contained in:
co-authored by
Joona Hoikkala
parent
d20fae37c9
commit
e0f9745182
@@ -235,14 +235,14 @@ func TestAuthoritative(t *testing.T) {
|
||||
if answer.Ns[0].Header().Rrtype != dns.TypeSOA {
|
||||
t.Errorf("Was expecting SOA record as answer for NXDOMAIN but got [%s]", dns.TypeToString[answer.Ns[0].Header().Rrtype])
|
||||
}
|
||||
if !answer.MsgHdr.Authoritative {
|
||||
if !answer.Authoritative {
|
||||
t.Errorf("Was expecting authoritative bit to be set")
|
||||
}
|
||||
nanswer, _ := resolv.lookup("nonexsitent.nonauth.tld", dns.TypeA)
|
||||
if len(nanswer.Answer) > 0 {
|
||||
t.Errorf("Didn't expect answers for non authotitative domain query")
|
||||
}
|
||||
if nanswer.MsgHdr.Authoritative {
|
||||
if nanswer.Authoritative {
|
||||
t.Errorf("Authoritative bit should not be set for non-authoritative domain.")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ func (n *Nameserver) handleRequest(w dns.ResponseWriter, r *dns.Msg) {
|
||||
if opt != nil {
|
||||
if opt.Version() != 0 {
|
||||
// Only EDNS0 is standardized
|
||||
m.MsgHdr.Rcode = dns.RcodeBadVers
|
||||
m.Rcode = dns.RcodeBadVers
|
||||
m.SetEdns0(512, false)
|
||||
} else {
|
||||
// We can safely do this as we know that we're not setting other OPT RRs within acme-dns.
|
||||
@@ -39,13 +39,13 @@ func (n *Nameserver) readQuery(m *dns.Msg) {
|
||||
if auth {
|
||||
authoritative = auth
|
||||
}
|
||||
m.MsgHdr.Rcode = rc
|
||||
m.Rcode = rc
|
||||
m.Answer = append(m.Answer, rr...)
|
||||
}
|
||||
}
|
||||
m.MsgHdr.Authoritative = authoritative
|
||||
m.Authoritative = authoritative
|
||||
if authoritative {
|
||||
if m.MsgHdr.Rcode == dns.RcodeNameError {
|
||||
if m.Rcode == dns.RcodeNameError {
|
||||
m.Ns = append(m.Ns, n.SOA)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
package nameserver
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
func TestNameserver_isOwnChallenge(t *testing.T) {
|
||||
type fields struct {
|
||||
OwnDomain string
|
||||
}
|
||||
type args struct {
|
||||
name string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "is own challenge",
|
||||
fields: fields{
|
||||
OwnDomain: "some-domain.test.",
|
||||
},
|
||||
args: args{
|
||||
name: "_acme-challenge.some-domain.test",
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "challenge but not for us",
|
||||
fields: fields{
|
||||
OwnDomain: "some-domain.test.",
|
||||
},
|
||||
args: args{
|
||||
name: "_acme-challenge.some-other-domain.test",
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "not a challenge",
|
||||
fields: fields{
|
||||
OwnDomain: "domain.test.",
|
||||
},
|
||||
args: args{
|
||||
name: "domain.test",
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "other request challenge",
|
||||
fields: fields{
|
||||
OwnDomain: "domain.test.",
|
||||
},
|
||||
args: args{
|
||||
name: "my-domain.test",
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
n := &Nameserver{
|
||||
OwnDomain: tt.fields.OwnDomain,
|
||||
}
|
||||
if got := n.isOwnChallenge(tt.args.name); got != tt.want {
|
||||
t.Errorf("isOwnChallenge() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNameserver_isAuthoritative(t *testing.T) {
|
||||
type fields struct {
|
||||
OwnDomain string
|
||||
Domains map[string]Records
|
||||
}
|
||||
type args struct {
|
||||
q dns.Question
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "is authoritative own domain",
|
||||
fields: fields{
|
||||
OwnDomain: "auth.domain.",
|
||||
},
|
||||
args: args{
|
||||
q: dns.Question{Name: "auth.domain."},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "is authoritative other domain",
|
||||
fields: fields{
|
||||
OwnDomain: "auth.domain.",
|
||||
Domains: map[string]Records{
|
||||
"other-domain.test.": {Records: nil},
|
||||
},
|
||||
},
|
||||
args: args{
|
||||
q: dns.Question{Name: "other-domain.test."},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "is authoritative sub domain",
|
||||
fields: fields{
|
||||
OwnDomain: "auth.domain.",
|
||||
Domains: map[string]Records{
|
||||
"other-domain.test.": {Records: nil},
|
||||
},
|
||||
},
|
||||
args: args{
|
||||
q: dns.Question{Name: "sub.auth.domain."},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "is not authoritative own",
|
||||
fields: fields{
|
||||
OwnDomain: "auth.domain.",
|
||||
Domains: map[string]Records{
|
||||
"other-domain.test.": {Records: nil},
|
||||
},
|
||||
},
|
||||
args: args{
|
||||
q: dns.Question{Name: "special-auth.domain."},
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
n := &Nameserver{
|
||||
OwnDomain: tt.fields.OwnDomain,
|
||||
Domains: tt.fields.Domains,
|
||||
}
|
||||
if got := n.isAuthoritative(tt.args.q); got != tt.want {
|
||||
t.Errorf("isAuthoritative() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package nameserver
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
func TestNameserver_answerOwnChallenge(t *testing.T) {
|
||||
type fields struct {
|
||||
personalAuthKey string
|
||||
}
|
||||
type args struct {
|
||||
q dns.Question
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want []dns.RR
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "answer own challenge",
|
||||
fields: fields{
|
||||
personalAuthKey: "some key text",
|
||||
},
|
||||
args: args{
|
||||
q: dns.Question{
|
||||
Name: "something",
|
||||
Qtype: 0,
|
||||
Qclass: 0,
|
||||
},
|
||||
},
|
||||
want: []dns.RR{
|
||||
&dns.TXT{
|
||||
Hdr: dns.RR_Header{Name: "something", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 1},
|
||||
Txt: []string{"some key text"},
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
n := &Nameserver{}
|
||||
|
||||
n.SetOwnAuthKey(tt.fields.personalAuthKey)
|
||||
if n.personalAuthKey != tt.fields.personalAuthKey {
|
||||
t.Errorf("failed to set personal auth key: got = %s, want %s", n.personalAuthKey, tt.fields.personalAuthKey)
|
||||
return
|
||||
}
|
||||
|
||||
got, err := n.answerOwnChallenge(tt.args.q)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("answerOwnChallenge() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("answerOwnChallenge() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user