@@ -9,7 +9,43 @@ import (
9
9
10
10
// CheckSettings check the format of settings.
11
11
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 {
13
49
case DNSPOD :
14
50
if config .Password == "" && config .LoginToken == "" {
15
51
return errors .New ("password or login token cannot be empty" )
@@ -108,17 +144,166 @@ func CheckSettings(config *settings.Settings) error {
108
144
if config .LoginToken == "" {
109
145
return errors .New ("login token cannot be empty" )
110
146
}
147
+ default :
148
+ return fmt .Errorf ("'%s' is not a supported DNS provider" , providerName )
149
+ }
150
+
151
+ return nil
152
+ }
111
153
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
+ }
112
255
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
+ }
115
261
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" )
116
266
}
117
267
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
119
300
}
120
301
121
302
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
+
122
307
for _ , d := range config .Domains {
123
308
if d .DomainName == "" {
124
309
return errors .New ("domain name should not be empty" )
0 commit comments