Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
examples/lookup/lookup
/examples/lookup/lookup
/examples/mxlookup/mxlookup
mxlookup
176 changes: 151 additions & 25 deletions coverage.txt
Original file line number Diff line number Diff line change
@@ -1,25 +1,151 @@
github.com/peterzen/goresolver/authchain.go:23: Populate 85.7%
github.com/peterzen/goresolver/authchain.go:54: Verify 92.9%
github.com/peterzen/goresolver/authchain.go:105: NewAuthenticationChain 100.0%
github.com/peterzen/goresolver/goresolver.go:41: NewDNSMessage 100.0%
github.com/peterzen/goresolver/goresolver.go:55: localQuery 0.0%
github.com/peterzen/goresolver/goresolver.go:77: queryDelegation 88.9%
github.com/peterzen/goresolver/goresolver.go:100: NewResolver 100.0%
github.com/peterzen/goresolver/lookup.go:11: LookupIP 75.8%
github.com/peterzen/goresolver/lookup.go:66: LookupIPv4 100.0%
github.com/peterzen/goresolver/lookup.go:70: LookupIPv6 100.0%
github.com/peterzen/goresolver/lookup.go:75: LookupIPType 70.0%
github.com/peterzen/goresolver/lookup.go:111: StrictNSQuery 68.4%
github.com/peterzen/goresolver/lookup.go:148: formatResultRRs 100.0%
github.com/peterzen/goresolver/rrset.go:13: queryRRset 76.5%
github.com/peterzen/goresolver/rrset.go:48: IsSigned 100.0%
github.com/peterzen/goresolver/rrset.go:52: IsEmpty 100.0%
github.com/peterzen/goresolver/rrset.go:56: SignerName 100.0%
github.com/peterzen/goresolver/rrset.go:60: NewSignedRRSet 100.0%
github.com/peterzen/goresolver/signedzone.go:20: lookupPubKey 100.0%
github.com/peterzen/goresolver/signedzone.go:25: addPubKey 100.0%
github.com/peterzen/goresolver/signedzone.go:34: verifyRRSIG 64.3%
github.com/peterzen/goresolver/signedzone.go:64: verifyDS 81.2%
github.com/peterzen/goresolver/signedzone.go:94: checkHasDnskeys 100.0%
github.com/peterzen/goresolver/signedzone.go:99: NewSignedZone 100.0%
total: (statements) 76.9%

