From f44c8d4182f682b30e0f92734ae595231ad32983 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julian=20B=C3=A4ume?= <julian.baeume@open-xchange.com>
Date: Fri, 22 Mar 2024 14:51:55 +0100
Subject: [PATCH] Add: support TLS mode for redis client

Implements #21
---
 .env.defaults                                       | 2 ++
 README.md                                           | 2 ++
 helm/core-ui-middleware/templates/deployment.yaml   | 9 +++++++++
 helm/core-ui-middleware/templates/redis-secret.yaml | 3 ++-
 helm/core-ui-middleware/templates/updater.yaml      | 9 +++++++++
 helm/core-ui-middleware/values.yaml                 | 3 +++
 src/redis.js                                        | 7 +++++++
 7 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/.env.defaults b/.env.defaults
index b80b50c..b4dfb61 100644
--- a/.env.defaults
+++ b/.env.defaults
@@ -16,4 +16,6 @@ REDIS_PREFIX=ui-middleware
 REDIS_HOSTS=localhost:6379
 REDIS_USERNAME=
 REDIS_PASSWORD=
+REDIS_TLS_ENABLED=false
+REDIS_TLS_CA=
 ORIGINS=*
diff --git a/README.md b/README.md
index b3fc64e..c6c24a0 100644
--- a/README.md
+++ b/README.md
@@ -47,6 +47,8 @@ It is possible to horizontally scale the UI Middleware, as more clients are fetc
 | `redis.username`         | `REDIS_USERNAME`           | Redis username                               | `""`                 |
 | `redis.password`         | `REDIS_PASSWORD`           | Redis password                               | `""`                 |
 | `redis.sidecar.image`    | N/A                        | Redis sidecar image                          | `"redis:latest"`     |
+| `redis.tls.enabled`      | `REDIS_TLS_ENABLED`        | Enable TLS for Redis                         | `false`              |
+| `redis.tls.ca`           | `REDIS_TLS_CA`             | PEM version of redis server CA certificate   | `""`                 |
 | `compressFileSize`       | `COMPRESS_FILE_SIZE`       | Larger files will be gzipped                 | `600`                |
 | `compressFileTypes`      | `COMPRESS_FILE_TYPES`      | Set of compression mime types                | application/javascript application/json application/x-javascript application/xml application/xml+rss text/css text/html text/javascript text/plain text/xml image/svg+xml |
 | `slowRequestThreshold`   | `SLOW_REQUEST_THRESHOLD`   | Slow request threshold in ms                 | `4000`               |
diff --git a/helm/core-ui-middleware/templates/deployment.yaml b/helm/core-ui-middleware/templates/deployment.yaml
index 1574374..c85ee1a 100644
--- a/helm/core-ui-middleware/templates/deployment.yaml
+++ b/helm/core-ui-middleware/templates/deployment.yaml
@@ -59,6 +59,15 @@ spec:
             {{- end }}
             - name: REDIS_PREFIX
               value: "{{ .Values.redis.prefix }}"
+            - name: REDIS_TLS_ENABLED
+              value: "{{ .Values.redis.tls.enabled }}"
+            {{- if .Values.redis.tls.enabled }}
+            - name: REDIS_TLS_CA
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "core-ui-middleware.redisSecret" . }}
+                  key: ca.crt
+            {{- end }}
           ports:
             - name: http
               containerPort: {{ .Values.containerPort | default 8080 }}
diff --git a/helm/core-ui-middleware/templates/redis-secret.yaml b/helm/core-ui-middleware/templates/redis-secret.yaml
index 749fdb4..6d70bd0 100644
--- a/helm/core-ui-middleware/templates/redis-secret.yaml
+++ b/helm/core-ui-middleware/templates/redis-secret.yaml
@@ -1,4 +1,4 @@
-{{- if .Values.redis.auth.enabled -}}
+{{- if or .Values.redis.auth.enabled  .Values.redis.tls.enabled -}}
 apiVersion: v1
 kind: Secret
 metadata:
@@ -7,4 +7,5 @@ type: Opaque
 data:
   username: {{ .Values.redis.auth.username | b64enc | quote }}
   password: {{ .Values.redis.auth.password | b64enc | quote }}
+  ca.crt: {{ .Values.redis.auth.ca | b64enc | quote }}
 {{- end -}}
diff --git a/helm/core-ui-middleware/templates/updater.yaml b/helm/core-ui-middleware/templates/updater.yaml
index b71741e..040467e 100644
--- a/helm/core-ui-middleware/templates/updater.yaml
+++ b/helm/core-ui-middleware/templates/updater.yaml
@@ -59,6 +59,15 @@ spec:
             {{- end }}
             - name: REDIS_PREFIX
               value: "{{ .Values.redis.prefix }}"
+            - name: REDIS_TLS_ENABLED
+              value: "{{ .Values.redis.tls.enabled }}"
+            {{- if .Values.redis.tls.enabled }}
+            - name: REDIS_TLS_CA
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "core-ui-middleware.redisSecret" . }}
+                  key: ca.crt
+            {{- end }}
           ports:
             - name: tcp-monitoring
               containerPort: 9090
diff --git a/helm/core-ui-middleware/values.yaml b/helm/core-ui-middleware/values.yaml
index 7449163..0842833 100644
--- a/helm/core-ui-middleware/values.yaml
+++ b/helm/core-ui-middleware/values.yaml
@@ -111,6 +111,9 @@ redis:
     - localhost:6379
   db: 0
   sentinelMasterId: "mymaster"
+  tls:
+    enabled: false
+    ca: ""
   auth:
     enabled: false
     username: ""
diff --git a/src/redis.js b/src/redis.js
index 70c03e2..38d55bf 100644
--- a/src/redis.js
+++ b/src/redis.js
@@ -30,11 +30,18 @@ const hosts = (process.env.REDIS_HOSTS || '').split(',').map(host => {
   return { host: hostname, port: Number(port) }
 })
 
+const tlsOptions = {}
+if (process.env.REDIS_TLS_ENABLED === 'true') {
+  tlsOptions.tls = {}
+  if (process.env.REDIS_TLS_CA) tlsOptions.tls.ca = process.env.REDIS_TLS_CA
+}
+
 export function createClient (id, options = commonQueueOptions) {
   options = {
     username: process.env.REDIS_USERNAME,
     db: Number(process.env.REDIS_DB),
     password: process.env.REDIS_PASSWORD,
+    ...tlsOptions,
     ...options
   }
 
-- 
GitLab