Add wildcard-aware TXT match helper

This commit is contained in:
Virgil 2026-04-04 02:18:47 +00:00
parent b417373f5b
commit b4b1e5c930
2 changed files with 38 additions and 3 deletions

View file

@ -868,7 +868,7 @@ func (service *Service) ResolveTXT(name string) ([]string, bool) {
if service == nil {
return nil, false
}
result, ok := service.ResolveTXTRecords(name)
result, ok, _ := service.ResolveTXTWithMatch(name)
if !ok {
return nil, false
}
@ -882,13 +882,27 @@ func (service *Service) ResolveTXTRecords(name string) (ResolveTXTResult, bool)
if service == nil {
return ResolveTXTResult{}, false
}
record, ok := service.findRecord(name)
result, ok, _ := service.ResolveTXTWithMatch(name)
if !ok {
return ResolveTXTResult{}, false
}
return result, true
}
// ResolveTXTWithMatch returns TXT values and whether the match used a wildcard.
//
// result, ok, usedWildcard := service.ResolveTXTWithMatch("node1.gateway.charon.lthn")
func (service *Service) ResolveTXTWithMatch(name string) (ResolveTXTResult, bool, bool) {
if service == nil {
return ResolveTXTResult{}, false, false
}
record, ok, usedWildcard := service.findRecordWithMatch(name)
if !ok {
return ResolveTXTResult{}, false, false
}
return ResolveTXTResult{
TXT: cloneStrings(record.TXT),
}, true
}, true, usedWildcard
}
// DiscoverWithHSD refreshes DNS records for each alias by calling HSD.

View file

@ -265,6 +265,27 @@ func TestServiceResolveTXTUsesWildcard(t *testing.T) {
}
}
func TestServiceResolveTXTWithMatchReportsWildcard(t *testing.T) {
service := NewService(ServiceOptions{
Records: map[string]NameRecords{
"*.gateway.charon.lthn": {
TXT: []string{"v=lthn1 type=gateway"},
},
},
})
result, ok, usedWildcard := service.ResolveTXTWithMatch("node1.gateway.charon.lthn.")
if !ok {
t.Fatal("expected wildcard TXT record")
}
if !usedWildcard {
t.Fatal("expected wildcard TXT lookup to report usedWildcard=true")
}
if len(result.TXT) != 1 || result.TXT[0] != "v=lthn1 type=gateway" {
t.Fatalf("unexpected TXT record: %#v", result.TXT)
}
}
func TestServiceResolveTXTRecordsReturnsNamedField(t *testing.T) {
service := NewService(ServiceOptions{
Records: map[string]NameRecords{