6 "github.com/Bose/minisentinel"
7 "github.com/alicebob/miniredis/v2"
8 "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
9 . "github.com/onsi/ginkgo/v2"
10 . "github.com/onsi/gomega"
13var _ = Describe("Sessions", func() {
15 idTokenConflictMsg = "id_token claim for header \"X-ID-Token\" requires oauth tokens in sessions. session_cookie_minimal cannot be set"
16 accessTokenConflictMsg = "access_token claim for header \"X-Access-Token\" requires oauth tokens in sessions. session_cookie_minimal cannot be set"
17 cookieRefreshMsg = "cookie_refresh > 0 requires oauth tokens in sessions. session_cookie_minimal cannot be set"
20 type cookieMinimalTableInput struct {
25 DescribeTable("validateSessionCookieMinimal",
26 func(o *cookieMinimalTableInput) {
27 Expect(validateSessionCookieMinimal(o.opts)).To(ConsistOf(o.errStrings))
29 Entry("No minimal cookie session", &cookieMinimalTableInput{
30 opts: &options.Options{
31 Session: options.SessionOptions{
32 Cookie: options.CookieStoreOptions{
37 errStrings: []string{},
39 Entry("No minimal cookie session & request header has access_token claim", &cookieMinimalTableInput{
40 opts: &options.Options{
41 Session: options.SessionOptions{
42 Cookie: options.CookieStoreOptions{
46 InjectRequestHeaders: []options.Header{
48 Name: "X-Access-Token",
49 Values: []options.HeaderValue{
51 ClaimSource: &options.ClaimSource{
52 Claim: "access_token",
59 errStrings: []string{},
61 Entry("Minimal cookie session no conflicts", &cookieMinimalTableInput{
62 opts: &options.Options{
63 Session: options.SessionOptions{
64 Cookie: options.CookieStoreOptions{
69 errStrings: []string{},
71 Entry("Request Header id_token conflict", &cookieMinimalTableInput{
72 opts: &options.Options{
73 Session: options.SessionOptions{
74 Cookie: options.CookieStoreOptions{
78 InjectRequestHeaders: []options.Header{
81 Values: []options.HeaderValue{
83 ClaimSource: &options.ClaimSource{
91 errStrings: []string{idTokenConflictMsg},
93 Entry("Response Header id_token conflict", &cookieMinimalTableInput{
94 opts: &options.Options{
95 Session: options.SessionOptions{
96 Cookie: options.CookieStoreOptions{
100 InjectResponseHeaders: []options.Header{
103 Values: []options.HeaderValue{
105 ClaimSource: &options.ClaimSource{
113 errStrings: []string{idTokenConflictMsg},
115 Entry("Request Header access_token conflict", &cookieMinimalTableInput{
116 opts: &options.Options{
117 Session: options.SessionOptions{
118 Cookie: options.CookieStoreOptions{
122 InjectRequestHeaders: []options.Header{
124 Name: "X-Access-Token",
125 Values: []options.HeaderValue{
127 ClaimSource: &options.ClaimSource{
128 Claim: "access_token",
135 errStrings: []string{accessTokenConflictMsg},
137 Entry("CookieRefresh conflict", &cookieMinimalTableInput{
138 opts: &options.Options{
139 Cookie: options.Cookie{
142 Session: options.SessionOptions{
143 Cookie: options.CookieStoreOptions{
148 errStrings: []string{cookieRefreshMsg},
150 Entry("Multiple conflicts", &cookieMinimalTableInput{
151 opts: &options.Options{
152 Session: options.SessionOptions{
153 Cookie: options.CookieStoreOptions{
157 InjectResponseHeaders: []options.Header{
160 Values: []options.HeaderValue{
162 ClaimSource: &options.ClaimSource{
169 InjectRequestHeaders: []options.Header{
171 Name: "X-Access-Token",
172 Values: []options.HeaderValue{
174 ClaimSource: &options.ClaimSource{
175 Claim: "access_token",
182 errStrings: []string{idTokenConflictMsg, accessTokenConflictMsg},
187 clusterAndSentinelMsg = "unable to initialize a redis client: options redis-use-sentinel and redis-use-cluster are mutually exclusive"
188 parseWrongSchemeMsg = "unable to initialize a redis client: unable to parse redis url: redis: invalid URL scheme: https"
189 parseWrongFormatMsg = "unable to initialize a redis client: unable to parse redis url: redis: invalid database number: \"wrong\""
190 invalidPasswordSetMsg = "unable to set a redis initialization key: WRONGPASS invalid username-password pair"
191 invalidPasswordDelMsg = "unable to delete the redis initialization key: WRONGPASS invalid username-password pair"
192 unreachableRedisSetMsg = "unable to set a redis initialization key: dial tcp 127.0.0.1:65535: connect: connection refused"
193 unreachableRedisDelMsg = "unable to delete the redis initialization key: dial tcp 127.0.0.1:65535: connect: connection refused"
194 unreachableSentinelSetMsg = "unable to set a redis initialization key: redis: all sentinels specified in configuration are unreachable: redis: nil"
195 unrechableSentinelDelMsg = "unable to delete the redis initialization key: redis: all sentinels specified in configuration are unreachable: redis: nil"
196 refusedSentinelSetMsg = "unable to set a redis initialization key: redis: all sentinels specified in configuration are unreachable: dial tcp 127.0.0.1:65535: connect: connection refused"
197 refusedSentinelDelMsg = "unable to delete the redis initialization key: redis: all sentinels specified in configuration are unreachable: dial tcp 127.0.0.1:65535: connect: connection refused"
200 type redisStoreTableInput struct {
201 // miniredis setup details
208 opts *options.Options
212 DescribeTable("validateRedisSessionStore",
213 func(o *redisStoreTableInput) {
214 mr, err := miniredis.Run()
215 Expect(err).ToNot(HaveOccurred())
216 mr.RequireAuth(o.password)
219 if o.setAddr && !o.useSentinel {
220 o.opts.Session.Redis.ConnectionURL = "redis://" + mr.Addr()
224 ms := minisentinel.NewSentinel(mr)
225 Expect(ms.Start()).To(Succeed())
228 if o.setSentinelAddr {
229 o.opts.Session.Redis.SentinelConnectionURLs = []string{"redis://" + ms.Addr()}
232 o.opts.Session.Redis.SentinelMasterName = ms.MasterInfo().Name
236 Expect(validateRedisSessionStore(o.opts)).To(ConsistOf(o.errStrings))
238 Entry("cookie sessions are skipped", &redisStoreTableInput{
239 opts: &options.Options{
240 Session: options.SessionOptions{
241 Type: options.CookieSessionStoreType,
244 errStrings: []string{},
246 Entry("connect successfully to pure redis", &redisStoreTableInput{
249 opts: &options.Options{
250 Session: options.SessionOptions{
251 Type: options.RedisSessionStoreType,
254 errStrings: []string{},
256 Entry("failed redis connection with wrong address", &redisStoreTableInput{
257 opts: &options.Options{
258 Session: options.SessionOptions{
259 Type: options.RedisSessionStoreType,
260 Redis: options.RedisStoreOptions{
261 ConnectionURL: "redis://127.0.0.1:65535",
265 errStrings: []string{unreachableRedisSetMsg, unreachableRedisDelMsg},
267 Entry("fail to parse an invalid connection URL with wrong scheme", &redisStoreTableInput{
268 opts: &options.Options{
269 Session: options.SessionOptions{
270 Type: options.RedisSessionStoreType,
271 Redis: options.RedisStoreOptions{
272 ConnectionURL: "https://example.com",
276 errStrings: []string{parseWrongSchemeMsg},
278 Entry("fail to parse an invalid connection URL with invalid format", &redisStoreTableInput{
279 opts: &options.Options{
280 Session: options.SessionOptions{
281 Type: options.RedisSessionStoreType,
282 Redis: options.RedisStoreOptions{
283 ConnectionURL: "redis://127.0.0.1:6379/wrong",
287 errStrings: []string{parseWrongFormatMsg},
289 Entry("connect successfully to pure redis with password", &redisStoreTableInput{
290 password: "abcdef123",
293 opts: &options.Options{
294 Session: options.SessionOptions{
295 Type: options.RedisSessionStoreType,
296 Redis: options.RedisStoreOptions{
297 Password: "abcdef123",
301 errStrings: []string{},
303 Entry("failed connection with wrong password", &redisStoreTableInput{
304 password: "abcdef123",
307 opts: &options.Options{
308 Session: options.SessionOptions{
309 Type: options.RedisSessionStoreType,
310 Redis: options.RedisStoreOptions{
311 Password: "zyxwtuv987",
315 errStrings: []string{invalidPasswordSetMsg, invalidPasswordDelMsg},
317 Entry("connect successfully to sentinel redis", &redisStoreTableInput{
319 setSentinelAddr: true,
322 opts: &options.Options{
323 Session: options.SessionOptions{
324 Type: options.RedisSessionStoreType,
325 Redis: options.RedisStoreOptions{
330 errStrings: []string{},
332 Entry("connect successfully to sentinel redis with password", &redisStoreTableInput{
333 password: "abcdef123",
335 setSentinelAddr: true,
338 opts: &options.Options{
339 Session: options.SessionOptions{
340 Type: options.RedisSessionStoreType,
341 Redis: options.RedisStoreOptions{
342 Password: "abcdef123",
347 errStrings: []string{},
349 Entry("failed connection to sentinel redis with wrong password", &redisStoreTableInput{
350 password: "abcdef123",
352 setSentinelAddr: true,
355 opts: &options.Options{
356 Session: options.SessionOptions{
357 Type: options.RedisSessionStoreType,
358 Redis: options.RedisStoreOptions{
359 Password: "zyxwtuv987",
364 errStrings: []string{invalidPasswordSetMsg, invalidPasswordDelMsg},
366 Entry("failed connection to sentinel redis with wrong master name", &redisStoreTableInput{
368 setSentinelAddr: true,
370 opts: &options.Options{
371 Session: options.SessionOptions{
372 Type: options.RedisSessionStoreType,
373 Redis: options.RedisStoreOptions{
375 SentinelMasterName: "WRONG",
379 errStrings: []string{unreachableSentinelSetMsg, unrechableSentinelDelMsg},
381 Entry("failed connection to sentinel redis with wrong address", &redisStoreTableInput{
385 opts: &options.Options{
386 Session: options.SessionOptions{
387 Type: options.RedisSessionStoreType,
388 Redis: options.RedisStoreOptions{
390 SentinelConnectionURLs: []string{"redis://127.0.0.1:65535"},
394 errStrings: []string{refusedSentinelSetMsg, refusedSentinelDelMsg},
396 Entry("sentinel and cluster both enabled fails", &redisStoreTableInput{
397 opts: &options.Options{
398 Session: options.SessionOptions{
399 Type: options.RedisSessionStoreType,
400 Redis: options.RedisStoreOptions{
406 errStrings: []string{clusterAndSentinelMsg},
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list