mode: atomic
github.com/peterzen/goresolver/authchain.go:23.73,28.23 3 14
github.com/peterzen/goresolver/authchain.go:28.23,30.3 1 0
github.com/peterzen/goresolver/authchain.go:32.2,33.37 2 14
github.com/peterzen/goresolver/authchain.go:33.37,36.17 3 44
github.com/peterzen/goresolver/authchain.go:36.17,38.4 1 0
github.com/peterzen/goresolver/authchain.go:39.3,39.12 1 44
github.com/peterzen/goresolver/authchain.go:39.12,41.4 1 30
github.com/peterzen/goresolver/authchain.go:42.3,42.77 1 44
github.com/peterzen/goresolver/authchain.go:44.2,44.12 1 14
github.com/peterzen/goresolver/authchain.go:54.72,57.35 2 19
github.com/peterzen/goresolver/authchain.go:57.35,59.3 1 1
github.com/peterzen/goresolver/authchain.go:61.2,62.16 2 18
github.com/peterzen/goresolver/authchain.go:62.16,65.3 2 2
github.com/peterzen/goresolver/authchain.go:67.2,67.55 1 16
github.com/peterzen/goresolver/authchain.go:67.55,69.34 1 43
github.com/peterzen/goresolver/authchain.go:69.34,72.4 2 0
github.com/peterzen/goresolver/authchain.go:75.3,76.17 2 43
github.com/peterzen/goresolver/authchain.go:76.17,79.4 2 1
github.com/peterzen/goresolver/authchain.go:81.3,81.35 1 42
github.com/peterzen/goresolver/authchain.go:81.35,83.31 1 30
github.com/peterzen/goresolver/authchain.go:83.31,86.5 2 1
github.com/peterzen/goresolver/authchain.go:88.4,89.18 2 29
github.com/peterzen/goresolver/authchain.go:89.18,92.5 2 1
github.com/peterzen/goresolver/authchain.go:93.4,94.18 2 28
github.com/peterzen/goresolver/authchain.go:94.18,97.5 2 1
github.com/peterzen/goresolver/authchain.go:100.2,100.12 1 12
github.com/peterzen/goresolver/authchain.go:105.52,107.2 1 14
github.com/peterzen/goresolver/goresolver.go:45.31,53.2 3 1
github.com/peterzen/goresolver/goresolver.go:59.63,63.37 3 0
github.com/peterzen/goresolver/goresolver.go:63.37,65.3 1 0
github.com/peterzen/goresolver/goresolver.go:67.2,67.58 1 0
github.com/peterzen/goresolver/goresolver.go:67.58,69.17 2 0
github.com/peterzen/goresolver/goresolver.go:69.17,71.4 1 0
github.com/peterzen/goresolver/goresolver.go:72.3,72.79 1 0
github.com/peterzen/goresolver/goresolver.go:72.79,74.4 1 0
github.com/peterzen/goresolver/goresolver.go:76.2,76.31 1 0
github.com/peterzen/goresolver/goresolver.go:81.77,86.16 3 44
github.com/peterzen/goresolver/goresolver.go:86.16,88.3 1 0
github.com/peterzen/goresolver/goresolver.go:89.2,90.45 2 44
github.com/peterzen/goresolver/goresolver.go:90.45,92.3 1 127
github.com/peterzen/goresolver/goresolver.go:94.2,96.24 2 44
github.com/peterzen/goresolver/goresolver.go:101.64,107.16 4 22
github.com/peterzen/goresolver/goresolver.go:107.16,109.3 1 1
github.com/peterzen/goresolver/goresolver.go:110.2,112.22 3 21
github.com/peterzen/goresolver/lookup.go:12.76,14.20 1 6
github.com/peterzen/goresolver/lookup.go:14.20,16.3 1 0
github.com/peterzen/goresolver/lookup.go:18.2,22.31 3 6
github.com/peterzen/goresolver/lookup.go:22.31,25.20 2 12
github.com/peterzen/goresolver/lookup.go:25.20,26.12 1 0
github.com/peterzen/goresolver/lookup.go:28.3,28.17 1 12
github.com/peterzen/goresolver/lookup.go:28.17,29.12 1 0
github.com/peterzen/goresolver/lookup.go:31.3,31.23 1 12
github.com/peterzen/goresolver/lookup.go:31.23,32.12 1 2
github.com/peterzen/goresolver/lookup.go:34.3,34.25 1 10
github.com/peterzen/goresolver/lookup.go:34.25,35.12 1 0
github.com/peterzen/goresolver/lookup.go:38.3,38.36 1 10
github.com/peterzen/goresolver/lookup.go:41.2,41.22 1 6
github.com/peterzen/goresolver/lookup.go:41.22,44.3 2 1
github.com/peterzen/goresolver/lookup.go:46.2,49.16 4 5
github.com/peterzen/goresolver/lookup.go:49.16,52.3 2 0
github.com/peterzen/goresolver/lookup.go:53.2,54.33 2 5
github.com/peterzen/goresolver/lookup.go:54.33,56.17 2 10
github.com/peterzen/goresolver/lookup.go:56.17,58.12 2 0
github.com/peterzen/goresolver/lookup.go:60.3,61.40 2 10
github.com/peterzen/goresolver/lookup.go:64.2,64.23 1 5
github.com/peterzen/goresolver/lookup.go:67.78,69.2 1 7
github.com/peterzen/goresolver/lookup.go:71.78,73.2 1 1
github.com/peterzen/goresolver/lookup.go:76.94,78.20 1 8
github.com/peterzen/goresolver/lookup.go:78.20,80.3 1 0
github.com/peterzen/goresolver/lookup.go:82.2,83.19 2 8
github.com/peterzen/goresolver/lookup.go:83.19,85.3 1 0
github.com/peterzen/goresolver/lookup.go:87.2,87.16 1 8
github.com/peterzen/goresolver/lookup.go:87.16,89.3 1 0
github.com/peterzen/goresolver/lookup.go:91.2,91.24 1 8
github.com/peterzen/goresolver/lookup.go:91.24,93.3 1 1
github.com/peterzen/goresolver/lookup.go:95.2,98.16 4 7
github.com/peterzen/goresolver/lookup.go:98.16,101.3 2 0
github.com/peterzen/goresolver/lookup.go:103.2,104.16 2 7
github.com/peterzen/goresolver/lookup.go:104.16,107.3 2 7
github.com/peterzen/goresolver/lookup.go:109.2,109.37 1 0
github.com/peterzen/goresolver/lookup.go:112.97,114.20 1 4
github.com/peterzen/goresolver/lookup.go:114.20,116.3 1 1
github.com/peterzen/goresolver/lookup.go:118.2,119.16 2 3
github.com/peterzen/goresolver/lookup.go:119.16,121.3 1 0
github.com/peterzen/goresolver/lookup.go:123.2,123.22 1 3
github.com/peterzen/goresolver/lookup.go:123.22,125.3 1 1
github.com/peterzen/goresolver/lookup.go:127.2,127.24 1 2
github.com/peterzen/goresolver/lookup.go:127.24,129.3 1 0
github.com/peterzen/goresolver/lookup.go:131.2,132.16 2 2
github.com/peterzen/goresolver/lookup.go:132.16,134.3 1 0
github.com/peterzen/goresolver/lookup.go:136.2,141.24 4 2
github.com/peterzen/goresolver/lookup.go:141.24,143.3 1 0
github.com/peterzen/goresolver/lookup.go:145.2,146.16 2 2
github.com/peterzen/goresolver/lookup.go:146.16,149.3 2 0
github.com/peterzen/goresolver/lookup.go:151.2,151.26 1 2
github.com/peterzen/goresolver/lookup.go:154.51,156.39 2 11
github.com/peterzen/goresolver/lookup.go:156.39,157.25 1 33
github.com/peterzen/goresolver/lookup.go:158.15,159.26 1 21
github.com/peterzen/goresolver/lookup.go:160.18,161.29 1 12
github.com/peterzen/goresolver/lookup.go:164.2,164.12 1 11
github.com/peterzen/goresolver/rrset.go:14.82,18.16 2 112
github.com/peterzen/goresolver/rrset.go:18.16,21.3 2 0
github.com/peterzen/goresolver/rrset.go:23.2,23.35 1 112
github.com/peterzen/goresolver/rrset.go:23.35,26.3 2 0
github.com/peterzen/goresolver/rrset.go:28.2,30.21 2 112
github.com/peterzen/goresolver/rrset.go:30.21,32.3 1 18
github.com/peterzen/goresolver/rrset.go:34.2,36.30 2 94
github.com/peterzen/goresolver/rrset.go:36.30,37.25 1 369
github.com/peterzen/goresolver/rrset.go:38.19,39.20 1 135
github.com/peterzen/goresolver/rrset.go:40.11,41.17 1 234
github.com/peterzen/goresolver/rrset.go:41.17,43.5 1 234
github.com/peterzen/goresolver/rrset.go:46.2,46.20 1 94
github.com/peterzen/goresolver/rrset.go:49.38,51.2 1 110
github.com/peterzen/goresolver/rrset.go:53.37,55.2 1 88
github.com/peterzen/goresolver/rrset.go:57.42,59.2 1 14
github.com/peterzen/goresolver/rrset.go:61.63,62.64 1 3
github.com/peterzen/goresolver/rrset.go:62.64,64.3 1 1
github.com/peterzen/goresolver/rrset.go:65.2,65.12 1 2
github.com/peterzen/goresolver/rrset.go:68.30,72.2 1 112
github.com/peterzen/goresolver/signedzone.go:20.61,22.2 1 118
github.com/peterzen/goresolver/signedzone.go:25.46,27.2 1 127
github.com/peterzen/goresolver/signedzone.go:34.65,36.29 1 90
github.com/peterzen/goresolver/signedzone.go:36.29,38.3 1 0
github.com/peterzen/goresolver/signedzone.go:41.2,42.16 2 90
github.com/peterzen/goresolver/signedzone.go:42.16,45.3 2 0
github.com/peterzen/goresolver/signedzone.go:47.2,48.16 2 90
github.com/peterzen/goresolver/signedzone.go:48.16,51.3 2 4
github.com/peterzen/goresolver/signedzone.go:53.2,53.61 1 86
github.com/peterzen/goresolver/signedzone.go:53.61,56.3 2 0
github.com/peterzen/goresolver/signedzone.go:57.2,57.12 1 86
github.com/peterzen/goresolver/signedzone.go:64.60,66.29 1 28
github.com/peterzen/goresolver/signedzone.go:66.29,70.34 2 34
github.com/peterzen/goresolver/signedzone.go:70.34,72.12 2 6
github.com/peterzen/goresolver/signedzone.go:75.3,77.17 3 28
github.com/peterzen/goresolver/signedzone.go:77.17,80.4 2 1
github.com/peterzen/goresolver/signedzone.go:81.3,82.33 2 27
github.com/peterzen/goresolver/signedzone.go:82.33,84.4 1 27
github.com/peterzen/goresolver/signedzone.go:86.3,87.22 2 0
github.com/peterzen/goresolver/signedzone.go:89.2,89.31 1 0
github.com/peterzen/goresolver/signedzone.go:94.45,96.2 1 19
github.com/peterzen/goresolver/signedzone.go:100.71,107.2 1 44
mode: atomic
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:10.13,12.22 1 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:12.22,15.3 2 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:16.2,20.16 3 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:20.16,23.3 2 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:25.2,27.16 2 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:27.16,30.3 2 0
github.com/peterzen/goresolver/examples/mxlookup/mxlookup.go:32.2,32.55 1 0
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
module github.com/peterzen/goresolver

