@@ -1,7 +1,10 @@
11package redis
22
33import (
4+ "bytes"
45 "context"
6+ "crypto/tls"
7+ "encoding/pem"
58 "log"
69 "os"
710 "testing"
@@ -15,6 +18,7 @@ import (
1518 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
1619 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/sessions/persistence"
1720 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/sessions/tests"
21+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/util"
1822 . "github.com/onsi/ginkgo"
1923 . "github.com/onsi/gomega"
2024)
@@ -224,4 +228,104 @@ var _ = Describe("Redis SessionStore Tests", func() {
224228 )
225229 })
226230 })
231+
232+ Context("with custom CA path", func() {
233+ var caPath string
234+
235+ BeforeEach(func() {
236+ certBytes, keyBytes, err := util.GenerateCert()
237+ Expect(err).ToNot(HaveOccurred())
238+ certOut := new(bytes.Buffer)
239+ Expect(pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: certBytes})).To(Succeed())
240+ certData := certOut.Bytes()
241+ keyOut := new(bytes.Buffer)
242+ Expect(pem.Encode(keyOut, &pem.Block{Type: "PRIVATE KEY", Bytes: keyBytes})).To(Succeed())
243+ cert, err := tls.X509KeyPair(certData, keyOut.Bytes())
244+ Expect(err).ToNot(HaveOccurred())
245+
246+ certFile, err := os.CreateTemp("", "cert.*.pem")
247+ Expect(err).ToNot(HaveOccurred())
248+ caPath = certFile.Name()
249+ _, err = certFile.Write(certData)
250+ defer certFile.Close()
251+ Expect(err).ToNot(HaveOccurred())
252+
253+ mr.Close()
254+
255+ mr, err = miniredis.RunTLS(&tls.Config{Certificates: []tls.Certificate{cert}})
256+ Expect(err).ToNot(HaveOccurred())
257+ })
258+
259+ AfterEach(func() {
260+ Expect(os.Remove(caPath)).ToNot(HaveOccurred())
261+
262+ mr.Close()
263+
264+ var err error
265+ mr, err = miniredis.Run()
266+ Expect(err).ToNot(HaveOccurred())
267+ })
268+
269+ tests.RunSessionStoreTests(
270+ func(opts *options.SessionOptions, cookieOpts *options.Cookie) (sessionsapi.SessionStore, error) {
271+ // Set the connection URL
272+ opts.Type = options.RedisSessionStoreType
273+ opts.Redis.ConnectionURL = "redis://" + mr.Addr()
274+ opts.Redis.CAPath = caPath
275+
276+ // Capture the session store so that we can close the client
277+ var err error
278+ ss, err = NewRedisSessionStore(opts, cookieOpts)
279+ return ss, err
280+ },
281+ func(d time.Duration) error {
282+ mr.FastForward(d)
283+ return nil
284+ },
285+ )
286+ })
287+
288+ Context("with insecure TLS connection", func() {
289+ BeforeEach(func() {
290+ certBytes, keyBytes, err := util.GenerateCert()
291+ Expect(err).ToNot(HaveOccurred())
292+ certOut := new(bytes.Buffer)
293+ Expect(pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: certBytes})).To(Succeed())
294+ keyOut := new(bytes.Buffer)
295+ Expect(pem.Encode(keyOut, &pem.Block{Type: "PRIVATE KEY", Bytes: keyBytes})).To(Succeed())
296+ cert, err := tls.X509KeyPair(certOut.Bytes(), keyOut.Bytes())
297+ Expect(err).ToNot(HaveOccurred())
298+
299+ mr.Close()
300+
301+ mr, err = miniredis.RunTLS(&tls.Config{Certificates: []tls.Certificate{cert}})
302+ Expect(err).ToNot(HaveOccurred())
303+ })
304+
305+ AfterEach(func() {
306+ mr.Close()
307+
308+ var err error
309+ mr, err = miniredis.Run()
310+ Expect(err).ToNot(HaveOccurred())
311+ })
312+
313+ tests.RunSessionStoreTests(
314+ func(opts *options.SessionOptions, cookieOpts *options.Cookie) (sessionsapi.SessionStore, error) {
315+ // Set the connection URL
316+ opts.Type = options.RedisSessionStoreType
317+ opts.Redis.ConnectionURL = "redis://127.0.0.1:" + mr.Port() // func (*Miniredis) StartTLS listens on 127.0.0.1
318+ opts.Redis.InsecureSkipTLSVerify = true
319+
320+ // Capture the session store so that we can close the client
321+ var err error
322+ ss, err = NewRedisSessionStore(opts, cookieOpts)
323+ return ss, err
324+ },
325+ func(d time.Duration) error {
326+ mr.FastForward(d)
327+ return nil
328+ },
329+ )
330+ })
227331})