From c8f12b3a89f225a19b56aa3968984fc05c17f8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sun, 30 Mar 2025 15:27:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96dns=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 4 ++-- pkg/acme/client.go | 8 ++++---- pkg/acme/solvers.go | 37 +++++++++++++++++++++++-------------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index cfdd3b7f..9143bbac 100644 --- a/go.mod +++ b/go.mod @@ -99,6 +99,6 @@ require ( ) replace ( - github.com/libdns/alidns => github.com/devhaozi/alidns v0.0.0-20250329210040-6497b3450b2e + github.com/libdns/alidns => github.com/devhaozi/alidns v0.0.0-20250330070326-05637d1994b2 github.com/mholt/acmez/v3 => github.com/tnb-labs/acmez/v3 v3.0.0-20250329064837-dd8e7d30835a ) diff --git a/go.sum b/go.sum index 1a5c932e..e99af468 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/devhaozi/alidns v0.0.0-20250329210040-6497b3450b2e h1:BXNrrReE2H1/T26hxFXKX58/mmD+mE/tAVHlvChQaqM= -github.com/devhaozi/alidns v0.0.0-20250329210040-6497b3450b2e/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE= +github.com/devhaozi/alidns v0.0.0-20250330070326-05637d1994b2 h1:X+QklrHA7FubkxJKTQoM5oLSD53e5JULlXRb/QNUm3g= +github.com/devhaozi/alidns v0.0.0-20250330070326-05637d1994b2/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE= github.com/devhaozi/westcn v0.0.0-20250329192208-199d82100bff h1:SLHnJyRcp6OxbMjHr7FvPvT84IoXuofu+1EeMU+Tr1M= github.com/devhaozi/westcn v0.0.0-20250329192208-199d82100bff/go.mod h1:dUJZQSurBuEWKixGyCYCyiVIkSFxrgqN3B036tHMPtU= github.com/expr-lang/expr v1.17.2 h1:o0A99O/Px+/DTjEnQiodAgOIK9PPxL8DtXhBRKC+Iso= diff --git a/pkg/acme/client.go b/pkg/acme/client.go index 8f4a676f..4b68ad8a 100644 --- a/pkg/acme/client.go +++ b/pkg/acme/client.go @@ -26,10 +26,10 @@ type Client struct { // UseDns 使用 DNS 接口验证 func (c *Client) UseDns(dnsType DnsType, param DNSParam) { c.zClient.ChallengeSolvers = map[string]acmez.Solver{ - acme.ChallengeTypeDNS01: dnsSolver{ + acme.ChallengeTypeDNS01: &dnsSolver{ dns: dnsType, param: param, - records: &[]libdns.Record{}, + records: []libdns.Record{}, }, } } @@ -39,11 +39,11 @@ func (c *Client) UseManualDns(total int, check ...bool) { c.controlChan = make(chan struct{}) c.dataChan = make(chan any) c.zClient.ChallengeSolvers = map[string]acmez.Solver{ - acme.ChallengeTypeDNS01: manualDNSSolver{ + acme.ChallengeTypeDNS01: &manualDNSSolver{ check: len(check) > 0 && check[0], controlChan: c.controlChan, dataChan: c.dataChan, - records: &[]DNSRecord{}, + records: []DNSRecord{}, }, } } diff --git a/pkg/acme/solvers.go b/pkg/acme/solvers.go index 60775edc..35471fc7 100644 --- a/pkg/acme/solvers.go +++ b/pkg/acme/solvers.go @@ -3,11 +3,11 @@ package acme import ( "context" "fmt" - "github.com/devhaozi/westcn" "os" "strings" "time" + "github.com/devhaozi/westcn" "github.com/libdns/alidns" "github.com/libdns/cloudflare" "github.com/libdns/cloudns" @@ -62,10 +62,10 @@ func (s httpSolver) CleanUp(_ context.Context, challenge acme.Challenge) error { type dnsSolver struct { dns DnsType param DNSParam - records *[]libdns.Record + records []libdns.Record } -func (s dnsSolver) Present(ctx context.Context, challenge acme.Challenge) error { +func (s *dnsSolver) Present(ctx context.Context, challenge acme.Challenge) error { dnsName := challenge.DNS01TXTRecordName() keyAuth := challenge.DNS01KeyAuthorization() provider, err := s.getDNSProvider() @@ -92,11 +92,11 @@ func (s dnsSolver) Present(ctx context.Context, challenge acme.Challenge) error return fmt.Errorf("expected to add 1 record, but actually added %d records", len(results)) } - s.records = &results + s.records = results return nil } -func (s dnsSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error { +func (s *dnsSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error { dnsName := challenge.DNS01TXTRecordName() provider, err := s.getDNSProvider() if err != nil { @@ -111,11 +111,11 @@ func (s dnsSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error return fmt.Errorf("failed to get the effective TLD+1 for %q: %w", dnsName, err) } - _, _ = provider.DeleteRecords(ctx, zone+".", *s.records) + _, _ = provider.DeleteRecords(ctx, zone+".", s.records) return nil } -func (s dnsSolver) getDNSProvider() (DNSProvider, error) { +func (s *dnsSolver) getDNSProvider() (DNSProvider, error) { var dns DNSProvider switch s.dns { @@ -241,10 +241,10 @@ type manualDNSSolver struct { check bool controlChan chan struct{} dataChan chan any - records *[]DNSRecord + records []DNSRecord } -func (s manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge) error { +func (s *manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge) error { full := challenge.DNS01TXTRecordName() keyAuth := challenge.DNS01KeyAuthorization() domain, err := publicsuffix.EffectiveTLDPlusOne(full) @@ -252,18 +252,27 @@ func (s manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge) return fmt.Errorf("failed to get the effective TLD+1 for %q: %w", full, err) } - *s.records = append(*s.records, DNSRecord{ + s.records = append(s.records, DNSRecord{ Name: strings.TrimSuffix(full, "."+domain), Domain: domain, Value: keyAuth, }) - s.dataChan <- *s.records + s.dataChan <- s.records - <-s.controlChan - return nil + select { + case <-s.controlChan: + return nil + case <-ctx.Done(): + return ctx.Err() + } } -func (s manualDNSSolver) CleanUp(_ context.Context, _ acme.Challenge) error { +func (s *manualDNSSolver) CleanUp(_ context.Context, _ acme.Challenge) error { + defer func() { + _ = recover() + }() + close(s.controlChan) + close(s.dataChan) return nil }