Files
ExploreDNS/internal/traverse/referral.go
T
gary 39529dacbb
CI / test (push) Failing after 1m26s
feat: implement traversal engine (HAN-380) (#6)
Co-authored-by: Hansen IT Solutions <gary@hansenits.com>
Co-committed-by: Hansen IT Solutions <gary@hansenits.com>
2026-06-06 03:41:14 +00:00

79 lines
1.4 KiB
Go

package traverse
import (
"net"
"strings"
miekgdns "github.com/miekg/dns"
)
type ResolutionState int
const (
StateUnresolved ResolutionState = iota
StateResolving
StateResolved
)
func (s ResolutionState) String() string {
switch s {
case StateUnresolved:
return "unresolved"
case StateResolving:
return "resolving"
case StateResolved:
return "resolved"
default:
return "unknown"
}
}
type Referral struct {
Name string
Qtype uint16
Qclass uint16
Bailiwick string
Addresses []net.IP
State ResolutionState
NSName string
Parent *Referral
Depth int
Prob float64
}
func NewReferral(name string, qtype uint16, bailiwick string, depth int, prob float64, parent *Referral) *Referral {
return &Referral{
Name: miekgdns.Fqdn(strings.ToLower(name)),
Qtype: qtype,
Qclass: miekgdns.ClassINET,
Bailiwick: miekgdns.Fqdn(strings.ToLower(bailiwick)),
Depth: depth,
Prob: prob,
Parent: parent,
State: StateUnresolved,
}
}
func (r *Referral) InBailiwick(name string) bool {
if r.Bailiwick == "" || r.Bailiwick == "." {
return true
}
fqdn := miekgdns.Fqdn(strings.ToLower(name))
return miekgdns.IsSubDomain(r.Bailiwick, fqdn)
}
func (r *Referral) HasAddresses() bool {
return len(r.Addresses) > 0
}
func (r *Referral) SetAddresses(addrs []net.IP) {
r.Addresses = addrs
if len(addrs) > 0 {
r.State = StateResolved
} else {
r.State = StateUnresolved
}
}