go 1.24.13

require github.com/miekg/dns v1.1.4

require (
github.com/miekg/dns v1.1.4
golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f // indirect
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd // indirect
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
Expand Down
4 changes: 3 additions & 1 deletion goresolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const (
// queryFn can be used for mocking the actual DNS lookups in the test suite.
type Resolver struct {
queryFn func(string, uint16) (*dns.Msg, error)
timeNow func() time.Time
dnsClient *dns.Client
dnsClientConfig *dns.ClientConfig
}
Expand Down Expand Up @@ -79,7 +80,7 @@ func localQuery(qname string, qtype uint16) (*dns.Msg, error) {
// in that zone. Returns a SignedZone or nil in case of error.
func queryDelegation(domainName string) (signedZone *SignedZone, err error) {

signedZone = NewSignedZone(domainName)
signedZone = newSignedZone(domainName, resolver)

signedZone.dnskey, err = resolver.queryRRset(domainName, dns.TypeDNSKEY)
if err != nil {
Expand Down Expand Up @@ -107,5 +108,6 @@ func NewResolver(resolvConf string) (res *Resolver, err error) {
return nil, err
}
resolver.queryFn = localQuery
resolver.timeNow = time.Now
return resolver, nil
}
6 changes: 6 additions & 0 deletions lookup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"path"
"strings"
"testing"
"time"

"github.com/miekg/dns"
)
Expand Down Expand Up @@ -45,6 +46,11 @@ func mockQueryUpdate(t *testing.T, qname string, qtype uint16) (*dns.Msg, error)

func newResolver(t *testing.T) (res *Resolver) {
resolver, _ := NewResolver("./testdata/resolv.conf")
// Mock time to March 7, 2019 at noon (UTC) to work with test data validity periods
// This date falls within all RRSIG validity periods in the test data
resolver.timeNow = func() time.Time {
return time.Date(2019, 3, 7, 12, 0, 0, 0, time.UTC)
}
resolver.queryFn = func(qname string, qtype uint16) (*dns.Msg, error) {
msg := &dns.Msg{}
if isMockQuery == false {
Expand Down
16 changes: 9 additions & 7 deletions signedzone.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"github.com/miekg/dns"
"log"
"strings"
"time"
)

// SignedZone represents a DNSSEC-enabled zone, its DNSKEY and DS records
Expand All @@ -14,6 +13,7 @@ type SignedZone struct {
ds *RRSet
parentZone *SignedZone
pubKeyLookup map[uint16]*dns.DNSKEY
resolver *Resolver
}

// lookupPubkey returns a DNSKEY by its keytag
Expand Down Expand Up @@ -50,7 +50,7 @@ func (z SignedZone) verifyRRSIG(signedRRset *RRSet) (err error) {
return err
}

if !signedRRset.rrSig.ValidityPeriod(time.Now()) {
if !signedRRset.rrSig.ValidityPeriod(z.resolver.timeNow()) {
log.Println("invalid validity period", err)
return ErrRrsigValidityPeriod
}
Expand Down Expand Up @@ -95,11 +95,13 @@ func (z *SignedZone) checkHasDnskeys() bool {
return len(z.dnskey.rrSet) > 0
}

// NewSignedZone initializes a new SignedZone and returns it.
func NewSignedZone(domainName string) *SignedZone {
// newSignedZone initializes a new SignedZone and returns it.
// This is an internal function not part of the public API.
func newSignedZone(domainName string, resolver *Resolver) *SignedZone {
return &SignedZone{
zone: domainName,
ds: &RRSet{},
dnskey: &RRSet{},
zone: domainName,
ds: &RRSet{},
dnskey: &RRSet{},
resolver: resolver,
}
}