From 3f795d6ab1eac0f9727db063ccdc955191e64475 Mon Sep 17 00:00:00 2001 From: fries1234 Date: Sun, 30 Mar 2025 16:49:24 -0700 Subject: [PATCH] pdns: fix TXT record cleanup for wildcard domains (#2500) Co-authored-by: Fernandez Ludovic --- providers/dns/pdns/pdns.go | 31 +++++++++++++++++++++---------- providers/dns/pdns/pdns_test.go | 4 ++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/providers/dns/pdns/pdns.go b/providers/dns/pdns/pdns.go index 07bc663f1..c2f780ba8 100644 --- a/providers/dns/pdns/pdns.go +++ b/providers/dns/pdns/pdns.go @@ -7,6 +7,7 @@ import ( "fmt" "net/http" "net/url" + "strconv" "time" "github.com/go-acme/lego/v4/challenge" @@ -150,7 +151,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { } rec := internal.Record{ - Content: "\"" + info.Value + "\"", + Content: strconv.Quote(info.Value), Disabled: false, // pre-v1 API @@ -202,17 +203,27 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { return fmt.Errorf("pdns: no existing record found for %s", info.EffectiveFQDN) } - rrSets := internal.RRSets{ - RRSets: []internal.RRSet{ - { - Name: set.Name, - Type: set.Type, - ChangeType: "DELETE", - }, - }, + var records []internal.Record + for _, r := range set.Records { + if r.Content != strconv.Quote(info.Value) { + records = append(records, r) + } } - err = d.client.UpdateRecords(ctx, zone, rrSets) + rrSet := internal.RRSet{ + Name: set.Name, + Type: set.Type, + } + + if len(records) > 0 { + rrSet.ChangeType = "REPLACE" + rrSet.TTL = d.config.TTL + rrSet.Records = records + } else { + rrSet.ChangeType = "DELETE" + } + + err = d.client.UpdateRecords(ctx, zone, internal.RRSets{RRSets: []internal.RRSet{rrSet}}) if err != nil { return fmt.Errorf("pdns: %w", err) } diff --git a/providers/dns/pdns/pdns_test.go b/providers/dns/pdns/pdns_test.go index 70b386b81..6762e892e 100644 --- a/providers/dns/pdns/pdns_test.go +++ b/providers/dns/pdns/pdns_test.go @@ -141,9 +141,13 @@ func TestLivePresentAndCleanup(t *testing.T) { err = provider.Present(envTest.GetDomain(), "", "123d==") require.NoError(t, err) + err = provider.Present(envTest.GetDomain(), "", "123e==") + require.NoError(t, err) err = provider.CleanUp(envTest.GetDomain(), "", "123d==") require.NoError(t, err) + err = provider.CleanUp(envTest.GetDomain(), "", "123e==") + require.NoError(t, err) } func mustParse(rawURL string) *url.URL {