Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cmd/zz_gen_cmd_dnshelp.go
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,6 @@ func displayDNSHelp(w io.Writer, name string) error {

ew.writeln(`Credentials:`)
ew.writeln(` - "CPANEL_BASE_URL": API server URL`)
ew.writeln(` - "CPANEL_NAMESERVER": Nameserver`)
ew.writeln(` - "CPANEL_TOKEN": API token`)
ew.writeln(` - "CPANEL_USERNAME": username`)
ew.writeln()
Expand Down
3 changes: 0 additions & 3 deletions docs/content/dns/zz_gen_cpanel.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ Here is an example bash command using the CPanel/WHM provider:
CPANEL_USERNAME = "yyyy"
CPANEL_TOKEN = "xxxx"
CPANEL_BASE_URL = "https://example.com:2083" \
CPANEL_NAMESERVER = "ns1.example.com:53" \
lego --email [email protected] --dns cpanel --domains my.example.org run

## WHM
Expand All @@ -40,7 +39,6 @@ CPANEL_MODE = whm
CPANEL_USERNAME = "yyyy"
CPANEL_TOKEN = "xxxx"
CPANEL_BASE_URL = "https://example.com:2087" \
CPANEL_NAMESERVER = "ns1.example.com:53" \
lego --email [email protected] --dns cpanel --domains my.example.org run
```

Expand All @@ -52,7 +50,6 @@ lego --email [email protected] --dns cpanel --domains my.example.org run
| Environment Variable Name | Description |
|-----------------------|-------------|
| `CPANEL_BASE_URL` | API server URL |
| `CPANEL_NAMESERVER` | Nameserver |
| `CPANEL_TOKEN` | API token |
| `CPANEL_USERNAME` | username |

Expand Down
45 changes: 19 additions & 26 deletions providers/dns/cpanel/cpanel.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,10 @@ import (
const (
envNamespace = "CPANEL_"

EnvMode = envNamespace + "MODE"
EnvUsername = envNamespace + "USERNAME"
EnvToken = envNamespace + "TOKEN"
EnvBaseURL = envNamespace + "BASE_URL"
EnvNameserver = envNamespace + "NAMESERVER"
EnvMode = envNamespace + "MODE"
EnvUsername = envNamespace + "USERNAME"
EnvToken = envNamespace + "TOKEN"
EnvBaseURL = envNamespace + "BASE_URL"

EnvTTL = envNamespace + "TTL"
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
Expand All @@ -46,7 +45,6 @@ type Config struct {
Username string
Token string
BaseURL string
Nameserver string
TTL int
PropagationTimeout time.Duration
PollingInterval time.Duration
Expand All @@ -58,7 +56,7 @@ func NewDefaultConfig() *Config {
return &Config{
Mode: env.GetOrDefaultString(EnvMode, "cpanel"),
TTL: env.GetOrDefaultInt(EnvTTL, 300),
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, dns01.DefaultPropagationTimeout),
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 2*time.Minute),
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
HTTPClient: &http.Client{
Timeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
Expand All @@ -68,16 +66,15 @@ func NewDefaultConfig() *Config {

// DNSProvider implements the challenge.Provider interface.
type DNSProvider struct {
config *Config
client apiClient
dnsClient *shared.DNSClient
config *Config
client apiClient
}

// NewDNSProvider returns a DNSProvider instance configured for CPanel.
// Credentials must be passed in the environment variables:
// CPANEL_USERNAME, CPANEL_TOKEN, CPANEL_BASE_URL, CPANEL_NAMESERVER.
func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(EnvUsername, EnvToken, EnvBaseURL, EnvNameserver)
values, err := env.Get(EnvUsername, EnvToken, EnvBaseURL)
if err != nil {
return nil, fmt.Errorf("cpanel: %w", err)
}
Expand All @@ -86,7 +83,6 @@ func NewDNSProvider() (*DNSProvider, error) {
config.Username = values[EnvUsername]
config.Token = values[EnvToken]
config.BaseURL = values[EnvBaseURL]
config.Nameserver = values[EnvNameserver]

return NewDNSProviderConfig(config)
}
Expand All @@ -101,7 +97,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
return nil, errors.New("cpanel: some credentials information are missing")
}

if config.BaseURL == "" || config.Nameserver == "" {
if config.BaseURL == "" {
return nil, errors.New("cpanel: server information are missing")
}

Expand All @@ -111,9 +107,8 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
}

return &DNSProvider{
config: config,
client: client,
dnsClient: shared.NewDNSClient(10 * time.Second),
config: config,
client: client,
}, nil
}

Expand All @@ -128,21 +123,19 @@ func (d *DNSProvider) Present(domain, _, keyAuth string) error {
ctx := context.Background()
info := dns01.GetChallengeInfo(domain, keyAuth)

effectiveDomain := strings.TrimPrefix(info.EffectiveFQDN, "_acme-challenge.")

soa, err := d.dnsClient.SOACall(effectiveDomain, d.config.Nameserver)
authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: could not find SOA for domain %q (%s) in %s: %w", d.config.Mode, domain, info.EffectiveFQDN, d.config.Nameserver, err)
return fmt.Errorf("arvancloud: could not find zone for domain %q (%s): %w", domain, info.EffectiveFQDN, err)
}

zone := dns01.UnFqdn(soa.Hdr.Name)
zone := dns01.UnFqdn(authZone)

zoneInfo, err := d.client.FetchZoneInformation(ctx, zone)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: fetch zone information: %w", d.config.Mode, err)
}

serial, err := getZoneSerial(soa.Hdr.Name, zoneInfo)
serial, err := getZoneSerial(authZone, zoneInfo)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: get zone serial: %w", d.config.Mode, err)
}
Expand Down Expand Up @@ -204,19 +197,19 @@ func (d *DNSProvider) CleanUp(domain, _, keyAuth string) error {
ctx := context.Background()
info := dns01.GetChallengeInfo(domain, keyAuth)

soa, err := d.dnsClient.SOACall(strings.TrimPrefix(info.EffectiveFQDN, "_acme-challenge."), d.config.Nameserver)
authZone, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: could not find SOA for domain %q (%s) in %s: %w", d.config.Mode, domain, info.EffectiveFQDN, d.config.Nameserver, err)
return fmt.Errorf("arvancloud: could not find zone for domain %q (%s): %w", domain, info.EffectiveFQDN, err)
}

zone := dns01.UnFqdn(soa.Hdr.Name)
zone := dns01.UnFqdn(authZone)

zoneInfo, err := d.client.FetchZoneInformation(ctx, zone)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: fetch zone information: %w", d.config.Mode, err)
}

serial, err := getZoneSerial(soa.Hdr.Name, zoneInfo)
serial, err := getZoneSerial(authZone, zoneInfo)
if err != nil {
return fmt.Errorf("cpanel[mode=%s]: get zone serial: %w", d.config.Mode, err)
}
Expand Down
3 changes: 0 additions & 3 deletions providers/dns/cpanel/cpanel.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ Example = '''
CPANEL_USERNAME = "yyyy"
CPANEL_TOKEN = "xxxx"
CPANEL_BASE_URL = "https://example.com:2083" \
CPANEL_NAMESERVER = "ns1.example.com:53" \
lego --email [email protected] --dns cpanel --domains my.example.org run

## WHM
Expand All @@ -19,7 +18,6 @@ CPANEL_MODE = whm
CPANEL_USERNAME = "yyyy"
CPANEL_TOKEN = "xxxx"
CPANEL_BASE_URL = "https://example.com:2087" \
CPANEL_NAMESERVER = "ns1.example.com:53" \
lego --email [email protected] --dns cpanel --domains my.example.org run
'''

Expand All @@ -28,7 +26,6 @@ lego --email [email protected] --dns cpanel --domains my.example.org run
CPANEL_USERNAME = "username"
CPANEL_TOKEN = "API token"
CPANEL_BASE_URL = "API server URL"
CPANEL_NAMESERVER = "Nameserver"
[Configuration.Additional]
CPANEL_MODE = "use cpanel API or WHM API (Default: cpanel)"
CPANEL_POLLING_INTERVAL = "Time between DNS propagation check"
Expand Down
143 changes: 55 additions & 88 deletions providers/dns/cpanel/cpanel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ var envTest = tester.NewEnvTest(
EnvMode,
EnvUsername,
EnvToken,
EnvBaseURL,
EnvNameserver).
EnvBaseURL).
WithDomain(envDomain)

func TestNewDNSProvider(t *testing.T) {
Expand All @@ -30,62 +29,47 @@ func TestNewDNSProvider(t *testing.T) {
{
desc: "success cpanel mode (default)",
envVars: map[string]string{
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
EnvNameserver: "ns.example.com:53",
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
},
expectedMode: "cpanel",
},
{
desc: "success whm mode",
envVars: map[string]string{
EnvMode: "whm",
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
EnvNameserver: "ns.example.com:53",
EnvMode: "whm",
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
},
expectedMode: "whm",
},
{
desc: "missing user",
envVars: map[string]string{
EnvToken: "secret",
EnvBaseURL: "https://example.com",
EnvNameserver: "ns.example.com:53",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
},
expected: "cpanel: some credentials information are missing: CPANEL_USERNAME",
},
{
desc: "missing token",
envVars: map[string]string{
EnvUsername: "user",
EnvBaseURL: "https://example.com",
EnvNameserver: "ns.example.com:53",
EnvUsername: "user",
EnvBaseURL: "https://example.com",
},
expected: "cpanel: some credentials information are missing: CPANEL_TOKEN",
},
{
desc: "missing base URL",
envVars: map[string]string{
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "",
EnvNameserver: "ns.example.com:53",
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "",
},
expected: "cpanel: some credentials information are missing: CPANEL_BASE_URL",
},
{
desc: "missing nameserver",
envVars: map[string]string{
EnvUsername: "user",
EnvToken: "secret",
EnvBaseURL: "https://example.com",
EnvNameserver: "",
},
expected: "cpanel: some credentials information are missing: CPANEL_NAMESERVER",
},
}

for _, test := range testCases {
Expand All @@ -111,74 +95,58 @@ func TestNewDNSProvider(t *testing.T) {

func TestNewDNSProviderConfig(t *testing.T) {
testCases := []struct {
desc string
mode string
username string
token string
baseURL string
nameserver string
expected string
desc string
mode string
username string
token string
baseURL string
expected string
}{
{
desc: "success",
mode: "whm",
username: "user",
token: "secret",
baseURL: "https://example.com",
nameserver: "ns.example.com:53",
},
{
desc: "missing mode",
username: "user",
token: "secret",
baseURL: "https://example.com",
nameserver: "ns.example.com:53",
expected: `cpanel: create client error: unsupported mode: ""`,
desc: "success",
mode: "whm",
username: "user",
token: "secret",
baseURL: "https://example.com",
},
{
desc: "invalid mode",
mode: "test",
username: "user",
token: "secret",
baseURL: "https://example.com",
nameserver: "ns.example.com:53",
expected: `cpanel: create client error: unsupported mode: "test"`,
desc: "missing mode",
username: "user",
token: "secret",
baseURL: "https://example.com",
expected: `cpanel: create client error: unsupported mode: ""`,
},
{
desc: "missing username",
mode: "whm",
username: "",
token: "secret",
baseURL: "https://example.com",
nameserver: "ns.example.com:53",
expected: "cpanel: some credentials information are missing",
desc: "invalid mode",
mode: "test",
username: "user",
token: "secret",
baseURL: "https://example.com",
expected: `cpanel: create client error: unsupported mode: "test"`,
},
{
desc: "missing token",
mode: "whm",
username: "user",
token: "",
baseURL: "https://example.com",
nameserver: "ns.example.com:53",
expected: "cpanel: some credentials information are missing",
desc: "missing username",
mode: "whm",
username: "",
token: "secret",
baseURL: "https://example.com",
expected: "cpanel: some credentials information are missing",
},
{
desc: "missing base URL",
mode: "whm",
username: "user",
token: "secret",
baseURL: "",
nameserver: "ns.example.com:53",
expected: "cpanel: server information are missing",
desc: "missing token",
mode: "whm",
username: "user",
token: "",
baseURL: "https://example.com",
expected: "cpanel: some credentials information are missing",
},
{
desc: "missing nameserver",
mode: "whm",
username: "user",
token: "secret",
baseURL: "https://example.com",
nameserver: "",
expected: "cpanel: server information are missing",
desc: "missing base URL",
mode: "whm",
username: "user",
token: "secret",
baseURL: "",
expected: "cpanel: server information are missing",
},
}

Expand All @@ -189,7 +157,6 @@ func TestNewDNSProviderConfig(t *testing.T) {
config.Username = test.username
config.Token = test.token
config.BaseURL = test.baseURL
config.Nameserver = test.nameserver

p, err := NewDNSProviderConfig(config)

Expand Down
Loading