forked from TrueCloudLab/lego
chore: update linter. (#1214)
This commit is contained in:
parent
23328fcdd2
commit
6b00497f34
56 changed files with 119 additions and 102 deletions
|
@ -37,6 +37,7 @@
|
||||||
"testpackage", # not relevant
|
"testpackage", # not relevant
|
||||||
"nestif", # too many false-positive
|
"nestif", # too many false-positive
|
||||||
"goerr113", # not relevant
|
"goerr113", # not relevant
|
||||||
|
"noctx",
|
||||||
]
|
]
|
||||||
|
|
||||||
[issues]
|
[issues]
|
||||||
|
@ -49,7 +50,7 @@
|
||||||
]
|
]
|
||||||
[[issues.exclude-rules]]
|
[[issues.exclude-rules]]
|
||||||
path = "(.+)_test.go"
|
path = "(.+)_test.go"
|
||||||
linters = ["funlen"]
|
linters = ["funlen", "goconst"]
|
||||||
[[issues.exclude-rules]]
|
[[issues.exclude-rules]]
|
||||||
path = "providers/dns/dns_providers.go"
|
path = "providers/dns/dns_providers.go"
|
||||||
linters = ["gocyclo"]
|
linters = ["gocyclo"]
|
||||||
|
|
|
@ -28,7 +28,7 @@ func (a *AccountService) New(req acme.Account) (acme.ExtendedAccount, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEAB Creates a new account with an External Account Binding.
|
// NewEAB Creates a new account with an External Account Binding.
|
||||||
func (a *AccountService) NewEAB(accMsg acme.Account, kid string, hmacEncoded string) (acme.ExtendedAccount, error) {
|
func (a *AccountService) NewEAB(accMsg acme.Account, kid, hmacEncoded string) (acme.ExtendedAccount, error) {
|
||||||
hmac, err := base64.RawURLEncoding.DecodeString(hmacEncoded)
|
hmac, err := base64.RawURLEncoding.DecodeString(hmacEncoded)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return acme.ExtendedAccount{}, fmt.Errorf("acme: could not decode hmac key: %w", err)
|
return acme.ExtendedAccount{}, fmt.Errorf("acme: could not decode hmac key: %w", err)
|
||||||
|
|
|
@ -35,7 +35,7 @@ type Core struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// New Creates a new Core.
|
// New Creates a new Core.
|
||||||
func New(httpClient *http.Client, userAgent string, caDirURL, kid string, privateKey crypto.PrivateKey) (*Core, error) {
|
func New(httpClient *http.Client, userAgent, caDirURL, kid string, privateKey crypto.PrivateKey) (*Core, error) {
|
||||||
doer := sender.NewDoer(httpClient, userAgent)
|
doer := sender.NewDoer(httpClient, userAgent)
|
||||||
|
|
||||||
dir, err := getDirectory(doer, caDirURL)
|
dir, err := getDirectory(doer, caDirURL)
|
||||||
|
|
|
@ -11,7 +11,7 @@ type service struct {
|
||||||
|
|
||||||
// getLink get a rel into the Link header.
|
// getLink get a rel into the Link header.
|
||||||
func getLink(header http.Header, rel string) string {
|
func getLink(header http.Header, rel string) string {
|
||||||
var linkExpr = regexp.MustCompile(`<(.+?)>;\s*rel="(.+?)"`)
|
linkExpr := regexp.MustCompile(`<(.+?)>;\s*rel="(.+?)"`)
|
||||||
|
|
||||||
for _, link := range header["Link"] {
|
for _, link := range header["Link"] {
|
||||||
for _, m := range linkExpr.FindAllStringSubmatch(link, -1) {
|
for _, m := range linkExpr.FindAllStringSubmatch(link, -1) {
|
||||||
|
|
|
@ -232,7 +232,7 @@ func (c *Certifier) getForOrder(domains []string, order acme.ExtendedOrder, bund
|
||||||
return c.getForCSR(domains, order, bundle, csr, certcrypto.PEMEncode(privateKey))
|
return c.getForCSR(domains, order, bundle, csr, certcrypto.PEMEncode(privateKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Certifier) getForCSR(domains []string, order acme.ExtendedOrder, bundle bool, csr []byte, privateKeyPem []byte) (*Resource, error) {
|
func (c *Certifier) getForCSR(domains []string, order acme.ExtendedOrder, bundle bool, csr, privateKeyPem []byte) (*Resource, error) {
|
||||||
respOrder, err := c.core.Orders.UpdateForCSR(order.Finalize, csr)
|
respOrder, err := c.core.Orders.UpdateForCSR(order.Finalize, csr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -172,7 +172,7 @@ type sequential interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRecord returns a DNS record which will fulfill the `dns-01` challenge.
|
// GetRecord returns a DNS record which will fulfill the `dns-01` challenge.
|
||||||
func GetRecord(domain, keyAuth string) (fqdn string, value string) {
|
func GetRecord(domain, keyAuth string) (fqdn, value string) {
|
||||||
keyAuthShaBytes := sha256.Sum256([]byte(keyAuth))
|
keyAuthShaBytes := sha256.Sum256([]byte(keyAuth))
|
||||||
// base64URL encoding without padding
|
// base64URL encoding without padding
|
||||||
value = base64.RawURLEncoding.EncodeToString(keyAuthShaBytes[:sha256.Size])
|
value = base64.RawURLEncoding.EncodeToString(keyAuthShaBytes[:sha256.Size])
|
||||||
|
|
|
@ -169,7 +169,7 @@ func TestFindPrimayNsByFqdnCustom(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestResolveConfServers(t *testing.T) {
|
func TestResolveConfServers(t *testing.T) {
|
||||||
var testCases = []struct {
|
testCases := []struct {
|
||||||
fixture string
|
fixture string
|
||||||
expected []string
|
expected []string
|
||||||
defaults []string
|
defaults []string
|
||||||
|
|
|
@ -126,7 +126,7 @@ func TestChallengeWithProxy(t *testing.T) {
|
||||||
nook = "example.com"
|
nook = "example.com"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testCases = []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
header *testProxyHeader
|
header *testProxyHeader
|
||||||
extra *testProxyHeader
|
extra *testProxyHeader
|
||||||
|
|
|
@ -16,9 +16,11 @@ type preSolverMock struct {
|
||||||
func (s *preSolverMock) PreSolve(authorization acme.Authorization) error {
|
func (s *preSolverMock) PreSolve(authorization acme.Authorization) error {
|
||||||
return s.preSolve[authorization.Identifier.Value]
|
return s.preSolve[authorization.Identifier.Value]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *preSolverMock) Solve(authorization acme.Authorization) error {
|
func (s *preSolverMock) Solve(authorization acme.Authorization) error {
|
||||||
return s.solve[authorization.Identifier.Value]
|
return s.solve[authorization.Identifier.Value]
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *preSolverMock) CleanUp(authorization acme.Authorization) error {
|
func (s *preSolverMock) CleanUp(authorization acme.Authorization) error {
|
||||||
return s.cleanUp[authorization.Identifier.Value]
|
return s.cleanUp[authorization.Identifier.Value]
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,7 @@ func needRenewal(x509Cert *x509.Certificate, domain string, days int) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func merge(prevDomains []string, nextDomains []string) []string {
|
func merge(prevDomains, nextDomains []string) []string {
|
||||||
for _, next := range nextDomains {
|
for _, next := range nextDomains {
|
||||||
var found bool
|
var found bool
|
||||||
for _, prev := range prevDomains {
|
for _, prev := range prevDomains {
|
||||||
|
|
|
@ -13,9 +13,7 @@ import (
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var version = "dev"
|
||||||
version = "dev"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
|
|
|
@ -16,7 +16,7 @@ import (
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
const filePerm os.FileMode = 0600
|
const filePerm os.FileMode = 0o600
|
||||||
|
|
||||||
func setup(ctx *cli.Context, accountsStorage *AccountsStorage) (*Account, *lego.Client) {
|
func setup(ctx *cli.Context, accountsStorage *AccountsStorage) (*Account, *lego.Client) {
|
||||||
keyType := getKeyType(ctx)
|
keyType := getKeyType(ctx)
|
||||||
|
@ -90,7 +90,7 @@ func getEmail(ctx *cli.Context) string {
|
||||||
|
|
||||||
func createNonExistingFolder(path string) error {
|
func createNonExistingFolder(path string) error {
|
||||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||||
return os.MkdirAll(path, 0700)
|
return os.MkdirAll(path, 0o700)
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ func generateReadMe(models *Providers) error {
|
||||||
return errors.New("missing end tag")
|
return errors.New("missing end tag")
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(readmePath, buffer.Bytes(), 0666)
|
return ioutil.WriteFile(readmePath, buffer.Bytes(), 0o666)
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractTableData(models *Providers) (int, [][]string) {
|
func extractTableData(models *Providers) (int, [][]string) {
|
||||||
|
|
|
@ -166,7 +166,7 @@ func readUserAgentFile(filename string) (map[string]string, error) {
|
||||||
return v.data, nil
|
return v.data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeUserAgentFile(filename string, version string, comment string) error {
|
func writeUserAgentFile(filename, version, comment string) error {
|
||||||
tmpl, err := template.New("ua").Parse(uaTemplate)
|
tmpl, err := template.New("ua").Parse(uaTemplate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -186,10 +186,10 @@ func writeUserAgentFile(filename string, version string, comment string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ioutil.WriteFile(filename, source, 0644)
|
return ioutil.WriteFile(filename, source, 0o644)
|
||||||
}
|
}
|
||||||
|
|
||||||
func bumpVersion(userAgent string, mode string) (string, error) {
|
func bumpVersion(userAgent, mode string) (string, error) {
|
||||||
prevVersion := strings.TrimPrefix(userAgent, "xenolf-acme/")
|
prevVersion := strings.TrimPrefix(userAgent, "xenolf-acme/")
|
||||||
|
|
||||||
allString := regexp.MustCompile(`(\d+)\.(\d+)\.(\d+)`).FindStringSubmatch(prevVersion)
|
allString := regexp.MustCompile(`(\d+)\.(\d+)\.(\d+)`).FindStringSubmatch(prevVersion)
|
||||||
|
|
2
platform/config/env/env.go
vendored
2
platform/config/env/env.go
vendored
|
@ -118,7 +118,7 @@ func GetOrDefaultSecond(envVar string, defaultValue time.Duration) time.Duration
|
||||||
|
|
||||||
// GetOrDefaultString returns the given environment variable value as a string.
|
// GetOrDefaultString returns the given environment variable value as a string.
|
||||||
// Returns the default if the envvar cannot be find.
|
// Returns the default if the envvar cannot be find.
|
||||||
func GetOrDefaultString(envVar string, defaultValue string) string {
|
func GetOrDefaultString(envVar, defaultValue string) string {
|
||||||
v := GetOrFile(envVar)
|
v := GetOrFile(envVar)
|
||||||
if len(v) == 0 {
|
if len(v) == 0 {
|
||||||
return defaultValue
|
return defaultValue
|
||||||
|
|
10
platform/config/env/env_test.go
vendored
10
platform/config/env/env_test.go
vendored
|
@ -186,7 +186,7 @@ func TestGetOrDefaultSecond(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var key = "LEGO_ENV_TC"
|
key := "LEGO_ENV_TC"
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
@ -220,7 +220,7 @@ func TestGetOrDefaultString(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var key = "LEGO_ENV_TC"
|
key := "LEGO_ENV_TC"
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
@ -260,7 +260,7 @@ func TestGetOrDefaultBool(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var key = "LEGO_ENV_TC"
|
key := "LEGO_ENV_TC"
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
@ -313,7 +313,7 @@ func TestGetOrFile_ReadsFiles(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer os.Remove(file.Name())
|
defer os.Remove(file.Name())
|
||||||
|
|
||||||
err = ioutil.WriteFile(file.Name(), []byte("lego_file\n"), 0644)
|
err = ioutil.WriteFile(file.Name(), []byte("lego_file\n"), 0o644)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = os.Setenv(varEnvFileName, file.Name())
|
err = os.Setenv(varEnvFileName, file.Name())
|
||||||
|
@ -340,7 +340,7 @@ func TestGetOrFile_PrefersEnvVars(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer os.Remove(file.Name())
|
defer os.Remove(file.Name())
|
||||||
|
|
||||||
err = ioutil.WriteFile(file.Name(), []byte("lego_file"), 0644)
|
err = ioutil.WriteFile(file.Name(), []byte("lego_file"), 0o644)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = os.Setenv(varEnvFileName, file.Name())
|
err = os.Setenv(varEnvFileName, file.Name())
|
||||||
|
|
|
@ -49,7 +49,7 @@ func NewDNSProvider() (*DNSProvider, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
client := goacmedns.NewClient(values[EnvAPIBase])
|
client := goacmedns.NewClient(values[EnvAPIBase])
|
||||||
storage := goacmedns.NewFileStorage(values[EnvStoragePath], 0600)
|
storage := goacmedns.NewFileStorage(values[EnvStoragePath], 0o600)
|
||||||
return NewDNSProviderClient(client, storage)
|
return NewDNSProviderClient(client, storage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -235,6 +235,7 @@ func (m *MockHTTPClientAPI) Post(url string, data []byte) (*http.Response, []byt
|
||||||
func (m *MockHTTPClientAPI) Get(url string) (*http.Response, []byte, error) {
|
func (m *MockHTTPClientAPI) Get(url string) (*http.Response, []byte, error) {
|
||||||
return &http.Response{StatusCode: m.Status}, m.Data, m.Error
|
return &http.Response{StatusCode: m.Status}, m.Data, m.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MockHTTPClientAPI) Delete(url string) (*http.Response, []byte, error) {
|
func (m *MockHTTPClientAPI) Delete(url string) (*http.Response, []byte, error) {
|
||||||
return &http.Response{StatusCode: m.Status}, m.Data, m.Error
|
return &http.Response{StatusCode: m.Status}, m.Data, m.Error
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ type Client struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient returns a Client instance configured to handle CloudDNS API communication.
|
// NewClient returns a Client instance configured to handle CloudDNS API communication.
|
||||||
func NewClient(clientID string, email string, password string, ttl int) *Client {
|
func NewClient(clientID, email, password string, ttl int) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
ClientID: clientID,
|
ClientID: clientID,
|
||||||
Email: email,
|
Email: email,
|
||||||
|
|
|
@ -41,7 +41,7 @@ type TXTRecord struct {
|
||||||
type TXTRecords map[string]TXTRecord
|
type TXTRecords map[string]TXTRecord
|
||||||
|
|
||||||
// NewClient creates a ClouDNS client.
|
// NewClient creates a ClouDNS client.
|
||||||
func NewClient(authID string, subAuthID string, authPassword string) (*Client, error) {
|
func NewClient(authID, subAuthID, authPassword string) (*Client, error) {
|
||||||
if authID == "" && subAuthID == "" {
|
if authID == "" && subAuthID == "" {
|
||||||
return nil, errors.New("credentials missing: authID or subAuthID")
|
return nil, errors.New("credentials missing: authID or subAuthID")
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ func (c *Client) FindTxtRecord(zoneName, fqdn string) (*TXTRecord, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddTxtRecord add a TXT record.
|
// AddTxtRecord add a TXT record.
|
||||||
func (c *Client) AddTxtRecord(zoneName string, fqdn, value string, ttl int) error {
|
func (c *Client) AddTxtRecord(zoneName, fqdn, value string, ttl int) error {
|
||||||
host := dns01.UnFqdn(strings.TrimSuffix(dns01.UnFqdn(fqdn), zoneName))
|
host := dns01.UnFqdn(strings.TrimSuffix(dns01.UnFqdn(fqdn), zoneName))
|
||||||
|
|
||||||
reqURL := *c.BaseURL
|
reqURL := *c.BaseURL
|
||||||
|
|
|
@ -44,7 +44,7 @@ type TXTRecord struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient creates a CloudXNS client.
|
// NewClient creates a CloudXNS client.
|
||||||
func NewClient(apiKey string, secretKey string) (*Client, error) {
|
func NewClient(apiKey, secretKey string) (*Client, error) {
|
||||||
if apiKey == "" {
|
if apiKey == "" {
|
||||||
return nil, errors.New("CloudXNS: credentials missing: apiKey")
|
return nil, errors.New("CloudXNS: credentials missing: apiKey")
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) createRecord(dom internal.Domain, fqdn string, recordName string, value string) error {
|
func (d *DNSProvider) createRecord(dom internal.Domain, fqdn, recordName, value string) error {
|
||||||
request := internal.RecordRequest{
|
request := internal.RecordRequest{
|
||||||
Name: recordName,
|
Name: recordName,
|
||||||
TTL: d.config.TTL,
|
TTL: d.config.TTL,
|
||||||
|
|
|
@ -31,7 +31,7 @@ func NewClient(token string) *Client {
|
||||||
|
|
||||||
// GetTxtRRSet gets a RRSet.
|
// GetTxtRRSet gets a RRSet.
|
||||||
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#retrieving-a-specific-rrset
|
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#retrieving-a-specific-rrset
|
||||||
func (c *Client) GetTxtRRSet(domainName string, subName string) (*RRSet, error) {
|
func (c *Client) GetTxtRRSet(domainName, subName string) (*RRSet, error) {
|
||||||
if subName == "" {
|
if subName == "" {
|
||||||
subName = "@"
|
subName = "@"
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ func (c *Client) AddTxtRRSet(rrSet RRSet) (*RRSet, error) {
|
||||||
|
|
||||||
// UpdateTxtRRSet updates RRSet records.
|
// UpdateTxtRRSet updates RRSet records.
|
||||||
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#modifying-an-rrset
|
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#modifying-an-rrset
|
||||||
func (c *Client) UpdateTxtRRSet(domainName string, subName string, records []string) (*RRSet, error) {
|
func (c *Client) UpdateTxtRRSet(domainName, subName string, records []string) (*RRSet, error) {
|
||||||
if subName == "" {
|
if subName == "" {
|
||||||
subName = "@"
|
subName = "@"
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ func (c *Client) UpdateTxtRRSet(domainName string, subName string, records []str
|
||||||
|
|
||||||
// DeleteTxtRRSet deletes a RRset.
|
// DeleteTxtRRSet deletes a RRset.
|
||||||
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#deleting-an-rrset
|
// https://desec.readthedocs.io/en/latest/dns/rrsets.html#deleting-an-rrset
|
||||||
func (c *Client) DeleteTxtRRSet(domainName string, subName string) error {
|
func (c *Client) DeleteTxtRRSet(domainName, subName string) error {
|
||||||
if subName == "" {
|
if subName == "" {
|
||||||
subName = "@"
|
subName = "@"
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,7 +247,7 @@ func (d *DNSProvider) getZoneID(wanted string) (string, error) {
|
||||||
return "", fmt.Errorf("zone id not found for %s", wanted)
|
return "", fmt.Errorf("zone id not found for %s", wanted)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) getRecord(zoneID string, wanted string) (*recordsets.RecordSet, error) {
|
func (d *DNSProvider) getRecord(zoneID, wanted string) (*recordsets.RecordSet, error) {
|
||||||
allPages, err := recordsets.ListByZone(d.client, zoneID, nil).AllPages()
|
allPages, err := recordsets.ListByZone(d.client, zoneID, nil).AllPages()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -42,7 +42,7 @@ type Client struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient creates a DNSMadeEasy client.
|
// NewClient creates a DNSMadeEasy client.
|
||||||
func NewClient(apiKey string, apiSecret string) (*Client, error) {
|
func NewClient(apiKey, apiSecret string) (*Client, error) {
|
||||||
if apiKey == "" {
|
if apiKey == "" {
|
||||||
return nil, errors.New("credentials missing: API key")
|
return nil, errors.New("credentials missing: API key")
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ func (c *Client) sendRequest(method, resource string, payload interface{}) (*htt
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func computeHMAC(message string, secret string) (string, error) {
|
func computeHMAC(message, secret string) (string, error) {
|
||||||
key := []byte(secret)
|
key := []byte(secret)
|
||||||
h := hmac.New(sha1.New, key)
|
h := hmac.New(sha1.New, key)
|
||||||
_, err := h.Write([]byte(message))
|
_, err := h.Write([]byte(message))
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NewClient() *Client {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRecords Get DNS records based on a hostname and resource record type.
|
// GetRecords Get DNS records based on a hostname and resource record type.
|
||||||
func (c Client) GetRecords(hostname string, recordType string) ([]DNSRecord, error) {
|
func (c Client) GetRecords(hostname, recordType string) ([]DNSRecord, error) {
|
||||||
endpoint, err := c.createEndpoint("dns", "record", hostname)
|
endpoint, err := c.createEndpoint("dns", "record", hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -82,7 +82,7 @@ func (c Client) AddNewRecord(domainID int64, record DNSRecord) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteRecord Remove a DNS record from DNS service.
|
// DeleteRecord Remove a DNS record from DNS service.
|
||||||
func (c Client) DeleteRecord(domainID int64, recordID int64) error {
|
func (c Client) DeleteRecord(domainID, recordID int64) error {
|
||||||
endpoint, err := c.createEndpoint("dns", strconv.FormatInt(domainID, 10), "record", strconv.FormatInt(recordID, 10))
|
endpoint, err := c.createEndpoint("dns", strconv.FormatInt(domainID, 10), "record", strconv.FormatInt(recordID, 10))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setupTest(method string, pattern string, status int, file string) *Client {
|
func setupTest(method, pattern string, status int, file string) *Client {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
server := httptest.NewServer(mux)
|
server := httptest.NewServer(mux)
|
||||||
|
|
||||||
|
@ -126,18 +126,19 @@ func TestGetRecords(t *testing.T) {
|
||||||
status: http.StatusOK,
|
status: http.StatusOK,
|
||||||
file: "./fixtures/get_records.json",
|
file: "./fixtures/get_records.json",
|
||||||
expected: expected{
|
expected: expected{
|
||||||
records: []DNSRecord{{
|
records: []DNSRecord{
|
||||||
ID: 6041417,
|
{
|
||||||
Type: "TXT",
|
ID: 6041417,
|
||||||
DomainID: 9007481,
|
Type: "TXT",
|
||||||
DomainName: "lego.freeddns.org",
|
DomainID: 9007481,
|
||||||
NodeName: "_acme-challenge",
|
DomainName: "lego.freeddns.org",
|
||||||
Hostname: "_acme-challenge.lego.freeddns.org",
|
NodeName: "_acme-challenge",
|
||||||
State: true,
|
Hostname: "_acme-challenge.lego.freeddns.org",
|
||||||
Content: `_acme-challenge.lego.freeddns.org. 300 IN TXT "txt_txt_txt_txt_txt_txt_txt"`,
|
State: true,
|
||||||
TextData: "txt_txt_txt_txt_txt_txt_txt",
|
Content: `_acme-challenge.lego.freeddns.org. 300 IN TXT "txt_txt_txt_txt_txt_txt_txt"`,
|
||||||
TTL: 300,
|
TextData: "txt_txt_txt_txt_txt_txt_txt",
|
||||||
},
|
TTL: 300,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ID: 6041422,
|
ID: 6041422,
|
||||||
Type: "TXT",
|
Type: "TXT",
|
||||||
|
|
|
@ -28,14 +28,17 @@ type paramInt struct {
|
||||||
type structMember interface {
|
type structMember interface {
|
||||||
structMember()
|
structMember()
|
||||||
}
|
}
|
||||||
|
|
||||||
type structMemberString struct {
|
type structMemberString struct {
|
||||||
Name string `xml:"name"`
|
Name string `xml:"name"`
|
||||||
Value string `xml:"value>string"`
|
Value string `xml:"value>string"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type structMemberInt struct {
|
type structMemberInt struct {
|
||||||
Name string `xml:"name"`
|
Name string `xml:"name"`
|
||||||
Value int `xml:"value>int"`
|
Value int `xml:"value>int"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type paramStruct struct {
|
type paramStruct struct {
|
||||||
XMLName xml.Name `xml:"param"`
|
XMLName xml.Name `xml:"param"`
|
||||||
StructMembers []structMember `xml:"value>struct>member"`
|
StructMembers []structMember `xml:"value>struct>member"`
|
||||||
|
@ -120,7 +123,8 @@ func (d *DNSProvider) rpcCall(call *methodCall, resp response) error {
|
||||||
}
|
}
|
||||||
if resp.faultCode() != 0 {
|
if resp.faultCode() != 0 {
|
||||||
return rpcError{
|
return rpcError{
|
||||||
faultCode: resp.faultCode(), faultString: resp.faultString()}
|
faultCode: resp.faultCode(), faultString: resp.faultString(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -166,7 +170,8 @@ func (d *DNSProvider) cloneZone(zoneID int, name string) (int, error) {
|
||||||
structMemberString{
|
structMemberString{
|
||||||
Name: "name",
|
Name: "name",
|
||||||
Value: name,
|
Value: name,
|
||||||
}},
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, resp)
|
}, resp)
|
||||||
|
@ -206,7 +211,7 @@ func (d *DNSProvider) newZoneVersion(zoneID int) (int, error) {
|
||||||
return resp.Value, nil
|
return resp.Value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) addTXTRecord(zoneID int, version int, name string, value string, ttl int) error {
|
func (d *DNSProvider) addTXTRecord(zoneID, version int, name, value string, ttl int) error {
|
||||||
resp := &responseStruct{}
|
resp := &responseStruct{}
|
||||||
err := d.rpcCall(&methodCall{
|
err := d.rpcCall(&methodCall{
|
||||||
MethodName: "domain.zone.record.add",
|
MethodName: "domain.zone.record.add",
|
||||||
|
@ -228,14 +233,15 @@ func (d *DNSProvider) addTXTRecord(zoneID int, version int, name string, value s
|
||||||
}, structMemberInt{
|
}, structMemberInt{
|
||||||
Name: "ttl",
|
Name: "ttl",
|
||||||
Value: ttl,
|
Value: ttl,
|
||||||
}},
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, resp)
|
}, resp)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) setZoneVersion(zoneID int, version int) error {
|
func (d *DNSProvider) setZoneVersion(zoneID, version int) error {
|
||||||
resp := &responseBool{}
|
resp := &responseBool{}
|
||||||
err := d.rpcCall(&methodCall{
|
err := d.rpcCall(&methodCall{
|
||||||
MethodName: "domain.zone.version.set",
|
MethodName: "domain.zone.version.set",
|
||||||
|
@ -301,7 +307,7 @@ func (d *DNSProvider) deleteZone(zoneID int) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) httpPost(url string, bodyType string, body io.Reader) ([]byte, error) {
|
func (d *DNSProvider) httpPost(url, bodyType string, body io.Reader) ([]byte, error) {
|
||||||
resp, err := d.config.HTTPClient.Post(url, bodyType, body)
|
resp, err := d.config.HTTPClient.Post(url, bodyType, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("HTTP Post Error: %w", err)
|
return nil, fmt.Errorf("HTTP Post Error: %w", err)
|
||||||
|
|
|
@ -101,7 +101,7 @@ func TestDNSProvider(t *testing.T) {
|
||||||
// fake RPC server. It was generated by recording a real RPC session
|
// fake RPC server. It was generated by recording a real RPC session
|
||||||
// which resulted in the successful issue of a cert, and then
|
// which resulted in the successful issue of a cert, and then
|
||||||
// anonymizing the RPC data.
|
// anonymizing the RPC data.
|
||||||
var serverResponses = map[string]string{
|
serverResponses := map[string]string{
|
||||||
// Present Request->Response 1 (getZoneID)
|
// Present Request->Response 1 (getZoneID)
|
||||||
presentGetZoneIDRequestMock: presentGetZoneIDResponseMock,
|
presentGetZoneIDRequestMock: presentGetZoneIDResponseMock,
|
||||||
// Present Request->Response 2 (cloneZone)
|
// Present Request->Response 2 (cloneZone)
|
||||||
|
|
|
@ -27,7 +27,7 @@ type Record struct {
|
||||||
RRSetType string `json:"rrset_type,omitempty"`
|
RRSetType string `json:"rrset_type,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) addTXTRecord(domain string, name string, value string, ttl int) error {
|
func (d *DNSProvider) addTXTRecord(domain, name, value string, ttl int) error {
|
||||||
// Get exiting values for the TXT records
|
// Get exiting values for the TXT records
|
||||||
// Needed to create challenges for both wildcard and base name domains
|
// Needed to create challenges for both wildcard and base name domains
|
||||||
txtRecord, err := d.getTXTRecord(domain, name)
|
txtRecord, err := d.getTXTRecord(domain, name)
|
||||||
|
@ -80,7 +80,7 @@ func (d *DNSProvider) getTXTRecord(domain, name string) (*Record, error) {
|
||||||
return txtRecord, nil
|
return txtRecord, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) deleteTXTRecord(domain string, name string) error {
|
func (d *DNSProvider) deleteTXTRecord(domain, name string) error {
|
||||||
target := fmt.Sprintf("domains/%s/records/%s/TXT", domain, name)
|
target := fmt.Sprintf("domains/%s/records/%s/TXT", domain, name)
|
||||||
|
|
||||||
req, err := d.newRequest(http.MethodDelete, target, nil)
|
req, err := d.newRequest(http.MethodDelete, target, nil)
|
||||||
|
|
|
@ -97,7 +97,7 @@ func TestNewDNSProviderConfig(t *testing.T) {
|
||||||
func TestDNSProvider(t *testing.T) {
|
func TestDNSProvider(t *testing.T) {
|
||||||
// serverResponses is the JSON Request->Response map used by the
|
// serverResponses is the JSON Request->Response map used by the
|
||||||
// fake JSON server.
|
// fake JSON server.
|
||||||
var serverResponses = map[string]map[string]string{
|
serverResponses := map[string]map[string]string{
|
||||||
http.MethodGet: {
|
http.MethodGet: {
|
||||||
``: `{"rrset_ttl":300,"rrset_values":[],"rrset_name":"_acme-challenge.abc.def","rrset_type":"TXT"}`,
|
``: `{"rrset_ttl":300,"rrset_values":[],"rrset_name":"_acme-challenge.abc.def","rrset_type":"TXT"}`,
|
||||||
},
|
},
|
||||||
|
|
|
@ -32,7 +32,7 @@ type responseStruct struct {
|
||||||
} `json:"response"`
|
} `json:"response"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) addTXTRecord(fqdn string, domain string, name string, value string, ttl int) (int, error) {
|
func (d *DNSProvider) addTXTRecord(fqdn, domain, name, value string, ttl int) (int, error) {
|
||||||
response, err := d.sendRequest(http.MethodPost, "addrecord", addRecordRequest{
|
response, err := d.sendRequest(http.MethodPost, "addrecord", addRecordRequest{
|
||||||
DomainName: domain,
|
DomainName: domain,
|
||||||
Host: name,
|
Host: name,
|
||||||
|
@ -58,7 +58,7 @@ func (d *DNSProvider) deleteTXTRecord(fqdn string, recordid int) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) sendRequest(method string, resource string, payload interface{}) (*responseStruct, error) {
|
func (d *DNSProvider) sendRequest(method, resource string, payload interface{}) (*responseStruct, error) {
|
||||||
url := fmt.Sprintf("%s/%s", defaultBaseURL, resource)
|
url := fmt.Sprintf("%s/%s", defaultBaseURL, resource)
|
||||||
|
|
||||||
body, err := json.Marshal(payload)
|
body, err := json.Marshal(payload)
|
||||||
|
|
|
@ -19,7 +19,7 @@ type DNSRecord struct {
|
||||||
TTL int `json:"ttl,omitempty"`
|
TTL int `json:"ttl,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) getRecords(domainZone string, rType string, recordName string) ([]DNSRecord, error) {
|
func (d *DNSProvider) getRecords(domainZone, rType, recordName string) ([]DNSRecord, error) {
|
||||||
resource := path.Clean(fmt.Sprintf("/v1/domains/%s/records/%s/%s", domainZone, rType, recordName))
|
resource := path.Clean(fmt.Sprintf("/v1/domains/%s/records/%s/%s", domainZone, rType, recordName))
|
||||||
|
|
||||||
resp, err := d.makeRequest(http.MethodGet, resource, nil)
|
resp, err := d.makeRequest(http.MethodGet, resource, nil)
|
||||||
|
@ -44,7 +44,7 @@ func (d *DNSProvider) getRecords(domainZone string, rType string, recordName str
|
||||||
return records, nil
|
return records, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) updateTxtRecords(records []DNSRecord, domainZone string, recordName string) error {
|
func (d *DNSProvider) updateTxtRecords(records []DNSRecord, domainZone, recordName string) error {
|
||||||
body, err := json.Marshal(records)
|
body, err := json.Marshal(records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -91,7 +91,7 @@ func (d *DNSProvider) getZone(findRequest ZoneConfigsFindRequest) (*ZoneConfig,
|
||||||
return zoneConfig, nil
|
return zoneConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) post(uri string, request interface{}, response interface{}) ([]byte, error) {
|
func (d *DNSProvider) post(uri string, request, response interface{}) ([]byte, error) {
|
||||||
body, err := json.Marshal(request)
|
body, err := json.Marshal(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -105,7 +105,7 @@ func (c Client) toMultiParameters(params []ActionParameter) multiActionParameter
|
||||||
return multi
|
return multi
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) do(params interface{}, data interface{}) error {
|
func (c Client) do(params, data interface{}) error {
|
||||||
baseURL, err := url.Parse(c.BaseURL)
|
baseURL, err := url.Parse(c.BaseURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -157,7 +157,7 @@ func (c Client) do(params interface{}, data interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddRecord helper to create an action to add a TXT record.
|
// AddRecord helper to create an action to add a TXT record.
|
||||||
func AddRecord(domain string, content string, ttl int) ActionParameter {
|
func AddRecord(domain, content string, ttl int) ActionParameter {
|
||||||
return ActionParameter{
|
return ActionParameter{
|
||||||
Action: SetAction,
|
Action: SetAction,
|
||||||
Name: domain,
|
Name: domain,
|
||||||
|
@ -168,7 +168,7 @@ func AddRecord(domain string, content string, ttl int) ActionParameter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteRecord helper to create an action to delete a TXT record.
|
// DeleteRecord helper to create an action to delete a TXT record.
|
||||||
func DeleteRecord(domain string, content string) ActionParameter {
|
func DeleteRecord(domain, content string) ActionParameter {
|
||||||
return ActionParameter{
|
return ActionParameter{
|
||||||
Action: DeleteAction,
|
Action: DeleteAction,
|
||||||
Name: domain,
|
Name: domain,
|
||||||
|
|
|
@ -144,7 +144,8 @@ func TestClient_DoActions(t *testing.T) {
|
||||||
TTL: "3600 seconds",
|
TTL: "3600 seconds",
|
||||||
Priority: "0",
|
Priority: "0",
|
||||||
}},
|
}},
|
||||||
}},
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -182,7 +183,9 @@ func TestClient_DoActions(t *testing.T) {
|
||||||
Priority: "0",
|
Priority: "0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}}},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -214,7 +217,9 @@ func TestClient_DoActions(t *testing.T) {
|
||||||
Host: "example.org",
|
Host: "example.org",
|
||||||
Type: "TXT",
|
Type: "TXT",
|
||||||
Records: nil,
|
Records: nil,
|
||||||
}}},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -241,7 +246,9 @@ func TestClient_DoActions(t *testing.T) {
|
||||||
TTL: "3600 seconds",
|
TTL: "3600 seconds",
|
||||||
Priority: "0",
|
Priority: "0",
|
||||||
}},
|
}},
|
||||||
}}},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
return fmt.Errorf("inwx: %w", err)
|
return fmt.Errorf("inwx: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var request = &goinwx.NameserverRecordRequest{
|
request := &goinwx.NameserverRecordRequest{
|
||||||
Domain: dns01.UnFqdn(authZone),
|
Domain: dns01.UnFqdn(authZone),
|
||||||
Name: dns01.UnFqdn(fqdn),
|
Name: dns01.UnFqdn(fqdn),
|
||||||
Type: "TXT",
|
Type: "TXT",
|
||||||
|
|
|
@ -255,7 +255,7 @@ func TestDNSProvider_logout(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDNSProvider_getZone(t *testing.T) {
|
func TestDNSProvider_getZone(t *testing.T) {
|
||||||
var testZone = "@ A 0 192.0.2.2 3600"
|
testZone := "@ A 0 192.0.2.2 3600"
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
|
|
|
@ -150,7 +150,7 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
return d.config.PropagationTimeout, d.config.PollingInterval
|
return d.config.PropagationTimeout, d.config.PollingInterval
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) newTxtRecord(fqdn string, value string) error {
|
func (d *DNSProvider) newTxtRecord(fqdn, value string) error {
|
||||||
params := &lightsail.CreateDomainEntryInput{
|
params := &lightsail.CreateDomainEntryInput{
|
||||||
DomainName: aws.String(d.config.DNSZone),
|
DomainName: aws.String(d.config.DNSZone),
|
||||||
DomainEntry: &lightsail.DomainEntry{
|
DomainEntry: &lightsail.DomainEntry{
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (d *DNSProvider) doRequest(domain, value string, cmd string) error {
|
func (d *DNSProvider) doRequest(domain, value, cmd string) error {
|
||||||
req, err := d.buildRequest(domain, value, cmd)
|
req, err := d.buildRequest(domain, value, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -34,7 +34,7 @@ func (d *DNSProvider) doRequest(domain, value string, cmd string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) buildRequest(domain, value string, cmd string) (*http.Request, error) {
|
func (d *DNSProvider) buildRequest(domain, value, cmd string) (*http.Request, error) {
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
params.Set("CERTBOT_DOMAIN", domain)
|
params.Set("CERTBOT_DOMAIN", domain)
|
||||||
params.Set("CERTBOT_VALIDATION", value)
|
params.Set("CERTBOT_VALIDATION", value)
|
||||||
|
|
|
@ -120,7 +120,7 @@ func (d *DNSProvider) login() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.mythic-beasts.com/support/api/dnsv2#ep-get-zoneszonerecords
|
// https://www.mythic-beasts.com/support/api/dnsv2#ep-get-zoneszonerecords
|
||||||
func (d *DNSProvider) createTXTRecord(zone string, leaf string, value string) error {
|
func (d *DNSProvider) createTXTRecord(zone, leaf, value string) error {
|
||||||
if d.token == "" {
|
if d.token == "" {
|
||||||
return fmt.Errorf("createTXTRecord: not logged in")
|
return fmt.Errorf("createTXTRecord: not logged in")
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,7 @@ func (d *DNSProvider) createTXTRecord(zone string, leaf string, value string) er
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://www.mythic-beasts.com/support/api/dnsv2#ep-delete-zoneszonerecords
|
// https://www.mythic-beasts.com/support/api/dnsv2#ep-delete-zoneszonerecords
|
||||||
func (d *DNSProvider) removeTXTRecord(zone string, leaf string, value string) error {
|
func (d *DNSProvider) removeTXTRecord(zone, leaf, value string) error {
|
||||||
if d.token == "" {
|
if d.token == "" {
|
||||||
return fmt.Errorf("removeTXTRecord: not logged in")
|
return fmt.Errorf("removeTXTRecord: not logged in")
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,7 +122,7 @@ type Client struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient creates a netcup DNS client.
|
// NewClient creates a netcup DNS client.
|
||||||
func NewClient(customerNumber string, apiKey string, apiPassword string) (*Client, error) {
|
func NewClient(customerNumber, apiKey, apiPassword string) (*Client, error) {
|
||||||
if customerNumber == "" || apiKey == "" || apiPassword == "" {
|
if customerNumber == "" || apiKey == "" || apiPassword == "" {
|
||||||
return nil, errors.New("credentials missing")
|
return nil, errors.New("credentials missing")
|
||||||
}
|
}
|
||||||
|
@ -231,7 +231,7 @@ func (c *Client) GetDNSRecords(hostname, apiSessionID string) ([]DNSRecord, erro
|
||||||
|
|
||||||
// doRequest marshals given body to JSON, send the request to netcup API
|
// doRequest marshals given body to JSON, send the request to netcup API
|
||||||
// and returns body of response.
|
// and returns body of response.
|
||||||
func (c *Client) doRequest(payload interface{}, responseData interface{}) error {
|
func (c *Client) doRequest(payload, responseData interface{}) error {
|
||||||
body, err := json.Marshal(payload)
|
body, err := json.Marshal(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -116,7 +116,7 @@ func (c *Client) CreateRecord(zoneID string, record DNSRecord) (*DNSRecord, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveRecord removes a DNS records.
|
// RemoveRecord removes a DNS records.
|
||||||
func (c *Client) RemoveRecord(zoneID string, recordID string) error {
|
func (c *Client) RemoveRecord(zoneID, recordID string) error {
|
||||||
endpoint, err := c.createEndpoint("dns_zones", zoneID, "dns_records", recordID)
|
endpoint, err := c.createEndpoint("dns_zones", zoneID, "dns_records", recordID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to parse endpoint: %w", err)
|
return fmt.Errorf("failed to parse endpoint: %w", err)
|
||||||
|
|
|
@ -88,7 +88,7 @@ type ChangeInfo struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient Creates a new client of NIFCLOUD DNS.
|
// NewClient Creates a new client of NIFCLOUD DNS.
|
||||||
func NewClient(accessKey string, secretKey string) (*Client, error) {
|
func NewClient(accessKey, secretKey string) (*Client, error) {
|
||||||
if len(accessKey) == 0 || len(secretKey) == 0 {
|
if len(accessKey) == 0 || len(secretKey) == 0 {
|
||||||
return nil, errors.New("credentials missing")
|
return nil, errors.New("credentials missing")
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ func (d *DNSProvider) getZoneID(zone string) (string, error) {
|
||||||
return zonesRes.Zones[0].ID, nil
|
return zonesRes.Zones[0].ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) getRecordSetID(zoneID string, fqdn string) (string, error) {
|
func (d *DNSProvider) getRecordSetID(zoneID, fqdn string) (string, error) {
|
||||||
resource := fmt.Sprintf("zones/%s/recordsets?type=TXT&name=%s", zoneID, fqdn)
|
resource := fmt.Sprintf("zones/%s/recordsets?type=TXT&name=%s", zoneID, fqdn)
|
||||||
resp, err := d.sendRequest(http.MethodGet, resource, nil)
|
resp, err := d.sendRequest(http.MethodGet, resource, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -195,7 +195,7 @@ func (d *DNSProvider) sendRequest(method, uri string, body io.Reader) (json.RawM
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) makeRequest(method, uri string, body io.Reader) (*http.Request, error) {
|
func (d *DNSProvider) makeRequest(method, uri string, body io.Reader) (*http.Request, error) {
|
||||||
var path = ""
|
path := ""
|
||||||
if d.config.Host.Path != "/" {
|
if d.config.Host.Path != "/" {
|
||||||
path = d.config.Host.Path
|
path = d.config.Host.Path
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ type Client struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClient Creates a reg.ru client.
|
// NewClient Creates a reg.ru client.
|
||||||
func NewClient(username string, password string) *Client {
|
func NewClient(username, password string) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
username: username,
|
username: username,
|
||||||
password: password,
|
password: password,
|
||||||
|
@ -32,7 +32,7 @@ func NewClient(username string, password string) *Client {
|
||||||
|
|
||||||
// RemoveTxtRecord removes a TXT record.
|
// RemoveTxtRecord removes a TXT record.
|
||||||
// https://www.reg.ru/support/help/api2#zone_remove_record
|
// https://www.reg.ru/support/help/api2#zone_remove_record
|
||||||
func (c Client) RemoveTxtRecord(domain, subDomain string, content string) error {
|
func (c Client) RemoveTxtRecord(domain, subDomain, content string) error {
|
||||||
request := RemoveRecordRequest{
|
request := RemoveRecordRequest{
|
||||||
Username: c.username,
|
Username: c.username,
|
||||||
Password: c.password,
|
Password: c.password,
|
||||||
|
@ -55,7 +55,7 @@ func (c Client) RemoveTxtRecord(domain, subDomain string, content string) error
|
||||||
|
|
||||||
// AddTXTRecord adds a TXT record.
|
// AddTXTRecord adds a TXT record.
|
||||||
// https://www.reg.ru/support/help/api2#zone_add_txt
|
// https://www.reg.ru/support/help/api2#zone_add_txt
|
||||||
func (c Client) AddTXTRecord(domain, subDomain string, content string) error {
|
func (c Client) AddTXTRecord(domain, subDomain, content string) error {
|
||||||
request := AddTxtRequest{
|
request := AddTxtRequest{
|
||||||
Username: c.username,
|
Username: c.username,
|
||||||
Password: c.password,
|
Password: c.password,
|
||||||
|
|
|
@ -111,7 +111,7 @@ func TestTsigClient(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestValidUpdatePacket(t *testing.T) {
|
func TestValidUpdatePacket(t *testing.T) {
|
||||||
var reqChan = make(chan *dns.Msg, 10)
|
reqChan := make(chan *dns.Msg, 10)
|
||||||
|
|
||||||
dns01.ClearFqdnCache()
|
dns01.ClearFqdnCache()
|
||||||
dns.HandleFunc(fakeZone, serverHandlerPassBackRequest(reqChan))
|
dns.HandleFunc(fakeZone, serverHandlerPassBackRequest(reqChan))
|
||||||
|
@ -170,7 +170,8 @@ func runLocalDNSTestServer(tsig bool) (*dns.Server, string, error) {
|
||||||
MsgAcceptFunc: func(dh dns.Header) dns.MsgAcceptAction {
|
MsgAcceptFunc: func(dh dns.Header) dns.MsgAcceptAction {
|
||||||
// bypass defaultMsgAcceptFunc to allow dynamic update (https://github.com/miekg/dns/pull/830)
|
// bypass defaultMsgAcceptFunc to allow dynamic update (https://github.com/miekg/dns/pull/830)
|
||||||
return dns.MsgAccept
|
return dns.MsgAccept
|
||||||
}}
|
},
|
||||||
|
}
|
||||||
|
|
||||||
if tsig {
|
if tsig {
|
||||||
server.TsigSecret = map[string]string{fakeTsigKey: fakeTsigSecret}
|
server.TsigSecret = map[string]string{fakeTsigKey: fakeTsigSecret}
|
||||||
|
|
|
@ -231,7 +231,7 @@ func (d *DNSProvider) changeRecord(action, hostedZoneID string, recordSet *route
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) getExistingRecordSets(hostedZoneID string, fqdn string) ([]*route53.ResourceRecord, error) {
|
func (d *DNSProvider) getExistingRecordSets(hostedZoneID, fqdn string) ([]*route53.ResourceRecord, error) {
|
||||||
listInput := &route53.ListResourceRecordSetsInput{
|
listInput := &route53.ListResourceRecordSetsInput{
|
||||||
HostedZoneId: aws.String(hostedZoneID),
|
HostedZoneId: aws.String(hostedZoneID),
|
||||||
StartRecordName: aws.String(fqdn),
|
StartRecordName: aws.String(fqdn),
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
const cleanUpDelay = 2 * time.Second
|
const cleanUpDelay = 2 * time.Second
|
||||||
|
|
||||||
func TestNewDNSProvider(t *testing.T) {
|
func TestNewDNSProvider(t *testing.T) {
|
||||||
var envTest = tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
envTest := tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
desc string
|
desc string
|
||||||
|
@ -97,7 +97,7 @@ func TestNewDNSProviderConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLivePresent(t *testing.T) {
|
func TestLivePresent(t *testing.T) {
|
||||||
var envTest = tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
envTest := tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
||||||
|
|
||||||
if !envTest.IsLiveTest() {
|
if !envTest.IsLiveTest() {
|
||||||
t.Skip("skipping live test")
|
t.Skip("skipping live test")
|
||||||
|
@ -112,7 +112,7 @@ func TestLivePresent(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLiveCleanUp(t *testing.T) {
|
func TestLiveCleanUp(t *testing.T) {
|
||||||
var envTest = tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
envTest := tester.NewEnvTest(EnvAPIToken, EnvTTL)
|
||||||
|
|
||||||
if !envTest.IsLiveTest() {
|
if !envTest.IsLiveTest() {
|
||||||
t.Skip("skipping live test")
|
t.Skip("skipping live test")
|
||||||
|
|
|
@ -178,7 +178,7 @@ func TestDNSProvider_concurrentGetDNSEntries(t *testing.T) {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(2)
|
wg.Add(2)
|
||||||
|
|
||||||
solve := func(domain1 string, suffix string, timeoutPresent time.Duration, timeoutSolve time.Duration, timeoutCleanup time.Duration) error {
|
solve := func(domain1, suffix string, timeoutPresent, timeoutSolve, timeoutCleanup time.Duration) error {
|
||||||
time.Sleep(timeoutPresent)
|
time.Sleep(timeoutPresent)
|
||||||
|
|
||||||
err := p.Present(domain1, "", "")
|
err := p.Present(domain1, "", "")
|
||||||
|
@ -234,7 +234,7 @@ func TestDNSProvider_concurrentAddDNSEntry(t *testing.T) {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(2)
|
wg.Add(2)
|
||||||
|
|
||||||
solve := func(domain1 string, timeoutPresent time.Duration, timeoutCleanup time.Duration) error {
|
solve := func(domain1 string, timeoutPresent, timeoutCleanup time.Duration) error {
|
||||||
time.Sleep(timeoutPresent)
|
time.Sleep(timeoutPresent)
|
||||||
err := p.Present(domain1, "", "")
|
err := p.Present(domain1, "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -68,7 +68,7 @@ func (d *DNSProvider) getDNSRecords(domain string) (*dnsRecordsResponse, error)
|
||||||
return respData, nil
|
return respData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) makeRequest(method string, uri string, body io.Reader) (*http.Request, error) {
|
func (d *DNSProvider) makeRequest(method, uri string, body io.Reader) (*http.Request, error) {
|
||||||
endpoint, err := d.config.BaseURL.Parse(path.Join(d.config.BaseURL.EscapedPath(), uri))
|
endpoint, err := d.config.BaseURL.Parse(path.Join(d.config.BaseURL.EscapedPath(), uri))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -81,7 +81,6 @@ func (c *Client) GetRecords(domain string) ([]Record, error) {
|
||||||
resp, err := c.get("/list", struct {
|
resp, err := c.get("/list", struct {
|
||||||
Domain string `url:"domain"`
|
Domain string `url:"domain"`
|
||||||
}{Domain: domain})
|
}{Domain: domain})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,6 +130,7 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
|
||||||
var record *internal.Record
|
var record *internal.Record
|
||||||
for _, rcd := range records {
|
for _, rcd := range records {
|
||||||
|
rcd := rcd
|
||||||
if rcd.Type == "TXT" && rcd.SubDomain == subDomain && rcd.Content == value {
|
if rcd.Type == "TXT" && rcd.SubDomain == subDomain && rcd.Content == value {
|
||||||
record = &rcd
|
record = &rcd
|
||||||
break
|
break
|
||||||
|
|
|
@ -30,12 +30,12 @@ func (w *HTTPProvider) Present(domain, token, keyAuth string) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
challengeFilePath := filepath.Join(w.path, http01.ChallengePath(token))
|
challengeFilePath := filepath.Join(w.path, http01.ChallengePath(token))
|
||||||
err = os.MkdirAll(filepath.Dir(challengeFilePath), 0755)
|
err = os.MkdirAll(filepath.Dir(challengeFilePath), 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not create required directories in webroot for HTTP challenge: %w", err)
|
return fmt.Errorf("could not create required directories in webroot for HTTP challenge: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(challengeFilePath, []byte(keyAuth), 0644)
|
err = ioutil.WriteFile(challengeFilePath, []byte(keyAuth), 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not write file in webroot for HTTP challenge: %w", err)
|
return fmt.Errorf("could not write file in webroot for HTTP challenge: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ func TestHTTPProvider(t *testing.T) {
|
||||||
keyAuth := "keyAuth"
|
keyAuth := "keyAuth"
|
||||||
challengeFilePath := webroot + "/.well-known/acme-challenge/" + token
|
challengeFilePath := webroot + "/.well-known/acme-challenge/" + token
|
||||||
|
|
||||||
require.NoError(t, os.MkdirAll(webroot+"/.well-known/acme-challenge", 0777))
|
require.NoError(t, os.MkdirAll(webroot+"/.well-known/acme-challenge", 0o777))
|
||||||
defer os.RemoveAll(webroot)
|
defer os.RemoveAll(webroot)
|
||||||
|
|
||||||
provider, err := NewHTTPProvider(webroot)
|
provider, err := NewHTTPProvider(webroot)
|
||||||
|
|
Loading…
Reference in a new issue