Skip to content
This repository was archived by the owner on Dec 12, 2025. It is now read-only.

Commit cece58a

Browse files
authored
Fix validation of references to CA certificate in TLS config (#1119)
* Fix validation of references to CA certificate in TLS config Fixes #1114 on GH. * convert tests to table driven * Fix incorrect test fixtures without CAcert values * reuse mgr in reconciler
1 parent 58a84c5 commit cece58a

File tree

4 files changed

+73
-8
lines changed

4 files changed

+73
-8
lines changed

controllers/mongodb_tls.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,19 @@ func getCaCrt(cmGetter configmap.Getter, secretGetter secret.Getter, mdb mdbv1.M
162162
if mdb.Spec.Security.TLS.CaCertificateSecret != nil {
163163
caResourceName = mdb.TLSCaCertificateSecretNamespacedName()
164164
caData, err = secret.ReadStringData(secretGetter, caResourceName)
165-
} else {
165+
} else if mdb.Spec.Security.TLS.CaConfigMap != nil {
166166
caResourceName = mdb.TLSConfigMapNamespacedName()
167167
caData, err = configmap.ReadData(cmGetter, caResourceName)
168168
}
169+
169170
if err != nil {
170171
return "", err
171172
}
172173

174+
if caData == nil {
175+
return "", fmt.Errorf("TLS field requires a reference to the CA certificate which signed the server certificates. Neither secret (field caCertificateSecretRef) not configMap (field CaConfigMap) reference present")
176+
}
177+
173178
if cert, ok := caData[tlsCACertName]; !ok || cert == "" {
174179
return "", fmt.Errorf(`CA certificate resource "%s" should have a CA certificate in field "%s"`, caResourceName, tlsCACertName)
175180
} else {

controllers/mongodb_tls_test.go

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package controllers
22

33
import (
44
"context"
5+
"errors"
56
"testing"
67

78
corev1 "k8s.io/api/core/v1"
@@ -328,10 +329,61 @@ func TestPemSupport(t *testing.T) {
328329
err = r.ensureTLSResources(mdb)
329330
assert.Error(t, err)
330331
assert.Contains(t, err.Error(), `if all of "tls.crt", "tls.key" and "tls.pem" are present in the secret, the entry for "tls.pem" must be equal to the concatenation of "tls.crt" with "tls.key"`)
331-
332332
})
333333
}
334334

335+
func TestTLSConfig_ReferencesToCACertAreValidated(t *testing.T) {
336+
type args struct {
337+
caConfigMap *mdbv1.LocalObjectReference
338+
caCertificateSecret *mdbv1.LocalObjectReference
339+
expectedError error
340+
}
341+
tests := map[string]args{
342+
"Success if reference to CA cert provided via secret": {
343+
caConfigMap: &mdbv1.LocalObjectReference{
344+
Name: "certificateKeySecret"},
345+
caCertificateSecret: nil,
346+
},
347+
"Success if reference to CA cert provided via config map": {
348+
caConfigMap: nil,
349+
caCertificateSecret: &mdbv1.LocalObjectReference{
350+
Name: "caConfigMap"},
351+
},
352+
"Succes if reference to CA cert provided both via secret and configMap": {
353+
caConfigMap: &mdbv1.LocalObjectReference{
354+
Name: "certificateKeySecret"},
355+
caCertificateSecret: &mdbv1.LocalObjectReference{
356+
Name: "caConfigMap"},
357+
},
358+
"Failure if reference to CA cert is missing": {
359+
caConfigMap: nil,
360+
caCertificateSecret: nil,
361+
expectedError: errors.New("TLS field requires a reference to the CA certificate which signed the server certificates. Neither secret (field caCertificateSecretRef) not configMap (field CaConfigMap) reference present"),
362+
},
363+
}
364+
for testName, tc := range tests {
365+
t.Run(testName, func(t *testing.T) {
366+
mdb := newTestReplicaSetWithTLSCaCertificateReferences(tc.caConfigMap, tc.caCertificateSecret)
367+
368+
mgr := kubeClient.NewManager(&mdb)
369+
cli := mdbClient.NewClient(mgr.GetClient())
370+
err := createTLSSecret(cli, mdb, "cert", "key", "pem")
371+
372+
assert.NoError(t, err)
373+
374+
r := NewReconciler(mgr)
375+
376+
_, err = r.validateTLSConfig(mdb)
377+
if tc.expectedError != nil {
378+
assert.EqualError(t, err, tc.expectedError.Error())
379+
} else {
380+
assert.NoError(t, err)
381+
}
382+
})
383+
}
384+
385+
}
386+
335387
func createTLSConfigMap(c k8sClient.Client, mdb mdbv1.MongoDBCommunity) error {
336388
if !mdb.Spec.Security.TLS.Enabled {
337389
return nil
@@ -349,7 +401,8 @@ func createTLSConfigMap(c k8sClient.Client, mdb mdbv1.MongoDBCommunity) error {
349401
func createTLSSecretWithNamespaceAndName(c k8sClient.Client, namespace string, name string, crt string, key string, pem string) error {
350402
sBuilder := secret.Builder().
351403
SetName(name).
352-
SetNamespace(namespace)
404+
SetNamespace(namespace).
405+
SetField(tlsCACertName, "CERT")
353406

354407
if crt != "" {
355408
sBuilder.SetField(tlsSecretCertName, crt)

controllers/replica_set_controller.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ func NewReconciler(mgr manager.Manager) *ReplicaSetReconciler {
7373
mgrClient := mgr.GetClient()
7474
secretWatcher := watch.New()
7575
configMapWatcher := watch.New()
76-
7776
return &ReplicaSetReconciler{
7877
client: kubernetesClient.NewClient(mgrClient),
7978
scheme: mgr.GetScheme(),

controllers/replicaset_controller_test.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ func newScramReplicaSet(users ...mdbv1.MongoDBUser) mdbv1.MongoDBCommunity {
8787
}
8888

8989
func newTestReplicaSetWithTLS() mdbv1.MongoDBCommunity {
90+
return newTestReplicaSetWithTLSCaCertificateReferences(&mdbv1.LocalObjectReference{
91+
Name: "caConfigMap",
92+
},
93+
&mdbv1.LocalObjectReference{
94+
Name: "certificateKeySecret",
95+
})
96+
}
97+
98+
func newTestReplicaSetWithTLSCaCertificateReferences(caConfigMap, caCertificateSecret *mdbv1.LocalObjectReference) mdbv1.MongoDBCommunity {
9099
return mdbv1.MongoDBCommunity{
91100
ObjectMeta: metav1.ObjectMeta{
92101
Name: "my-rs",
@@ -101,10 +110,9 @@ func newTestReplicaSetWithTLS() mdbv1.MongoDBCommunity {
101110
Modes: []mdbv1.AuthMode{"SCRAM"},
102111
},
103112
TLS: mdbv1.TLS{
104-
Enabled: true,
105-
CaConfigMap: &mdbv1.LocalObjectReference{
106-
Name: "caConfigMap",
107-
},
113+
Enabled: true,
114+
CaConfigMap: caConfigMap,
115+
CaCertificateSecret: caCertificateSecret,
108116
CertificateKeySecret: mdbv1.LocalObjectReference{
109117
Name: "certificateKeySecret",
110118
},

0 commit comments

Comments
 (0)