fix: propagate UseRR errors consistently across all service analyzers

Several service analyzers were silently discarding errors returned by
a.UseRR(), unlike txt.go and others that properly checked them. This
could mask issues like double-claimed records during zone analysis.
This commit is contained in:
nemunaire 2026-03-27 03:40:24 +07:00
commit 1523b549d2
16 changed files with 86 additions and 40 deletions

View file

@ -51,9 +51,11 @@ func acmechallenge_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_acme-challenge"}) {
domain := strings.TrimPrefix(record.Header().Name, "_acme-challenge.")
if record.Header().Rrtype == dns.TypeTXT {
a.UseRR(record, domain, &ACMEChallenge{
if err := a.UseRR(record, domain, &ACMEChallenge{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -76,11 +76,13 @@ func delegation_analyze(a *svc.Analyzer) error {
delegations[dn].NameServers = append(delegations[dn].NameServers, helpers.RRRelativeSubdomain(ns, a.GetOrigin(), dn).(*dns.NS))
a.UseRR(
if err := a.UseRR(
record,
dn,
delegations[dn],
)
); err != nil {
return err
}
}
}
@ -89,11 +91,13 @@ func delegation_analyze(a *svc.Analyzer) error {
if _, ok := record.(*dns.DS); ok {
delegations[subdomain].DS = append(delegations[subdomain].DS, helpers.RRRelativeSubdomain(record, a.GetOrigin(), subdomain).(*dns.DS))
a.UseRR(
if err := a.UseRR(
record,
subdomain,
delegations[subdomain],
)
); err != nil {
return err
}
}
}
}

View file

@ -58,9 +58,11 @@ func githubverification_analyze(a *svc.Analyzer) error {
domain := strings.Join(dnparts[1:], ".")
if record.Header().Rrtype == dns.TypeTXT {
a.UseRR(record, domain, &GithubOrgVerif{
if err := a.UseRR(record, domain, &GithubOrgVerif{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
}

View file

@ -51,9 +51,11 @@ func gitlabverification_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_gitlab-pages-verification-code"}) {
domain := strings.TrimPrefix(record.Header().Name, "_gitlab-pages-verification-code.")
if txt, ok := record.(*dns.TXT); ok && strings.HasPrefix(strings.Join(txt.Txt, ""), "gitlab-pages-verification-code=") {
a.UseRR(record, domain, &GitlabPageVerif{
if err := a.UseRR(record, domain, &GitlabPageVerif{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -51,9 +51,11 @@ func googleverification_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeTXT}) {
domain := record.Header().Name
if txt, ok := record.(*happydns.TXT); ok && strings.HasPrefix(txt.Txt, "google-site-verification=") {
a.UseRR(record, domain, &GoogleVerif{
if err := a.UseRR(record, domain, &GoogleVerif{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -51,9 +51,11 @@ func keybaseverification_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_keybase"}) {
domain := strings.TrimPrefix(record.Header().Name, "_keybase.")
if record.Header().Rrtype == dns.TypeTXT {
a.UseRR(record, domain, &KeybaseVerif{
if err := a.UseRR(record, domain, &KeybaseVerif{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -100,11 +100,13 @@ func matrix_analyze(a *svc.Analyzer) error {
if srv, ok := record.(*dns.SRV); ok {
matrixDomains[domain].Records = append(matrixDomains[domain].Records, helpers.RRRelativeSubdomain(srv, a.GetOrigin(), domain).(*dns.SRV))
a.UseRR(
if err := a.UseRR(
srv,
domain,
matrixDomains[domain],
)
); err != nil {
return err
}
}
}
return nil

View file

@ -103,20 +103,24 @@ func origin_analyze(a *svc.Analyzer) error {
SOA: helpers.RRRelativeSubdomain(soa, a.GetOrigin(), domain).(*dns.SOA),
}
a.UseRR(
if err := a.UseRR(
record,
domain,
origin,
)
); err != nil {
return err
}
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeNS, Domain: domain}) {
if ns, ok := record.(*dns.NS); ok {
origin.NameServers = append(origin.NameServers, helpers.RRRelativeSubdomain(ns, a.GetOrigin(), domain).(*dns.NS))
a.UseRR(
if err := a.UseRR(
record,
domain,
origin,
)
); err != nil {
return err
}
}
}
}
@ -129,11 +133,13 @@ func origin_analyze(a *svc.Analyzer) error {
if ns, ok := record.(*dns.NS); ok {
domain := record.Header().Name
origin.NameServers = append(origin.NameServers, helpers.RRRelativeSubdomain(ns, a.GetOrigin(), domain).(*dns.NS))
a.UseRR(
if err := a.UseRR(
record,
domain,
origin,
)
); err != nil {
return err
}
}
}
}

View file

@ -165,11 +165,13 @@ func rfc6186_analyze(a *svc.Analyzer) error {
emailDomains[domain].Records = append(emailDomains[domain].Records, helpers.RRRelativeSubdomain(srv, a.GetOrigin(), domain).(*dns.SRV))
a.UseRR(
if err := a.UseRR(
record,
domain,
emailDomains[domain],
)
); err != nil {
return err
}
}
}
}

View file

@ -51,9 +51,11 @@ func scalewaychallenge_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeTXT, Prefix: "_scaleway-challenge"}) {
domain := strings.TrimPrefix(record.Header().Name, "_scaleway-challenge.")
if record.Header().Rrtype == dns.TypeTXT {
a.UseRR(record, domain, &ScalewayChallenge{
if err := a.UseRR(record, domain, &ScalewayChallenge{
Record: helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*happydns.TXT),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -131,7 +131,9 @@ next_pool:
s.SSHFP[i] = helpers.RRRelativeSubdomain(s.SSHFP[i], a.GetOrigin(), dn).(*dns.SSHFP)
}
a.UseRR(rr, dn, s)
if err := a.UseRR(rr, dn, s); err != nil {
return err
}
}
}

View file

@ -98,11 +98,13 @@ func xmpp_subanalyze(a *svc.Analyzer, prefix string, xmppDomains map[string]*XMP
if srv, ok := record.(*dns.SRV); ok {
xmppDomains[domain].Records = append(xmppDomains[domain].Records, helpers.RRRelativeSubdomain(srv, a.GetOrigin(), domain).(*dns.SRV))
a.UseRR(
if err := a.UseRR(
record,
domain,
xmppDomains[domain],
)
); err != nil {
return err
}
}
}
@ -112,9 +114,15 @@ func xmpp_subanalyze(a *svc.Analyzer, prefix string, xmppDomains map[string]*XMP
func xmpp_analyze(a *svc.Analyzer) error {
xmppDomains := map[string]*XMPP{}
xmpp_subanalyze(a, "_jabber._tcp.", xmppDomains)
xmpp_subanalyze(a, "_xmpp-client._tcp.", xmppDomains)
xmpp_subanalyze(a, "_xmpp-server._tcp.", xmppDomains)
if err := xmpp_subanalyze(a, "_jabber._tcp.", xmppDomains); err != nil {
return err
}
if err := xmpp_subanalyze(a, "_xmpp-client._tcp.", xmppDomains); err != nil {
return err
}
if err := xmpp_subanalyze(a, "_xmpp-server._tcp.", xmppDomains); err != nil {
return err
}
return nil
}

View file

@ -66,9 +66,11 @@ func specialalias_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeCNAME, Prefix: "_"}) {
subdomains := SRV_DOMAIN.FindStringSubmatch(record.Header().Name)
if cname, ok := record.(*dns.CNAME); ok && len(subdomains) == 4 {
a.UseRR(record, subdomains[3], &SpecialCNAME{
if err := a.UseRR(record, subdomains[3], &SpecialCNAME{
Record: helpers.RRRelativeSubdomain(cname, a.GetOrigin(), subdomains[3]).(*dns.CNAME),
})
}); err != nil {
return err
}
}
}
return nil
@ -78,9 +80,11 @@ func alias_analyze(a *svc.Analyzer) error {
for _, record := range a.SearchRR(svc.AnalyzerRecordFilter{Type: dns.TypeCNAME}) {
if cname, ok := record.(*dns.CNAME); ok {
domain := record.Header().Name
a.UseRR(record, domain, &CNAME{
if err := a.UseRR(record, domain, &CNAME{
Record: helpers.RRRelativeSubdomain(cname, a.GetOrigin(), domain).(*dns.CNAME),
})
}); err != nil {
return err
}
}
}
return nil

View file

@ -53,7 +53,9 @@ func pointer_analyze(a *svc.Analyzer) error {
Record: helpers.RRRelativeSubdomain(ptr, a.GetOrigin(), domain).(*dns.PTR),
}
a.UseRR(record, domain, newrr)
if err := a.UseRR(record, domain, newrr); err != nil {
return err
}
}
}
return nil

View file

@ -83,11 +83,13 @@ func srv_analyze(a *svc.Analyzer) error {
srvDomains[domain][svc].Records = append(srvDomains[domain][svc].Records, helpers.RRRelativeSubdomain(record, a.GetOrigin(), domain).(*dns.SRV))
a.UseRR(
if err := a.UseRR(
record,
subdomains[3],
srvDomains[domain][svc],
)
); err != nil {
return err
}
}
return nil
}

View file

@ -82,7 +82,9 @@ func sshfp_analyze(a *svc.Analyzer) error {
FingerPrint: sshfp.FingerPrint,
})
a.UseRR(rr, dn, s)
if err := a.UseRR(rr, dn, s); err != nil {
return err
}
}
}
}