Skip to content

Commit 0bbf5ab

Browse files
authored
chore: shared deref and pointer functions (#2376)
1 parent 1a62bba commit 0bbf5ab

File tree

13 files changed

+107
-148
lines changed

13 files changed

+107
-148
lines changed

providers/dns/azuredns/azuredns.go

-9
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,3 @@ func getZoneName(config *Config, fqdn string) (string, error) {
278278

279279
return authZone, nil
280280
}
281-
282-
func deref[T any](v *T) T {
283-
if v == nil {
284-
var zero T
285-
return zero
286-
}
287-
288-
return *v
289-
}

providers/dns/azuredns/private.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns"
1515
"github.com/go-acme/lego/v4/challenge"
1616
"github.com/go-acme/lego/v4/challenge/dns01"
17+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
1718
)
1819

1920
var _ challenge.ProviderTimeout = (*DNSProviderPrivate)(nil)
@@ -184,7 +185,7 @@ func privateUniqueRecords(recordSet armprivatedns.RecordSet, value string) map[s
184185
for _, txtRecord := range recordSet.Properties.TxtRecords {
185186
// Assume Value doesn't contain multiple strings
186187
if len(txtRecord.Value) > 0 {
187-
uniqRecords[deref(txtRecord.Value[0])] = struct{}{}
188+
uniqRecords[ptr.Deref(txtRecord.Value[0])] = struct{}{}
188189
}
189190
}
190191
}

providers/dns/azuredns/public.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns"
1515
"github.com/go-acme/lego/v4/challenge"
1616
"github.com/go-acme/lego/v4/challenge/dns01"
17+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
1718
)
1819

1920
var _ challenge.ProviderTimeout = (*DNSProviderPublic)(nil)
@@ -182,7 +183,7 @@ func publicUniqueRecords(recordSet armdns.RecordSet, value string) map[string]st
182183
for _, txtRecord := range recordSet.Properties.TxtRecords {
183184
// Assume Value doesn't contain multiple strings
184185
if len(txtRecord.Value) > 0 {
185-
uniqRecords[deref(txtRecord.Value[0])] = struct{}{}
186+
uniqRecords[ptr.Deref(txtRecord.Value[0])] = struct{}{}
186187
}
187188
}
188189
}

providers/dns/azuredns/servicediscovery.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
1010
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
1111
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph"
12+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
1213
)
1314

1415
type ServiceDiscoveryZone struct {
@@ -88,7 +89,7 @@ func discoverDNSZones(ctx context.Context, config *Config, credentials azcore.To
8889
*requestOptions.Skip += ResourceGraphQueryOptionsTop
8990

9091
if result.TotalRecords != nil {
91-
if int64(deref(requestOptions.Skip)) >= deref(result.TotalRecords) {
92+
if int64(ptr.Deref(requestOptions.Skip)) >= ptr.Deref(result.TotalRecords) {
9293
break
9394
}
9495
}

providers/dns/bunny/bunny.go

+14-24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/go-acme/lego/v4/challenge"
1212
"github.com/go-acme/lego/v4/challenge/dns01"
1313
"github.com/go-acme/lego/v4/platform/config/env"
14+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
1415
"github.com/miekg/dns"
1516
"github.com/nrdcg/bunny-go"
1617
"golang.org/x/net/publicsuffix"
@@ -104,20 +105,20 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
104105
return fmt.Errorf("bunny: %w", err)
105106
}
106107

107-
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, deref(zone.Domain))
108+
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, ptr.Deref(zone.Domain))
108109
if err != nil {
109110
return fmt.Errorf("bunny: %w", err)
110111
}
111112

112113
record := &bunny.AddOrUpdateDNSRecordOptions{
113-
Type: pointer(bunny.DNSRecordTypeTXT),
114-
Name: pointer(subDomain),
115-
Value: pointer(info.Value),
116-
TTL: pointer(int32(d.config.TTL)),
114+
Type: ptr.Pointer(bunny.DNSRecordTypeTXT),
115+
Name: ptr.Pointer(subDomain),
116+
Value: ptr.Pointer(info.Value),
117+
TTL: ptr.Pointer(int32(d.config.TTL)),
117118
}
118119

