From b4b1e5c930219de5ec748524f03c7fac7e13ee55 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 02:18:47 +0000 Subject: [PATCH] Add wildcard-aware TXT match helper --- service.go | 20 +++++++++++++++++--- service_test.go | 21 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/service.go b/service.go index 33851f8..f085895 100644 --- a/service.go +++ b/service.go @@ -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. diff --git a/service_test.go b/service_test.go index b849d11..a5a21c8 100644 --- a/service_test.go +++ b/service_test.go @@ -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{