From 7f9ef74b1c666b2a511da97f08f2046e14555702 Mon Sep 17 00:00:00 2001 From: archirk Date: Wed, 6 Nov 2024 14:54:07 +0300 Subject: [PATCH 1/2] Fix selectelv2 provider * Convert retrieved zone and record names to ASCII since API returns them in Unicode, which leads to failed DNS challenge, since zone and records can not be found --- docs/content/dns/zz_gen_selectelv2.md | 8 ++++---- providers/dns/selectelv2/selectelv2.go | 22 +++++++++++++++++----- providers/dns/selectelv2/selectelv2.toml | 8 ++++---- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/content/dns/zz_gen_selectelv2.md b/docs/content/dns/zz_gen_selectelv2.md index dba55a44fe..857e3d8381 100644 --- a/docs/content/dns/zz_gen_selectelv2.md +++ b/docs/content/dns/zz_gen_selectelv2.md @@ -26,10 +26,10 @@ Configuration for [Selectel v2](https://selectel.ru). Here is an example bash command using the Selectel v2 provider: ```bash -SELECTEL_USERNAME=trex \ -SELECTEL_PASSWORD=xxxxx \ -SELECTEL_ACCOUNT_ID=1234567 \ -SELECTEL_PROJECT_ID=111a11111aaa11aa1a11aaa11111aa1a \ +SELECTELV2_USERNAME=trex \ +SELECTELV2_PASSWORD=xxxxx \ +SELECTELV2_ACCOUNT_ID=1234567 \ +SELECTELV2_PROJECT_ID=111a11111aaa11aa1a11aaa11111aa1a \ lego --email you@example.com --dns selectelv2 --domains my.example.org run ``` diff --git a/providers/dns/selectelv2/selectelv2.go b/providers/dns/selectelv2/selectelv2.go index 8e114e245e..742d900deb 100644 --- a/providers/dns/selectelv2/selectelv2.go +++ b/providers/dns/selectelv2/selectelv2.go @@ -14,6 +14,7 @@ import ( "github.com/go-acme/lego/v4/providers/dns/internal/useragent" selectelapi "github.com/selectel/domains-go/pkg/v2" "github.com/selectel/go-selvpcclient/v3/selvpcclient" + "golang.org/x/net/idna" ) const tokenHeader = "X-Auth-Token" @@ -258,15 +259,18 @@ func (w *clientWrapper) getZone(ctx context.Context, name string) (*selectelapi. if err != nil { return nil, fmt.Errorf("list zone: %w", err) } - for _, zone := range zones.GetItems() { - if zone.Name == dns01.ToFqdn(name) { + punny, err := idna.ToASCII(zone.Name) + if err != nil { + return nil, fmt.Errorf("to ascii: %w", err) + } + if punny == dns01.ToFqdn(name) { return zone, nil } } if len(strings.Split(dns01.UnFqdn(name), ".")) == 1 { - return nil, errors.New("zone for challenge has not been found") + return nil, fmt.Errorf("zone '%s' for challenge has not been found", name) } // -1 can not be returned since if no dots present we exit above @@ -276,7 +280,11 @@ func (w *clientWrapper) getZone(ctx context.Context, name string) (*selectelapi. } func (w *clientWrapper) getRRset(ctx context.Context, name, zoneID string) (*selectelapi.RRSet, error) { - params := &map[string]string{"name": name, "rrset_types": string(selectelapi.TXT)} + filterName, e := idna.ToUnicode(name) + if e != nil { + return nil, fmt.Errorf("to unicode: %w", e) + } + params := &map[string]string{"name": filterName, "rrset_types": string(selectelapi.TXT)} resp, err := w.ListRRSets(ctx, zoneID, params) if err != nil { @@ -284,7 +292,11 @@ func (w *clientWrapper) getRRset(ctx context.Context, name, zoneID string) (*sel } for _, rrset := range resp.GetItems() { - if rrset.Name == dns01.ToFqdn(name) { + punny, err := idna.ToASCII(rrset.Name) + if err != nil { + return nil, fmt.Errorf("to ascii: %w", err) + } + if punny == dns01.ToFqdn(name) { return rrset, nil } } diff --git a/providers/dns/selectelv2/selectelv2.toml b/providers/dns/selectelv2/selectelv2.toml index 7870688bdd..b157c112ff 100644 --- a/providers/dns/selectelv2/selectelv2.toml +++ b/providers/dns/selectelv2/selectelv2.toml @@ -5,10 +5,10 @@ Code = "selectelv2" Since = "v4.17.0" Example = ''' -SELECTEL_USERNAME=trex \ -SELECTEL_PASSWORD=xxxxx \ -SELECTEL_ACCOUNT_ID=1234567 \ -SELECTEL_PROJECT_ID=111a11111aaa11aa1a11aaa11111aa1a \ +SELECTELV2_USERNAME=trex \ +SELECTELV2_PASSWORD=xxxxx \ +SELECTELV2_ACCOUNT_ID=1234567 \ +SELECTELV2_PROJECT_ID=111a11111aaa11aa1a11aaa11111aa1a \ lego --email you@example.com --dns selectelv2 --domains my.example.org run ''' From 21f10280470eb50aede6c0971bb1faf979150d27 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Wed, 6 Nov 2024 13:41:06 +0100 Subject: [PATCH 2/2] review --- providers/dns/selectelv2/selectelv2.go | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/providers/dns/selectelv2/selectelv2.go b/providers/dns/selectelv2/selectelv2.go index 742d900deb..f5bd10c924 100644 --- a/providers/dns/selectelv2/selectelv2.go +++ b/providers/dns/selectelv2/selectelv2.go @@ -253,18 +253,20 @@ type clientWrapper struct { } func (w *clientWrapper) getZone(ctx context.Context, name string) (*selectelapi.Zone, error) { - params := &map[string]string{"filter": name} + unicodeName, err := idna.ToUnicode(name) + if err != nil { + return nil, fmt.Errorf("to unicode: %w", err) + } + + params := &map[string]string{"filter": unicodeName} zones, err := w.ListZones(ctx, params) if err != nil { return nil, fmt.Errorf("list zone: %w", err) } + for _, zone := range zones.GetItems() { - punny, err := idna.ToASCII(zone.Name) - if err != nil { - return nil, fmt.Errorf("to ascii: %w", err) - } - if punny == dns01.ToFqdn(name) { + if zone.Name == dns01.ToFqdn(unicodeName) { return zone, nil } } @@ -280,11 +282,12 @@ func (w *clientWrapper) getZone(ctx context.Context, name string) (*selectelapi. } func (w *clientWrapper) getRRset(ctx context.Context, name, zoneID string) (*selectelapi.RRSet, error) { - filterName, e := idna.ToUnicode(name) - if e != nil { - return nil, fmt.Errorf("to unicode: %w", e) + unicodeName, err := idna.ToUnicode(name) + if err != nil { + return nil, fmt.Errorf("to unicode: %w", err) } - params := &map[string]string{"name": filterName, "rrset_types": string(selectelapi.TXT)} + + params := &map[string]string{"name": unicodeName, "rrset_types": string(selectelapi.TXT)} resp, err := w.ListRRSets(ctx, zoneID, params) if err != nil { @@ -292,11 +295,7 @@ func (w *clientWrapper) getRRset(ctx context.Context, name, zoneID string) (*sel } for _, rrset := range resp.GetItems() { - punny, err := idna.ToASCII(rrset.Name) - if err != nil { - return nil, fmt.Errorf("to ascii: %w", err) - } - if punny == dns01.ToFqdn(name) { + if rrset.Name == dns01.ToFqdn(unicodeName) { return rrset, nil } }