mirror of
https://github.com/go-acme/lego.git
synced 2025-07-16 03:44:18 +02:00
googledomains: provider deprecation (#2554)
This commit is contained in:
committed by
GitHub
parent
9531f9e9c9
commit
08316e47a6
@ -2,17 +2,12 @@
|
||||
package googledomains
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||
"github.com/go-acme/lego/v4/platform/config/env"
|
||||
"google.golang.org/api/acmedns/v1"
|
||||
"google.golang.org/api/option"
|
||||
)
|
||||
|
||||
// Environment variables names.
|
||||
@ -37,103 +32,29 @@ type Config struct {
|
||||
|
||||
// NewDefaultConfig returns a default configuration for the DNSProvider.
|
||||
func NewDefaultConfig() *Config {
|
||||
return &Config{
|
||||
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 2*time.Minute),
|
||||
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
|
||||
HTTPClient: &http.Client{
|
||||
Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
|
||||
},
|
||||
}
|
||||
return &Config{}
|
||||
}
|
||||
|
||||
type DNSProvider struct {
|
||||
config *Config
|
||||
acmedns *acmedns.Service
|
||||
}
|
||||
type DNSProvider struct{}
|
||||
|
||||
// NewDNSProvider returns the Google Domains DNS provider with a default configuration.
|
||||
func NewDNSProvider() (*DNSProvider, error) {
|
||||
values, err := env.Get(EnvAccessToken)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("googledomains: %w", err)
|
||||
}
|
||||
|
||||
config := NewDefaultConfig()
|
||||
config.AccessToken = values[EnvAccessToken]
|
||||
|
||||
return NewDNSProviderConfig(config)
|
||||
return NewDNSProviderConfig(&Config{})
|
||||
}
|
||||
|
||||
// NewDNSProviderConfig returns the Google Domains DNS provider with the provided config.
|
||||
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||
if config == nil {
|
||||
return nil, errors.New("googledomains: the configuration of the DNS provider is nil")
|
||||
}
|
||||
|
||||
if config.AccessToken == "" {
|
||||
return nil, errors.New("googledomains: access token is missing")
|
||||
}
|
||||
|
||||
service, err := acmedns.NewService(context.Background(), option.WithHTTPClient(config.HTTPClient))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("googledomains: error creating acme dns service: %w", err)
|
||||
}
|
||||
|
||||
return &DNSProvider{
|
||||
config: config,
|
||||
acmedns: service,
|
||||
}, nil
|
||||
func NewDNSProviderConfig(_ *Config) (*DNSProvider, error) {
|
||||
return nil, errors.New("googledomains: provider has shut down")
|
||||
}
|
||||
|
||||
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||
zone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||
if err != nil {
|
||||
return fmt.Errorf("googledomains: could not find zone for domain %q: %w", domain, err)
|
||||
}
|
||||
|
||||
rotateReq := acmedns.RotateChallengesRequest{
|
||||
AccessToken: d.config.AccessToken,
|
||||
RecordsToAdd: []*acmedns.AcmeTxtRecord{getAcmeTxtRecord(domain, keyAuth)},
|
||||
KeepExpiredRecords: false,
|
||||
}
|
||||
|
||||
call := d.acmedns.AcmeChallengeSets.RotateChallenges(zone, &rotateReq)
|
||||
_, err = call.Do()
|
||||
if err != nil {
|
||||
return fmt.Errorf("googledomains: error adding challenge for domain %s: %w", domain, err)
|
||||
}
|
||||
func (d *DNSProvider) Present(_, _, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||
zone, err := dns01.FindZoneByFqdn(dns01.ToFqdn(domain))
|
||||
if err != nil {
|
||||
return fmt.Errorf("googledomains: could not find zone for domain %q: %w", domain, err)
|
||||
}
|
||||
|
||||
rotateReq := acmedns.RotateChallengesRequest{
|
||||
AccessToken: d.config.AccessToken,
|
||||
RecordsToRemove: []*acmedns.AcmeTxtRecord{getAcmeTxtRecord(domain, keyAuth)},
|
||||
KeepExpiredRecords: false,
|
||||
}
|
||||
|
||||
call := d.acmedns.AcmeChallengeSets.RotateChallenges(zone, &rotateReq)
|
||||
_, err = call.Do()
|
||||
if err != nil {
|
||||
return fmt.Errorf("googledomains: error cleaning up challenge for domain %s: %w", domain, err)
|
||||
}
|
||||
func (d *DNSProvider) CleanUp(_, _, _ string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||
return d.config.PropagationTimeout, d.config.PollingInterval
|
||||
}
|
||||
|
||||
func getAcmeTxtRecord(domain, keyAuth string) *acmedns.AcmeTxtRecord {
|
||||
challengeInfo := dns01.GetChallengeInfo(domain, keyAuth)
|
||||
|
||||
return &acmedns.AcmeTxtRecord{
|
||||
Fqdn: challengeInfo.EffectiveFQDN,
|
||||
Digest: challengeInfo.Value,
|
||||
}
|
||||
return dns01.DefaultPropagationTimeout, dns01.DefaultPollingInterval
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
Name = "Google Domains"
|
||||
Description = ''''''
|
||||
URL = "https://domains.google"
|
||||
Description = '''
|
||||
The Google Domains DNS provider has shut down.
|
||||
'''
|
||||
URL = "https://github.com/go-acme/lego/issues/2553"
|
||||
Code = "googledomains"
|
||||
Since = "v4.11.0"
|
||||
|
||||
|
@ -1,111 +0,0 @@
|
||||
package googledomains
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/go-acme/lego/v4/platform/tester"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
const envDomain = envNamespace + "DOMAIN"
|
||||
|
||||
var envTest = tester.NewEnvTest(EnvAccessToken).
|
||||
WithDomain(envDomain).
|
||||
WithLiveTestRequirements(EnvAccessToken, envDomain)
|
||||
|
||||
func TestNewDNSProvider(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
envVars map[string]string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
desc: "success",
|
||||
envVars: map[string]string{
|
||||
EnvAccessToken: "abc",
|
||||
},
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
desc: "missing credentials",
|
||||
envVars: map[string]string{},
|
||||
expected: "googledomains: some credentials information are missing: GOOGLE_DOMAINS_ACCESS_TOKEN",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
defer envTest.RestoreEnv()
|
||||
envTest.ClearEnv()
|
||||
envTest.Apply(test.envVars)
|
||||
p, err := NewDNSProvider()
|
||||
if test.expected == "" {
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, p)
|
||||
} else {
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), test.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewDNSProviderConfig(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
accessToken string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
desc: "success",
|
||||
accessToken: "abc",
|
||||
},
|
||||
{
|
||||
desc: "missing credentials",
|
||||
expected: "googledomains: access token is missing",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
config := NewDefaultConfig()
|
||||
config.AccessToken = test.accessToken
|
||||
|
||||
p, err := NewDNSProviderConfig(config)
|
||||
|
||||
if test.expected == "" {
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, p)
|
||||
require.NotNil(t, p.config)
|
||||
} else {
|
||||
require.EqualError(t, err, test.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestLivePresent(t *testing.T) {
|
||||
if !envTest.IsLiveTest() {
|
||||
t.Skip("skipping live test")
|
||||
}
|
||||
|
||||
envTest.RestoreEnv()
|
||||
provider, err := NewDNSProvider()
|
||||
require.NoError(t, err)
|
||||
|
||||
err = provider.Present(envTest.GetDomain(), "", "123d==")
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestLiveCleanUp(t *testing.T) {
|
||||
if !envTest.IsLiveTest() {
|
||||
t.Skip("skipping live test")
|
||||
}
|
||||
|
||||
envTest.RestoreEnv()
|
||||
provider, err := NewDNSProvider()
|
||||
require.NoError(t, err)
|
||||
|
||||
err = provider.CleanUp(envTest.GetDomain(), "", "123d==")
|
||||
require.NoError(t, err)
|
||||
}
|
Reference in New Issue
Block a user