119-
if _, err := d.client.DNSZone.AddDNSRecord(ctx, deref(zone.ID), record); err != nil {
120-
return fmt.Errorf("bunny: failed to add TXT record: fqdn=%s, zoneID=%d: %w", info.EffectiveFQDN, deref(zone.ID), err)
120+
if _, err := d.client.DNSZone.AddDNSRecord(ctx, ptr.Deref(zone.ID), record); err != nil {
121+
return fmt.Errorf("bunny: failed to add TXT record: fqdn=%s, zoneID=%d: %w", info.EffectiveFQDN, ptr.Deref(zone.ID), err)
121122
}
122123

123124
return nil
@@ -134,26 +135,26 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
134135
return fmt.Errorf("bunny: %w", err)
135136
}
136137

137-
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, deref(zone.Domain))
138+
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, ptr.Deref(zone.Domain))
138139
if err != nil {
139140
return fmt.Errorf("bunny: %w", err)
140141
}
141142

142143
var record *bunny.DNSRecord
143144
for _, r := range zone.Records {
144-
if deref(r.Name) == subDomain && deref(r.Type) == bunny.DNSRecordTypeTXT {
145+
if ptr.Deref(r.Name) == subDomain && ptr.Deref(r.Type) == bunny.DNSRecordTypeTXT {
145146
r := r
146147
record = &r
147148
break
148149
}
149150
}
150151

151152
if record == nil {
152-
return fmt.Errorf("bunny: could not find TXT record zone=%d, subdomain=%s", deref(zone.ID), subDomain)
153+
return fmt.Errorf("bunny: could not find TXT record zone=%d, subdomain=%s", ptr.Deref(zone.ID), subDomain)
153154
}
154155

155-
if err := d.client.DNSZone.DeleteDNSRecord(ctx, deref(zone.ID), deref(record.ID)); err != nil {
156-
return fmt.Errorf("bunny: failed to delete TXT record: id=%d, name=%s: %w", deref(record.ID), deref(record.Name), err)
156+
if err := d.client.DNSZone.DeleteDNSRecord(ctx, ptr.Deref(zone.ID), ptr.Deref(record.ID)); err != nil {
157+
return fmt.Errorf("bunny: failed to delete TXT record: id=%d, name=%s: %w", ptr.Deref(record.ID), ptr.Deref(record.Name), err)
157158
}
158159

159160
return nil
@@ -184,7 +185,7 @@ func findZone(zones *bunny.DNSZones, domain string) *bunny.DNSZone {
184185
continue
185186
}
186187

187-
curr := deref(item.Domain)
188+
curr := ptr.Deref(item.Domain)
188189

189190
if slices.Contains(domains, curr) && domainLength < len(curr) {
190191
domainLength = len(curr)
@@ -213,14 +214,3 @@ func possibleDomains(domain string) []string {
213214

214215
return domains
215216
}
216-
217-
func pointer[T string | int | int32 | int64](v T) *T { return &v }
218-
219-
func deref[T string | int | int32 | int64](v *T) T {
220-
if v == nil {
221-
var zero T
222-
return zero
223-
}
224-
225-
return *v
226-
}

providers/dns/bunny/bunny_test.go

+25-24
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"testing"
55

66
"github.com/go-acme/lego/v4/platform/tester"
7+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
78
"github.com/nrdcg/bunny-go"
89
"github.com/stretchr/testify/assert"
910
"github.com/stretchr/testify/require"
@@ -137,54 +138,54 @@ func Test_findZone(t *testing.T) {
137138
desc: "found subdomain",
138139
domain: "_acme-challenge.foo.bar.example.com",
139140
items: []*bunny.DNSZone{
140-
{ID: pointer[int64](1), Domain: pointer("example.com")},
141-
{ID: pointer[int64](2), Domain: pointer("example.org")},
142-
{ID: pointer[int64](4), Domain: pointer("bar.example.org")},
143-
{ID: pointer[int64](5), Domain: pointer("bar.example.com")},
144-
{ID: pointer[int64](6), Domain: pointer("foo.example.com")},
141+
{ID: ptr.Pointer[int64](1), Domain: ptr.Pointer("example.com")},
142+
{ID: ptr.Pointer[int64](2), Domain: ptr.Pointer("example.org")},
143+
{ID: ptr.Pointer[int64](4), Domain: ptr.Pointer("bar.example.org")},
144+
{ID: ptr.Pointer[int64](5), Domain: ptr.Pointer("bar.example.com")},
145+
{ID: ptr.Pointer[int64](6), Domain: ptr.Pointer("foo.example.com")},
145146
},
146147
expected: &bunny.DNSZone{
147-
ID: pointer[int64](5),
148-
Domain: pointer("bar.example.com"),
148+
ID: ptr.Pointer[int64](5),
149+
Domain: ptr.Pointer("bar.example.com"),
149150
},
150151
},
151152
{
152153
desc: "found the longest subdomain",
153154
domain: "_acme-challenge.foo.bar.example.com",
154155
items: []*bunny.DNSZone{
155-
{ID: pointer[int64](7), Domain: pointer("foo.bar.example.com")},
156-
{ID: pointer[int64](1), Domain: pointer("example.com")},
157-
{ID: pointer[int64](2), Domain: pointer("example.org")},
158-
{ID: pointer[int64](4), Domain: pointer("bar.example.org")},
159-
{ID: pointer[int64](5), Domain: pointer("bar.example.com")},
160-
{ID: pointer[int64](6), Domain: pointer("foo.example.com")},
156+
{ID: ptr.Pointer[int64](7), Domain: ptr.Pointer("foo.bar.example.com")},
157+
{ID: ptr.Pointer[int64](1), Domain: ptr.Pointer("example.com")},
158+
{ID: ptr.Pointer[int64](2), Domain: ptr.Pointer("example.org")},
159+
{ID: ptr.Pointer[int64](4), Domain: ptr.Pointer("bar.example.org")},
160+
{ID: ptr.Pointer[int64](5), Domain: ptr.Pointer("bar.example.com")},
161+
{ID: ptr.Pointer[int64](6), Domain: ptr.Pointer("foo.example.com")},
161162
},
162163
expected: &bunny.DNSZone{
163-
ID: pointer[int64](7),
164-
Domain: pointer("foo.bar.example.com"),
164+
ID: ptr.Pointer[int64](7),
165+
Domain: ptr.Pointer("foo.bar.example.com"),
165166
},
166167
},
167168
{
168169
desc: "found apex",
169170
domain: "_acme-challenge.foo.bar.example.com",
170171
items: []*bunny.DNSZone{
171-
{ID: pointer[int64](1), Domain: pointer("example.com")},
172-
{ID: pointer[int64](2), Domain: pointer("example.org")},
173-
{ID: pointer[int64](4), Domain: pointer("bar.example.org")},
174-
{ID: pointer[int64](6), Domain: pointer("foo.example.com")},
172+
{ID: ptr.Pointer[int64](1), Domain: ptr.Pointer("example.com")},
173+
{ID: ptr.Pointer[int64](2), Domain: ptr.Pointer("example.org")},
174+
{ID: ptr.Pointer[int64](4), Domain: ptr.Pointer("bar.example.org")},
175+
{ID: ptr.Pointer[int64](6), Domain: ptr.Pointer("foo.example.com")},
175176
},
176177
expected: &bunny.DNSZone{
177-
ID: pointer[int64](1),
178-
Domain: pointer("example.com"),
178+
ID: ptr.Pointer[int64](1),
179+
Domain: ptr.Pointer("example.com"),
179180
},
180181
},
181182
{
182183
desc: "not found",
183184
domain: "_acme-challenge.foo.bar.example.com",
184185
items: []*bunny.DNSZone{
185-
{ID: pointer[int64](2), Domain: pointer("example.org")},
186-
{ID: pointer[int64](4), Domain: pointer("bar.example.org")},
187-
{ID: pointer[int64](6), Domain: pointer("foo.example.com")},
186+
{ID: ptr.Pointer[int64](2), Domain: ptr.Pointer("example.org")},
187+
{ID: ptr.Pointer[int64](4), Domain: ptr.Pointer("bar.example.org")},
188+
{ID: ptr.Pointer[int64](6), Domain: ptr.Pointer("foo.example.com")},
188189
},
189190
},
190191
}

providers/dns/huaweicloud/huaweicloud.go

+14-24
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/go-acme/lego/v4/challenge/dns01"
1414
"github.com/go-acme/lego/v4/platform/config/env"
1515
"github.com/go-acme/lego/v4/platform/wait"
16+
"github.com/go-acme/lego/v4/providers/dns/internal/ptr"
1617
hwauthbasic "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
1718
hwconfig "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"
1819
hwdns "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2"
@@ -155,7 +156,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
155156
return false, fmt.Errorf("show record set: %w", errShow)
156157
}
157158

158-
return !strings.HasSuffix(deref(rs.Status), "PENDING_"), nil
159+
return !strings.HasSuffix(ptr.Deref(rs.Status), "PENDING_"), nil
159160
})
160161
if err != nil {
161162
return fmt.Errorf("huaweicloud: %w", err)
@@ -208,16 +209,16 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
208209
func (d *DNSProvider) getOrCreateRecordSetID(domain, zoneID string, info dns01.ChallengeInfo) (string, error) {
209210
records, err := d.client.ListRecordSetsByZone(&hwmodel.ListRecordSetsByZoneRequest{
210211
ZoneId: zoneID,
211-
Name: pointer(info.EffectiveFQDN),
212+
Name: ptr.Pointer(info.EffectiveFQDN),
212213
})
213214
if err != nil {
214215
return "", fmt.Errorf("record list: unable to get record %s for zone %s: %w", info.EffectiveFQDN, domain, err)
215216
}
216217

217218
var existingRecordSet *hwmodel.ListRecordSets
218219

219-
for _, record := range deref(records.Recordsets) {
220-
if deref(record.Type) == "TXT" && deref(record.Name) == info.EffectiveFQDN {
220+
for _, record := range ptr.Deref(records.Recordsets) {
221+
if ptr.Deref(record.Type) == "TXT" && ptr.Deref(record.Name) == info.EffectiveFQDN {
221222
existingRecordSet = &record
222223
}
223224
}
@@ -229,9 +230,9 @@ func (d *DNSProvider) getOrCreateRecordSetID(domain, zoneID string, info dns01.C
229230
ZoneId: zoneID,
230231
Body: &hwmodel.CreateRecordSetRequestBody{
231232
Name: info.EffectiveFQDN,
232-
Description: pointer("Added TXT record for ACME dns-01 challenge using lego client"),
233+
Description: ptr.Pointer("Added TXT record for ACME dns-01 challenge using lego client"),
233234
Type: "TXT",
234-
Ttl: pointer(d.config.TTL),
235+
Ttl: ptr.Pointer(d.config.TTL),
235236
Records: []string{value},
236237
},
237238
}
@@ -241,18 +242,18 @@ func (d *DNSProvider) getOrCreateRecordSetID(domain, zoneID string, info dns01.C
241242
return "", fmt.Errorf("create record set: %w", errCreate)
242243
}
243244

244-
return deref(resp.Id), nil
245+
return ptr.Deref(resp.Id), nil
245246
}
246247

247248
updateRequest := &hwmodel.UpdateRecordSetRequest{
248249
ZoneId: zoneID,
249-
RecordsetId: deref(existingRecordSet.Id),
250+
RecordsetId: ptr.Deref(existingRecordSet.Id),
250251
Body: &hwmodel.UpdateRecordSetReq{
251252
Name: existingRecordSet.Name,
252253
Description: existingRecordSet.Description,
253254
Type: existingRecordSet.Type,
254255
Ttl: existingRecordSet.Ttl,
255-
Records: pointer(append(deref(existingRecordSet.Records), value)),
256+
Records: ptr.Pointer(append(ptr.Deref(existingRecordSet.Records), value)),
256257
},
257258
}
258259

@@ -261,7 +262,7 @@ func (d *DNSProvider) getOrCreateRecordSetID(domain, zoneID string, info dns01.C
261262
return "", fmt.Errorf("update record set: %w", err)
262263
}
263264

264-
return deref(resp.Id), nil
265+
return ptr.Deref(resp.Id), nil
265266
}
266267

267268
func (d *DNSProvider) getZoneID(authZone string) (string, error) {
@@ -270,22 +271,11 @@ func (d *DNSProvider) getZoneID(authZone string) (string, error) {
270271
return "", fmt.Errorf("unable to get zone: %w", err)
271272
}
272273

273-
for _, zone := range deref(zones.Zones) {
274-
if deref(zone.Name) == authZone {
275-
return deref(zone.Id), nil
274+
for _, zone := range ptr.Deref(zones.Zones) {
275+
if ptr.Deref(zone.Name) == authZone {
276+
return ptr.Deref(zone.Id), nil
276277
}
277278
}
278279

279280
return "", fmt.Errorf("zone %q not found", authZone)
280281
}
281-
282-
func pointer[T any](v T) *T { return &v }
283-
284-
func deref[T any](v *T) T {
285-
if v == nil {
286-
var zero T
287-
return zero
288-
}
289-
290-
return *v
291-
}

providers/dns/internal/ptr/types.go

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package ptr
2+
3+
func Deref[T any](v *T) T {
4+
if v == nil {
5+
var zero T
6+
return zero
7+
}
8+
9+
return *v
10+
}
11+
12+
func Pointer[T any](v T) *T { return &v }

0 commit comments

Comments
 (0)