@@ -29,7 +29,7 @@ var supportedSecretKinds = []string{
2929 string (SecretKindDns ),
3030}
3131
32- // ValidateCloudProviderSecret checks whether the given secret contains valid AWS access keys.
32+ // ValidateCloudProviderSecret checks whether the given secret contains valid AWS credentials
3333func ValidateCloudProviderSecret (secret * corev1.Secret , fldPath * field.Path , kind SecretKind ) field.ErrorList {
3434 allErrs := field.ErrorList {}
3535 dataPath := fldPath .Child ("data" )
@@ -39,36 +39,61 @@ func ValidateCloudProviderSecret(secret *corev1.Secret, fldPath *field.Path, kin
3939 var accessKeyID , secretAccessKey , region []byte
4040 var accessKeyIDExists , secretAccessKeyExists , regionExists bool
4141
42- switch kind {
43- case SecretKindInfrastructure :
42+ // Check for duplicate keys (both standard and DNS-specific for the same field)
43+ _ , hasStandardAccessKey := secret .Data [aws .AccessKeyID ]
44+ _ , hasDNSAccessKey := secret .Data [aws .DNSAccessKeyID ]
45+ _ , hasStandardSecretKey := secret .Data [aws .SecretAccessKey ]
46+ _ , hasDNSSecretKey := secret .Data [aws .DNSSecretAccessKey ]
47+
48+ if hasStandardAccessKey && hasDNSAccessKey {
49+ allErrs = append (allErrs , field .Invalid (dataPath , "(multiple keys)" ,
50+ fmt .Sprintf ("cannot have both %q and %q in secret %s" , aws .AccessKeyID , aws .DNSAccessKeyID , secretRef )))
51+ }
52+
53+ if hasStandardSecretKey && hasDNSSecretKey {
54+ allErrs = append (allErrs , field .Invalid (dataPath , "(multiple keys)" ,
55+ fmt .Sprintf ("cannot have both %q and %q in secret %s" , aws .SecretAccessKey , aws .DNSSecretAccessKey , secretRef )))
56+ }
57+
58+ // Check for DNS-specific keys first, then fall back to standard keys
59+ accessKeyID , accessKeyIDExists = secret .Data [aws .DNSAccessKeyID ]
60+ if accessKeyIDExists {
61+ accessKeyIDKey = aws .DNSAccessKeyID
62+ } else {
63+ accessKeyID , accessKeyIDExists = secret .Data [aws .AccessKeyID ]
4464 accessKeyIDKey = aws .AccessKeyID
65+ }
66+
67+ secretAccessKey , secretAccessKeyExists = secret .Data [aws .DNSSecretAccessKey ]
68+ if secretAccessKeyExists {
69+ secretAccessKeyKey = aws .DNSSecretAccessKey
70+ } else {
71+ secretAccessKey , secretAccessKeyExists = secret .Data [aws .SecretAccessKey ]
4572 secretAccessKeyKey = aws .SecretAccessKey
46- accessKeyID , accessKeyIDExists = secret .Data [accessKeyIDKey ]
47- secretAccessKey , secretAccessKeyExists = secret .Data [secretAccessKeyKey ]
73+ }
4874
49- // Validate no unexpected keys exist
75+ switch kind {
76+ case SecretKindInfrastructure :
77+ // Allow both standard and DNS-specific keys
5078 allErrs = append (allErrs , validateNoUnexpectedKeys (secret .Data , dataPath , secretRef ,
51- aws .AccessKeyID , aws .SecretAccessKey )... )
79+ aws .AccessKeyID , aws .SecretAccessKey ,
80+ aws .DNSAccessKeyID , aws .DNSSecretAccessKey )... )
5281
5382 case SecretKindDns :
54- // For DNS secrets, check for DNS-specific key aliases first, then fall back to
55- // standard infrastructure keys
56- accessKeyID , accessKeyIDExists = secret .Data [aws .DNSAccessKeyID ]
57- if accessKeyIDExists {
58- accessKeyIDKey = aws .DNSAccessKeyID
59- } else {
60- accessKeyID , accessKeyIDExists = secret .Data [aws .AccessKeyID ]
61- accessKeyIDKey = aws .AccessKeyID
62- }
83+ // Check for duplicate region keys
84+ _ , hasStandardRegion := secret .Data [aws .Region ]
85+ _ , hasDNSRegion := secret .Data [aws .DNSRegion ]
6386
64- secretAccessKey , secretAccessKeyExists = secret .Data [aws .DNSSecretAccessKey ]
65- if secretAccessKeyExists {
66- secretAccessKeyKey = aws .DNSSecretAccessKey
67- } else {
68- secretAccessKey , secretAccessKeyExists = secret .Data [aws .SecretAccessKey ]
69- secretAccessKeyKey = aws .SecretAccessKey
87+ if hasStandardRegion && hasDNSRegion {
88+ allErrs = append (allErrs , field .Invalid (dataPath , "(multiple keys)" ,
89+ fmt .Sprintf ("cannot have both %q and %q in secret %s" , aws .Region , aws .DNSRegion , secretRef )))
7090 }
7191
92+ // Allow both standard and DNS-specific keys
93+ allErrs = append (allErrs , validateNoUnexpectedKeys (secret .Data , dataPath , secretRef ,
94+ aws .AccessKeyID , aws .SecretAccessKey , aws .Region ,
95+ aws .DNSAccessKeyID , aws .DNSSecretAccessKey , aws .DNSRegion )... )
96+
7297 region , regionExists = secret .Data [aws .DNSRegion ]
7398 if regionExists {
7499 regionKey = aws .DNSRegion
@@ -77,19 +102,8 @@ func ValidateCloudProviderSecret(secret *corev1.Secret, fldPath *field.Path, kin
77102 regionKey = aws .Region
78103 }
79104
80- // Validate no unexpected keys exist
81- // For DNS, we allow either the standard infrastructure keys or the DNS-specific alias keys, but not a mix
82- // Prefer standard keys if any are present
83- _ , hasStandardAccessKey := secret .Data [aws .AccessKeyID ]
84- _ , hasStandardSecretKey := secret .Data [aws .SecretAccessKey ]
85- _ , hasStandardRegionKey := secret .Data [aws .Region ]
86-
87- if hasStandardAccessKey || hasStandardSecretKey || hasStandardRegionKey {
88- allErrs = append (allErrs , validateNoUnexpectedKeys (secret .Data , dataPath , secretRef ,
89- aws .AccessKeyID , aws .SecretAccessKey , aws .Region )... )
90- } else {
91- allErrs = append (allErrs , validateNoUnexpectedKeys (secret .Data , dataPath , secretRef ,
92- aws .DNSAccessKeyID , aws .DNSSecretAccessKey , aws .DNSRegion )... )
105+ if regionExists && len (region ) > 0 {
106+ allErrs = append (allErrs , validateRegion (string (region ), dataPath .Key (regionKey ))... )
93107 }
94108
95109 default :
@@ -120,11 +134,6 @@ func ValidateCloudProviderSecret(secret *corev1.Secret, fldPath *field.Path, kin
120134 allErrs = append (allErrs , validateSecretAccessKey (string (secretAccessKey ), dataPath .Key (secretAccessKeyKey ))... )
121135 }
122136
123- // Validate region
124- if regionExists && len (region ) > 0 {
125- allErrs = append (allErrs , validateRegion (string (region ), dataPath .Key (regionKey ))... )
126- }
127-
128137 return allErrs
129138}
130139
0 commit comments