Skip to content

Commit 29c63c3

Browse files
committed
feat: update settings
1 parent e4feeda commit 29c63c3

File tree

1 file changed

+189
-4
lines changed

1 file changed

+189
-4
lines changed

internal/utils/settings.go

Lines changed: 189 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,43 @@ import (
99

1010
// CheckSettings check the format of settings.
1111
func CheckSettings(config *settings.Settings) error {
12-
switch config.Provider {
12+
// Check if it's multi-provider mode
13+
if config.IsMultiProvider() {
14+
return checkMultiProviderSettings(config)
15+
}
16+
17+
// Legacy single provider mode validation
18+
if config.Provider == "" {
19+
return errors.New("provider cannot be empty in single-provider mode")
20+
}
21+
22+
if err := checkSingleProviderCredentials(config.Provider, config); err != nil {
23+
return err
24+
}
25+
26+
return checkDomains(config)
27+
}
28+
29+
// checkMultiProviderSettings validates multi-provider configuration.
30+
func checkMultiProviderSettings(config *settings.Settings) error {
31+
if len(config.Providers) == 0 {
32+
return errors.New("providers cannot be empty in multi-provider mode")
33+
}
34+
35+
// Validate each provider configuration
36+
for providerName, providerConfig := range config.Providers {
37+
if err := checkProviderCredentials(providerName, providerConfig); err != nil {
38+
return fmt.Errorf("provider '%s': %w", providerName, err)
39+
}
40+
}
41+
42+
// Validate that all domain providers are configured
43+
return checkDomainsWithProviders(config)
44+
}
45+
46+
// checkSingleProviderCredentials validates credentials for legacy single provider mode.
47+
func checkSingleProviderCredentials(providerName string, config *settings.Settings) error {
48+
switch providerName {
1349
case DNSPOD:
1450
if config.Password == "" && config.LoginToken == "" {
1551
return errors.New("password or login token cannot be empty")
@@ -108,17 +144,166 @@ func CheckSettings(config *settings.Settings) error {
108144
if config.LoginToken == "" {
109145
return errors.New("login token cannot be empty")
110146
}
147+
default:
148+
return fmt.Errorf("'%s' is not a supported DNS provider", providerName)
149+
}
150+
151+
return nil
152+
}
111153

154+
// checkProviderCredentials validates credentials for a provider configuration.
155+
func checkProviderCredentials(providerName string, providerConfig *settings.ProviderConfig) error {
156+
switch providerName {
157+
case DNSPOD:
158+
if providerConfig.Password == "" && providerConfig.LoginToken == "" {
159+
return errors.New("password or login token cannot be empty")
160+
}
161+
case HE:
162+
if providerConfig.Password == "" {
163+
return errors.New("password cannot be empty")
164+
}
165+
case CLOUDFLARE:
166+
if providerConfig.LoginToken == "" {
167+
if providerConfig.Email == "" {
168+
return errors.New("email cannot be empty")
169+
}
170+
if providerConfig.Password == "" {
171+
return errors.New("password cannot be empty")
172+
}
173+
}
174+
case ALIDNS:
175+
if providerConfig.Email == "" {
176+
return errors.New("email cannot be empty")
177+
}
178+
if providerConfig.Password == "" {
179+
return errors.New("password cannot be empty")
180+
}
181+
case DIGITALOCEAN:
182+
if providerConfig.LoginToken == "" {
183+
return errors.New("login token cannot be empty")
184+
}
185+
case DUCK:
186+
if providerConfig.LoginToken == "" {
187+
return errors.New("login token cannot be empty")
188+
}
189+
case DYNU:
190+
if providerConfig.Password == "" {
191+
return errors.New("password cannot be empty")
192+
}
193+
case DYNV6:
194+
if providerConfig.LoginToken == "" {
195+
return errors.New("login token cannot be empty")
196+
}
197+
case GOOGLE:
198+
fallthrough
199+
case NOIP:
200+
if providerConfig.Email == "" {
201+
return errors.New("email cannot be empty")
202+
}
203+
if providerConfig.Password == "" {
204+
return errors.New("password cannot be empty")
205+
}
206+
case DREAMHOST:
207+
if providerConfig.LoginToken == "" {
208+
return errors.New("login token cannot be empty")
209+
}
210+
case SCALEWAY:
211+
if providerConfig.LoginToken == "" {
212+
return errors.New("login token cannot be empty")
213+
}
214+
case LINODE:
215+
if providerConfig.LoginToken == "" {
216+
return errors.New("login token cannot be empty")
217+
}
218+
case STRATO:
219+
if providerConfig.Password == "" {
220+
return errors.New("password cannot be empty")
221+
}
222+
case LOOPIASE:
223+
if providerConfig.Password == "" {
224+
return errors.New("password cannot be empty")
225+
}
226+
case INFOMANIAK:
227+
if providerConfig.Password == "" {
228+
return errors.New("password cannot be empty")
229+
}
230+
case HETZNER:
231+
if providerConfig.LoginToken == "" {
232+
return errors.New("login token cannot be empty")
233+
}
234+
case IONOS:
235+
if providerConfig.LoginToken == "" {
236+
return errors.New("login token cannot be empty")
237+
}
238+
case OVH:
239+
if providerConfig.AppKey == "" {
240+
return errors.New("app key cannot be empty")
241+
}
242+
if providerConfig.AppSecret == "" {
243+
return errors.New("app secret cannot be empty")
244+
}
245+
if providerConfig.ConsumerKey == "" {
246+
return errors.New("consumer key cannot be empty")
247+
}
248+
case TRANSIP:
249+
if providerConfig.Email == "" {
250+
return errors.New("email cannot be empty")
251+
}
252+
if providerConfig.LoginToken == "" {
253+
return errors.New("login token cannot be empty")
254+
}
112255
default:
113-
message := fmt.Sprintf("'%s' is not a supported DNS provider", config.Provider)
114-
return errors.New(message)
256+
return fmt.Errorf("'%s' is not a supported DNS provider", providerName)
257+
}
258+
259+
return nil
260+
}
115261

262+
// checkDomainsWithProviders validates domains in multi-provider mode.
263+
func checkDomainsWithProviders(config *settings.Settings) error {
264+
if len(config.Domains) == 0 {
265+
return errors.New("at least one domain must be configured")
116266
}
117267

118-
return checkDomains(config)
268+
for _, d := range config.Domains {
269+
if d.DomainName == "" {
270+
return errors.New("domain name should not be empty")
271+
}
272+
273+
// Validate subdomains
274+
for _, sd := range d.SubDomains {
275+
if sd == "" {
276+
return errors.New("subdomain should not be empty")
277+
}
278+
}
279+
280+
// Get the provider for this domain (either domain-specific or global fallback)
281+
providerName := config.GetDomainProvider(&d)
282+
if providerName == "" {
283+
return fmt.Errorf("no provider configured for domain '%s'", d.DomainName)
284+
}
285+
286+
// Check if the provider is configured
287+
if d.Provider != "" {
288+
// Domain has specific provider - check if it's configured in providers
289+
if _, exists := config.Providers[d.Provider]; !exists {
290+
return fmt.Errorf("domain '%s' references provider '%s' which is not configured in providers section", d.DomainName, d.Provider)
291+
}
292+
} else if config.Provider == "" {
293+
// No domain-specific provider and no global provider
294+
return fmt.Errorf("domain '%s' has no provider specified and no global provider is configured", d.DomainName)
295+
}
296+
// If domain doesn't specify provider but global provider exists, that's valid (mixed mode)
297+
}
298+
299+
return nil
119300
}
120301

121302
func checkDomains(config *settings.Settings) error {
303+
if len(config.Domains) == 0 {
304+
return errors.New("at least one domain must be configured")
305+
}
306+
122307
for _, d := range config.Domains {
123308
if d.DomainName == "" {
124309
return errors.New("domain name should not be empty")

0 commit comments

Comments
 (0)