Skip to content

Commit 439df49

Browse files
committed
review: 2
1 parent cf684a4 commit 439df49

File tree

4 files changed

+53
-95
lines changed

4 files changed

+53
-95
lines changed

providers/dns/nicru/internal/client.go

+36-75
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"context"
66
"encoding/xml"
77
"errors"
8-
"fmt"
98
"net/http"
109
"net/url"
1110
"strconv"
@@ -14,14 +13,11 @@ import (
1413
"golang.org/x/oauth2"
1514
)
1615

17-
const (
18-
defaultBaseURL = "https://api.nic.ru"
19-
TokenURL = defaultBaseURL + "/oauth/token"
20-
)
16+
const defaultBaseURL = "https://api.nic.ru"
2117

22-
const OAuth2Scope = ".+:/dns-master/.+"
18+
const tokenURL = defaultBaseURL + "/oauth/token"
2319

24-
const SuccessStatus = "success"
20+
const successStatus = "success"
2521

2622
// OauthConfiguration credentials.
2723
type OauthConfiguration struct {
@@ -43,10 +39,10 @@ func NewOauthClient(config *OauthConfiguration) (*http.Client, error) {
4339
ClientID: config.OAuth2ClientID,
4440
ClientSecret: config.OAuth2SecretID,
4541
Endpoint: oauth2.Endpoint{
46-
TokenURL: TokenURL,
42+
TokenURL: tokenURL,
4743
AuthStyle: oauth2.AuthStyleInParams,
4844
},
49-
Scopes: []string{OAuth2Scope},
45+
Scopes: []string{".+:/dns-master/.+"},
5046
}
5147

5248
oauth2Token, err := oauth2Config.PasswordCredentialsToken(ctx, config.Username, config.Password)
@@ -95,22 +91,14 @@ func (c *Client) GetZones() ([]*Zone, error) {
9591
return nil, err
9692
}
9793

98-
buf := bytes.NewBuffer(nil)
99-
if _, err := buf.ReadFrom(response.Body); err != nil {
100-
return nil, err
101-
}
102-
10394
apiResponse := &Response{}
104-
if err := xml.NewDecoder(buf).Decode(&apiResponse); err != nil {
105-
return nil, err
106-
}
10795

108-
var zones []*Zone
109-
for _, zone := range apiResponse.Data.Zone {
110-
zones = append(zones, zone)
96+
err = xml.NewDecoder(response.Body).Decode(apiResponse)
97+
if err != nil {
98+
return nil, err
11199
}
112100

113-
return zones, nil
101+
return apiResponse.Data.Zone, nil
114102
}
115103

116104
func (c *Client) GetRecords(fqdn string) ([]*RR, error) {
@@ -126,13 +114,10 @@ func (c *Client) GetRecords(fqdn string) ([]*RR, error) {
126114
return nil, err
127115
}
128116

129-
buf := bytes.NewBuffer(nil)
130-
if _, err := buf.ReadFrom(response.Body); err != nil {
131-
return nil, err
132-
}
133-
134117
apiResponse := &Response{}
135-
if err := xml.NewDecoder(buf).Decode(&apiResponse); err != nil {
118+
119+
err = xml.NewDecoder(response.Body).Decode(apiResponse)
120+
if err != nil {
136121
return nil, err
137122
}
138123

@@ -150,14 +135,14 @@ func (c *Client) GetTXTRecords(fqdn string) ([]*Txt, error) {
150135
return nil, err
151136
}
152137

153-
txt := make([]*Txt, 0)
138+
var txtRecords []*Txt
154139
for _, record := range records {
155140
if record.Txt != nil {
156-
txt = append(txt, record.Txt)
141+
txtRecords = append(txtRecords, record.Txt)
157142
}
158143
}
159144

160-
return txt, nil
145+
return txtRecords, nil
161146
}
162147

163148
func (c *Client) AddTxtRecord(zoneName string, name string, content string, ttl int) (*Response, error) {
@@ -171,8 +156,8 @@ func (c *Client) AddTxtRecord(zoneName string, name string, content string, ttl
171156
return c.add(zoneName, request)
172157
}
173158

174-
func (c *Client) DeleteRecord(zoneName string, id int) (*Response, error) {
175-
endpoint := c.baseURL.JoinPath("dns-master", "services", c.serviceName, "zones", zoneName, strconv.Itoa(id))
159+
func (c *Client) DeleteRecord(zoneName string, id string) (*Response, error) {
160+
endpoint := c.baseURL.JoinPath("dns-master", "services", c.serviceName, "zones", zoneName, "records", id)
176161

177162
req, err := http.NewRequest(http.MethodDelete, endpoint.String(), nil)
178163
if err != nil {
@@ -184,16 +169,18 @@ func (c *Client) DeleteRecord(zoneName string, id int) (*Response, error) {
184169
return nil, err
185170
}
186171

187-
apiResponse := Response{}
188-
if err := xml.NewDecoder(response.Body).Decode(&apiResponse); err != nil {
172+
apiResponse := &Response{}
173+
174+
err = xml.NewDecoder(response.Body).Decode(apiResponse)
175+
if err != nil {
189176
return nil, err
190177
}
191178

192-
if apiResponse.Status != SuccessStatus {
179+
if apiResponse.Status != successStatus {
193180
return nil, err
194181
}
195182

196-
return &apiResponse, nil
183+
return apiResponse, nil
197184
}
198185

199186
func (c *Client) CommitZone(zoneName string) (*Response, error) {
@@ -209,27 +196,29 @@ func (c *Client) CommitZone(zoneName string) (*Response, error) {
209196
return nil, err
210197
}
211198

212-
apiResponse := Response{}
213-
if err := xml.NewDecoder(response.Body).Decode(&apiResponse); err != nil {
199+
apiResponse := &Response{}
200+
201+
err = xml.NewDecoder(response.Body).Decode(apiResponse)
202+
if err != nil {
214203
return nil, err
215204
}
216205

217-
if apiResponse.Status != SuccessStatus {
206+
if apiResponse.Status != successStatus {
218207
return nil, err
219208
}
220209

221-
return &apiResponse, nil
210+
return apiResponse, nil
222211
}
223212

224213
func (c *Client) add(zoneName string, request *Request) (*Response, error) {
225214
endpoint := c.baseURL.JoinPath("dns-master", "services", c.serviceName, "zones", zoneName, "records")
226215

227-
buf := bytes.NewBuffer(nil)
228-
if err := xml.NewEncoder(buf).Encode(request); err != nil {
216+
body := &bytes.Buffer{}
217+
if err := xml.NewEncoder(body).Encode(request); err != nil {
229218
return nil, err
230219
}
231220

232-
req, err := http.NewRequest(http.MethodPut, endpoint.String(), buf)
221+
req, err := http.NewRequest(http.MethodPut, endpoint.String(), body)
233222
if err != nil {
234223
return nil, err
235224
}
@@ -239,46 +228,18 @@ func (c *Client) add(zoneName string, request *Request) (*Response, error) {
239228
return nil, err
240229
}
241230

242-
buf = bytes.NewBuffer(nil)
243-
if _, err := buf.ReadFrom(response.Body); err != nil {
244-
return nil, err
245-
}
246-
247231
apiResponse := &Response{}
248-
if err := xml.NewDecoder(buf).Decode(&apiResponse); err != nil {
249-
return nil, err
250-
}
251-
252-
if apiResponse.Status != SuccessStatus {
253-
return nil, fmt.Errorf(describeError(apiResponse.Errors.Error))
254-
}
255-
256-
return apiResponse, nil
257-
}
258-
259-
func (c *Client) deleteRecord(zoneName string, id int) (*Response, error) {
260-
endpoint := c.baseURL.JoinPath("dns-master", "services", c.serviceName, "zones", zoneName, "records", strconv.Itoa(id))
261232

262-
req, err := http.NewRequest(http.MethodDelete, endpoint.String(), nil)
233+
err = xml.NewDecoder(response.Body).Decode(apiResponse)
263234
if err != nil {
264235
return nil, err
265236
}
266237

267-
response, err := c.httpClient.Do(req)
268-
if err != nil {
269-
return nil, err
238+
if apiResponse.Status != successStatus {
239+
return nil, errors.New(describeError(apiResponse.Errors.Error))
270240
}
271241

272-
apiResponse := Response{}
273-
if err := xml.NewDecoder(response.Body).Decode(&apiResponse); err != nil {
274-
return nil, err
275-
}
276-
277-
if apiResponse.Status != SuccessStatus {
278-
return nil, err
279-
}
280-
281-
return &apiResponse, nil
242+
return apiResponse, nil
282243
}
283244

284245
func validateAuthOptions(config *OauthConfiguration) error {

providers/dns/nicru/internal/types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type RR struct {
2323
IdnName string `xml:"idn-name,omitempty" json:"idn_name,omitempty"`
2424
Ttl string `xml:"ttl" json:"ttl,omitempty"`
2525
Type string `xml:"type" json:"type,omitempty"`
26-
Soa *Soa `xml:"soa" xml:"soa,omitempty"`
26+
Soa *Soa `xml:"soa" json:"soa,omitempty"`
2727
A *Address `xml:"a" json:"a,omitempty"`
2828
AAAA *Address `xml:"aaaa" json:"aaaa,omitempty"`
2929
Cname *Cname `xml:"cname" json:"cname,omitempty"`

providers/dns/nicru/nicru.go

+10-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
// Package nicru implements a DNS provider for solving the DNS-01 challenge using RU Center.
12
package nicru
23

34
import (
45
"errors"
56
"fmt"
6-
"strconv"
77
"time"
88

99
"github.com/go-acme/lego/v4/challenge/dns01"
@@ -57,7 +57,7 @@ type DNSProvider struct {
5757
config *Config
5858
}
5959

60-
// NewDNSProvider returns a DNSProvider instance configured for NIC RU
60+
// NewDNSProvider returns a DNSProvider instance configured for RU Center.
6161
func NewDNSProvider() (*DNSProvider, error) {
6262
values, err := env.Get(EnvUsername, EnvPassword, EnvServiceId, EnvSecret, EnvServiceName)
6363
if err != nil {
@@ -74,7 +74,7 @@ func NewDNSProvider() (*DNSProvider, error) {
7474
return NewDNSProviderConfig(config)
7575
}
7676

77-
// NewDNSProviderConfig return a DNSProvider instance configured for NIC RU.
77+
// NewDNSProviderConfig return a DNSProvider instance configured for RU Center.
7878
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
7979
if config == nil {
8080
return nil, errors.New("nicru: the configuration of the DNS provider is nil")
@@ -114,7 +114,7 @@ func (p *DNSProvider) Present(domain, _, keyAuth string) error {
114114

115115
authZone = dns01.UnFqdn(authZone)
116116

117-
_, err = p.getZoneUUID(authZone)
117+
err = p.checkZoneUUID(authZone)
118118
if err != nil {
119119
return fmt.Errorf("nicru: %w", err)
120120
}
@@ -159,7 +159,7 @@ func (p *DNSProvider) CleanUp(domain, _, keyAuth string) error {
159159

160160
authZone = dns01.UnFqdn(authZone)
161161

162-
_, err = p.getZoneUUID(authZone)
162+
err = p.checkZoneUUID(authZone)
163163
if err != nil {
164164
return fmt.Errorf("nicru: %w", err)
165165
}
@@ -185,12 +185,7 @@ func (p *DNSProvider) CleanUp(domain, _, keyAuth string) error {
185185
continue
186186
}
187187

188-
id, err := strconv.Atoi(record.ID)
189-
if err != nil {
190-
return fmt.Errorf("nicru: %w", err)
191-
}
192-
193-
_, err = p.client.DeleteRecord(authZone, id)
188+
_, err = p.client.DeleteRecord(authZone, record.ID)
194189
if err != nil {
195190
return fmt.Errorf("nicru: %w", err)
196191
}
@@ -210,10 +205,10 @@ func (p *DNSProvider) Timeout() (timeout, interval time.Duration) {
210205
return p.config.PropagationTimeout, p.config.PollingInterval
211206
}
212207

213-
func (p *DNSProvider) getZoneUUID(authZone string) (string, error) {
208+
func (p *DNSProvider) checkZoneUUID(authZone string) error {
214209
zones, err := p.client.GetZones()
215210
if err != nil {
216-
return "", fmt.Errorf("unable to fetch dns zones: %w", err)
211+
return fmt.Errorf("unable to fetch dns zones: %w", err)
217212
}
218213

219214
var zoneUUID string
@@ -224,8 +219,8 @@ func (p *DNSProvider) getZoneUUID(authZone string) (string, error) {
224219
}
225220

226221
if zoneUUID == "" {
227-
return "", fmt.Errorf("zone UUID not found for %s", authZone)
222+
return fmt.Errorf("zone UUID not found for %s", authZone)
228223
}
229224

230-
return zoneUUID, nil
225+
return nil
231226
}

providers/dns/nicru/nicru_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package nicru
22

33
import (
4+
"testing"
5+
46
"github.com/go-acme/lego/v4/platform/tester"
57
"github.com/stretchr/testify/require"
6-
"testing"
78
)
89

9-
const defaultDomainName = "example.com"
10-
const envDomain = envNamespace + "DOMAIN"
11-
1210
const (
1311
fakeServiceId = "2519234972459cdfa23423adf143324f"
1412
fakeSecret = "oo5ahrie0aiPho3Vee4siupoPhahdahCh1thiesohru"
@@ -17,6 +15,10 @@ const (
1715
fakePassword = "einge8Goo2eBaiXievuj"
1816
)
1917

18+
const defaultDomainName = "example.com"
19+
20+
const envDomain = envNamespace + "DOMAIN"
21+
2022
var envTest = tester.NewEnvTest(EnvUsername, EnvPassword, EnvServiceId, EnvSecret, EnvServiceName).WithDomain(envDomain)
2123

2224
func TestNewDNSProvider(t *testing.T) {

0 commit comments

Comments
 (0)