Skip to content

Commit f00f122

Browse files
committed
chore: update cloudflare-go
1 parent 1a59620 commit f00f122

File tree

3 files changed

+121
-74
lines changed

3 files changed

+121
-74
lines changed

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ require (
1313
github.com/blevesearch/bleve/v2 v2.5.6
1414
github.com/caarlos0/env/v11 v11.3.1
1515
github.com/casdoor/casdoor-go-sdk v1.39.0
16-
github.com/cloudflare/cloudflare-go v0.116.0
1716
github.com/cloudflare/cloudflare-go/v6 v6.4.0
1817
github.com/creack/pty v1.1.24
1918
github.com/dgraph-io/ristretto/v2 v2.3.0
@@ -311,6 +310,10 @@ require (
311310
github.com/stretchr/objx v0.5.3 // indirect
312311
github.com/subosito/gotenv v1.6.0 // indirect
313312
github.com/technoweenie/multipartstreamer v1.0.1 // indirect
313+
github.com/tidwall/gjson v1.18.0 // indirect
314+
github.com/tidwall/match v1.1.1 // indirect
315+
github.com/tidwall/pretty v1.2.1 // indirect
316+
github.com/tidwall/sjson v1.2.5 // indirect
314317
github.com/timtadh/data-structures v0.6.2 // indirect
315318
github.com/timtadh/lexmachine v0.2.3 // indirect
316319
github.com/tinylib/msgp v1.6.1 // indirect

go.sum

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -913,8 +913,7 @@ github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5P
913913
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
914914
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
915915
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
916-
github.com/cloudflare/cloudflare-go v0.116.0 h1:iRPMnTtnswRpELO65NTwMX4+RTdxZl+Xf/zi+HPE95s=
917-
github.com/cloudflare/cloudflare-go v0.116.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU=
916+
github.com/cloudflare/cloudflare-go/v6 v6.4.0 h1:uigzhmfDfve+zFAYYWIBOAMEuDoPEJXdPS3NBrEm8/Q=
918917
github.com/cloudflare/cloudflare-go/v6 v6.4.0/go.mod h1:Lj3MUqjvKctXRpdRhLQxZYRrNZHuRs0XYuH8JtQGyoI=
919918
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
920919
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
@@ -1984,6 +1983,16 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 h1:DdeB0V
19841983
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
19851984
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.7 h1:lbQreENxWLI6SeKbjvbKnTgMsBPGaFeJ0OYX74utwxA=
19861985
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.7/go.mod h1:+wjQc7L2X9CUvczJ+2pAdZiv8teqkrCfBD2x1vpKWhw=
1986+
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
1987+
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
1988+
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
1989+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
1990+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
1991+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
1992+
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
1993+
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
1994+
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
1995+
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
19871996
github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU=
19881997
github.com/timtadh/data-structures v0.6.1/go.mod h1:uYUnI1cQi/5yMCc7s23I+x8Mn8BCMf4WgK+7/4QSEk4=
19891998
github.com/timtadh/data-structures v0.6.2 h1:zybDnU5NLjJ7WKMDJpvVwczQuf1wSLBgdRHZ9O4AqJ0=

internal/dns/providers/cloudflare/provider.go

Lines changed: 106 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ import (
88
"sync"
99
"time"
1010

11-
cf "github.com/cloudflare/cloudflare-go"
11+
cf "github.com/cloudflare/cloudflare-go/v6"
12+
cfdns "github.com/cloudflare/cloudflare-go/v6/dns"
13+
cfopt "github.com/cloudflare/cloudflare-go/v6/option"
14+
cfzones "github.com/cloudflare/cloudflare-go/v6/zones"
1215

1316
"github.com/0xJacky/Nginx-UI/internal/dns"
1417
)
1518

1619
const defaultTimeout = 10 * time.Second
1720

1821
type provider struct {
19-
client *cf.API
22+
client *cf.Client
2023
zoneCache sync.Map
2124
}
2225

@@ -27,15 +30,15 @@ func init() {
2730
func newProvider(cred *dns.Credential) (dns.Provider, error) {
2831
httpClient := &http.Client{Timeout: defaultTimeout}
2932

30-
opts := []cf.Option{
31-
cf.HTTPClient(httpClient),
33+
opts := []cfopt.RequestOption{
34+
cfopt.WithHTTPClient(httpClient),
3235
}
3336

3437
if baseURL := firstNonEmpty(
3538
cred.Additional["CLOUDFLARE_BASE_URL"],
3639
cred.Additional["CF_BASE_URL"],
3740
); baseURL != "" {
38-
opts = append(opts, cf.BaseURL(baseURL))
41+
opts = append(opts, cfopt.WithBaseURL(baseURL))
3942
}
4043

4144
token := firstNonEmpty(
@@ -45,13 +48,10 @@ func newProvider(cred *dns.Credential) (dns.Provider, error) {
4548
cred.Values["CF_API_TOKEN"],
4649
)
4750

48-
var (
49-
api *cf.API
50-
err error
51-
)
51+
var api *cf.Client
5252

5353
if token != "" {
54-
api, err = cf.NewWithAPIToken(token, opts...)
54+
api = cf.NewClient(append(opts, cfopt.WithAPIToken(token))...)
5555
} else {
5656
email := firstNonEmpty(
5757
cred.Values["CLOUDFLARE_EMAIL"],
@@ -64,11 +64,7 @@ func newProvider(cred *dns.Credential) (dns.Provider, error) {
6464
if email == "" || key == "" {
6565
return nil, fmt.Errorf("cloudflare: missing API credentials")
6666
}
67-
api, err = cf.New(key, email, opts...)
68-
}
69-
70-
if err != nil {
71-
return nil, fmt.Errorf("cloudflare: %w", err)
67+
api = cf.NewClient(append(opts, cfopt.WithAPIKey(key), cfopt.WithAPIEmail(email))...)
7268
}
7369

7470
return &provider{
@@ -77,141 +73,169 @@ func newProvider(cred *dns.Credential) (dns.Provider, error) {
7773
}
7874

7975
func (p *provider) ListRecords(ctx context.Context, domain string, filter dns.RecordFilter) ([]dns.Record, error) {
80-
zoneID, err := p.zoneID(domain)
76+
zoneID, err := p.zoneID(ctx, domain)
8177
if err != nil {
8278
return nil, err
8379
}
8480

85-
params := cf.ListDNSRecordsParams{
86-
Type: strings.ToUpper(strings.TrimSpace(filter.Type)),
81+
params := cfdns.RecordListParams{
82+
ZoneID: cf.F(zoneID),
8783
}
8884

89-
if params.Type == "" {
90-
params.Type = ""
85+
recordType := strings.ToUpper(strings.TrimSpace(filter.Type))
86+
if recordType != "" {
87+
params.Type = cf.F(cfdns.RecordListParamsType(recordType))
9188
}
9289

93-
if filter.Name != "" {
94-
params.Name = buildFQDN(domain, filter.Name)
90+
if name := strings.TrimSpace(filter.Name); name != "" {
91+
params.Name = cf.F(cfdns.RecordListParamsName{
92+
Exact: cf.F(buildFQDN(domain, name)),
93+
})
9594
}
9695

97-
records, _, err := p.client.ListDNSRecords(ctx, cf.ZoneIdentifier(zoneID), params)
98-
if err != nil {
99-
return nil, fmt.Errorf("cloudflare: list records: %w", err)
100-
}
96+
pager := p.client.DNS.Records.ListAutoPaging(ctx, params)
10197

102-
result := make([]dns.Record, 0, len(records))
103-
for _, record := range records {
98+
result := make([]dns.Record, 0)
99+
for pager.Next() {
100+
record := pager.Current()
101+
proxied := record.Proxied
104102
result = append(result, dns.Record{
105103
ID: record.ID,
106-
Type: record.Type,
104+
Type: string(record.Type),
107105
Name: toRelativeName(record.Name, domain),
108106
Content: record.Content,
109-
TTL: record.TTL,
110-
Priority: toOptionalInt(record.Priority),
111-
Proxied: record.Proxied,
107+
TTL: int(record.TTL),
108+
Priority: toOptionalPriority(record.Priority),
109+
Proxied: &proxied,
112110
})
113111
}
114112

113+
if err := pager.Err(); err != nil {
114+
return nil, fmt.Errorf("cloudflare: list records: %w", err)
115+
}
116+
115117
return result, nil
116118
}
117119

118120
func (p *provider) CreateRecord(ctx context.Context, domain string, input dns.RecordInput) (dns.Record, error) {
119-
zoneID, err := p.zoneID(domain)
121+
zoneID, err := p.zoneID(ctx, domain)
120122
if err != nil {
121123
return dns.Record{}, err
122124
}
123125

124-
params := cf.CreateDNSRecordParams{
125-
Type: strings.ToUpper(strings.TrimSpace(input.Type)),
126-
Name: buildFQDN(domain, input.Name),
127-
Content: strings.TrimSpace(input.Content),
128-
TTL: input.TTL,
129-
Proxied: input.Proxied,
126+
body := cfdns.RecordNewParamsBody{
127+
Type: cf.F(cfdns.RecordNewParamsBodyType(strings.ToUpper(strings.TrimSpace(input.Type)))),
128+
Name: cf.F(buildFQDN(domain, input.Name)),
129+
Content: cf.F(strings.TrimSpace(input.Content)),
130+
TTL: cf.F(cfdns.TTL(normalizeTTL(input.TTL))),
131+
}
132+
133+
if input.Proxied != nil {
134+
body.Proxied = cf.F(*input.Proxied)
130135
}
131136

132137
if input.Priority != nil {
133-
value := uint16(max(*input.Priority, 0))
134-
params.Priority = &value
138+
value := float64(max(*input.Priority, 0))
139+
body.Priority = cf.F(value)
135140
}
136141

137-
record, err := p.client.CreateDNSRecord(ctx, cf.ZoneIdentifier(zoneID), params)
142+
record, err := p.client.DNS.Records.New(ctx, cfdns.RecordNewParams{
143+
ZoneID: cf.F(zoneID),
144+
Body: body,
145+
})
138146
if err != nil {
139147
return dns.Record{}, fmt.Errorf("cloudflare: create record: %w", err)
140148
}
141149

142150
return dns.Record{
143151
ID: record.ID,
144-
Type: record.Type,
152+
Type: string(record.Type),
145153
Name: toRelativeName(record.Name, domain),
146154
Content: record.Content,
147-
TTL: record.TTL,
148-
Priority: toOptionalInt(record.Priority),
149-
Proxied: record.Proxied,
155+
TTL: int(record.TTL),
156+
Priority: toOptionalPriority(record.Priority),
157+
Proxied: boolPtr(record.Proxied),
150158
}, nil
151159
}
152160

153161
func (p *provider) UpdateRecord(ctx context.Context, domain string, recordID string, input dns.RecordInput) (dns.Record, error) {
154-
zoneID, err := p.zoneID(domain)
162+
zoneID, err := p.zoneID(ctx, domain)
155163
if err != nil {
156164
return dns.Record{}, err
157165
}
158166

159-
params := cf.UpdateDNSRecordParams{
160-
ID: recordID,
161-
Type: strings.ToUpper(strings.TrimSpace(input.Type)),
162-
Name: buildFQDN(domain, input.Name),
163-
Content: strings.TrimSpace(input.Content),
164-
TTL: input.TTL,
165-
Proxied: input.Proxied,
167+
body := cfdns.RecordUpdateParamsBody{
168+
Type: cf.F(cfdns.RecordUpdateParamsBodyType(strings.ToUpper(strings.TrimSpace(input.Type)))),
169+
Name: cf.F(buildFQDN(domain, input.Name)),
170+
Content: cf.F(strings.TrimSpace(input.Content)),
171+
TTL: cf.F(cfdns.TTL(normalizeTTL(input.TTL))),
172+
}
173+
174+
if input.Proxied != nil {
175+
body.Proxied = cf.F(*input.Proxied)
166176
}
167177

168178
if input.Priority != nil {
169-
value := uint16(max(*input.Priority, 0))
170-
params.Priority = &value
179+
value := float64(max(*input.Priority, 0))
180+
body.Priority = cf.F(value)
171181
}
172182

173-
record, err := p.client.UpdateDNSRecord(ctx, cf.ZoneIdentifier(zoneID), params)
183+
record, err := p.client.DNS.Records.Update(ctx, recordID, cfdns.RecordUpdateParams{
184+
ZoneID: cf.F(zoneID),
185+
Body: body,
186+
})
174187
if err != nil {
175188
return dns.Record{}, fmt.Errorf("cloudflare: update record: %w", err)
176189
}
177190

178191
return dns.Record{
179192
ID: record.ID,
180-
Type: record.Type,
193+
Type: string(record.Type),
181194
Name: toRelativeName(record.Name, domain),
182195
Content: record.Content,
183-
TTL: record.TTL,
184-
Priority: toOptionalInt(record.Priority),
185-
Proxied: record.Proxied,
196+
TTL: int(record.TTL),
197+
Priority: toOptionalPriority(record.Priority),
198+
Proxied: boolPtr(record.Proxied),
186199
}, nil
187200
}
188201

189202
func (p *provider) DeleteRecord(ctx context.Context, domain string, recordID string) error {
190-
zoneID, err := p.zoneID(domain)
203+
zoneID, err := p.zoneID(ctx, domain)
191204
if err != nil {
192205
return err
193206
}
194207

195-
if err := p.client.DeleteDNSRecord(ctx, cf.ZoneIdentifier(zoneID), recordID); err != nil {
208+
if _, err := p.client.DNS.Records.Delete(ctx, recordID, cfdns.RecordDeleteParams{
209+
ZoneID: cf.F(zoneID),
210+
}); err != nil {
196211
return fmt.Errorf("cloudflare: delete record: %w", err)
197212
}
198213

199214
return nil
200215
}
201216

202-
func (p *provider) zoneID(domain string) (string, error) {
217+
func (p *provider) zoneID(ctx context.Context, domain string) (string, error) {
203218
normalized := strings.TrimSuffix(strings.ToLower(strings.TrimSpace(domain)), ".")
204219
if zoneID, ok := p.zoneCache.Load(normalized); ok {
205220
return zoneID.(string), nil
206221
}
207222

208-
id, err := p.client.ZoneIDByName(normalized)
209-
if err != nil {
223+
pager := p.client.Zones.ListAutoPaging(ctx, cfzones.ZoneListParams{
224+
Name: cf.F(normalized),
225+
})
226+
for pager.Next() {
227+
zone := pager.Current()
228+
if strings.EqualFold(strings.TrimSuffix(zone.Name, "."), normalized) {
229+
p.zoneCache.Store(normalized, zone.ID)
230+
return zone.ID, nil
231+
}
232+
}
233+
234+
if err := pager.Err(); err != nil {
210235
return "", fmt.Errorf("cloudflare: resolve zone id: %w", err)
211236
}
212237

213-
p.zoneCache.Store(normalized, id)
214-
return id, nil
238+
return "", fmt.Errorf("cloudflare: resolve zone id: not found")
215239
}
216240

217241
func firstNonEmpty(values ...string) string {
@@ -250,17 +274,28 @@ func toRelativeName(fqdn, domain string) string {
250274
return fqdn
251275
}
252276

253-
func toOptionalInt(value *uint16) *int {
254-
if value == nil {
277+
func toOptionalPriority(value float64) *int {
278+
if value == 0 {
255279
return nil
256280
}
257-
v := int(*value)
281+
v := int(value)
258282
return &v
259283
}
260284

285+
func normalizeTTL(ttl int) int {
286+
if ttl <= 0 {
287+
return 1
288+
}
289+
return ttl
290+
}
291+
261292
func max(a, b int) int {
262293
if a > b {
263294
return a
264295
}
265296
return b
266297
}
298+
299+
func boolPtr(v bool) *bool {
300+
return &v
301+
}

0 commit comments

Comments
 (0)