mirror of
https://github.com/qdm12/ddns-updater.git
synced 2026-03-31 06:24:00 -04:00
hotfix(goip): fix behavior for full domain strings
This commit is contained in:
@@ -46,6 +46,11 @@ func Test_extractFromDomainField(t *testing.T) {
|
||||
errWrapped: ErrMultipleDomainsSpecified,
|
||||
errMessage: "multiple domains specified: \"example.com\" and \"something.com\"",
|
||||
},
|
||||
"goip.de": {
|
||||
domainField: "my.domain.goip.de",
|
||||
domainRegistered: "domain.goip.de",
|
||||
owners: []string{"my"},
|
||||
},
|
||||
}
|
||||
|
||||
for name, testCase := range testCases {
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/qdm12/ddns-updater/internal/models"
|
||||
@@ -33,9 +34,22 @@ const defaultDomain = "goip.de"
|
||||
func New(data json.RawMessage, domain, owner string,
|
||||
ipVersion ipversion.IPVersion, ipv6Suffix netip.Prefix) (
|
||||
p *Provider, err error) {
|
||||
if domain == "" {
|
||||
// Note domain is of the form:
|
||||
// - for retro-compatibility: "", "goip.de" or "goip.it"
|
||||
// - domain.goip.de or domain.goip.it since goip.de and goip.it are eTLDs.
|
||||
if domain == "" { // retro-compatibility
|
||||
domain = defaultDomain
|
||||
}
|
||||
if domain == defaultDomain || domain == "goip.it" { // retro-compatibility
|
||||
ownerParts := strings.Split(owner, ".")
|
||||
lastOwnerPart := ownerParts[len(ownerParts)-1]
|
||||
domain = lastOwnerPart + "." + domain // form domain.goip.de or domain.goip.it
|
||||
if len(ownerParts) > 1 {
|
||||
owner = strings.Join(ownerParts[:len(ownerParts)-1], ".")
|
||||
} else {
|
||||
owner = "@" // root domain
|
||||
}
|
||||
}
|
||||
|
||||
extraSettings := struct {
|
||||
Username string `json:"username"`
|
||||
@@ -63,17 +77,23 @@ func New(data json.RawMessage, domain, owner string,
|
||||
}, nil
|
||||
}
|
||||
|
||||
var regexDomain = regexp.MustCompile(`^.+\.(goip\.de|goip\.it)$`)
|
||||
|
||||
func validateSettings(domain, owner, username, password string) (err error) {
|
||||
const maxDomainLabels = 3 // domain.goip.de
|
||||
switch {
|
||||
case username == "":
|
||||
return fmt.Errorf("%w", errors.ErrUsernameNotSet)
|
||||
case password == "":
|
||||
return fmt.Errorf("%w", errors.ErrPasswordNotSet)
|
||||
case domain != defaultDomain && domain != "goip.it":
|
||||
return fmt.Errorf(`%w: %q must be "goip.de" or "goip.it"`,
|
||||
case !regexDomain.MatchString(domain):
|
||||
return fmt.Errorf(`%w: %q must match have the effective TLD "goip.de" or "goip.it"`,
|
||||
errors.ErrDomainNotValid, domain)
|
||||
case owner == "@" || owner == "*":
|
||||
return fmt.Errorf("%w: %q", errors.ErrOwnerRootOrWildcard, owner)
|
||||
case strings.Count(owner, ".") > maxDomainLabels-1:
|
||||
return fmt.Errorf("%w: %q has more than %d labels",
|
||||
errors.ErrDomainNotValid, domain, maxDomainLabels)
|
||||
case owner == "*":
|
||||
return fmt.Errorf("%w: %q", errors.ErrOwnerWildcard, owner)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user