@@ -9,7 +9,43 @@ import (
99
1010// CheckSettings check the format of settings.
1111func 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
121302func 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