git.iko.soy/typeable/oauth2-proxy
on master help sign in
Simplify redis store options
commit296d989e5871be8e0274f2cb8540d53c497ee6e8 authorJoel Speed <Joel.speed@hotmail.co.uk> dateWed 15 May 2019, 17:06 (7 years ago) parentf2562e8
2 files changed+26−54
pkg/sessions/redis/redis_store.go+25−53 pkg/sessions/session_store.go+1−1
pkg/sessions/redis/redis_store.go+25−53
@@ -17,7 +17,6 @@ import (
1717 "github.com/pusher/oauth2_proxy/pkg/apis/options"
1818 "github.com/pusher/oauth2_proxy/pkg/apis/sessions"
1919 "github.com/pusher/oauth2_proxy/pkg/cookies"
20− "github.com/pusher/oauth2_proxy/pkg/sessions/utils"
2120)
2221
2322// TicketData is a structure representing the ticket used in server session storage
@@ -29,46 +28,25 @@ type TicketData struct {
2928// SessionStore is an implementation of the sessions.SessionStore
3029// interface that stores sessions in redis
3130type SessionStore struct {
32− CookieCipher *cookie.Cipher
33− CookieDomain string
34− CookieExpire time.Duration
35− CookieHTTPOnly bool
36− CookieName string
37− CookiePath string
38− CookieSecret string
39− CookieSecure bool
40− Client *redis.Client
31+ CookieCipher *cookie.Cipher
32+ CookieOptions *options.CookieOptions
33+ Client *redis.Client
4134}
4235
4336// NewRedisSessionStore initialises a new instance of the SessionStore from
4437// the configuration given
45−func NewRedisSessionStore(opts options.RedisStoreOptions, cookieOpts *options.CookieOptions) (sessions.SessionStore, error) {
46− opt, err := redis.ParseURL(opts.RedisConnectionURL)
38+func NewRedisSessionStore(opts *options.SessionOptions, cookieOpts *options.CookieOptions) (sessions.SessionStore, error) {
39+ opt, err := redis.ParseURL(opts.RedisStoreOptions.RedisConnectionURL)
4740 if err != nil {
4841 return nil, fmt.Errorf("unable to parse redis url: %s", err)
4942 }
5043
51− var cookieCipher *cookie.Cipher
52− if len(cookieOpts.CookieSecret) > 0 {
53− var err error
54− cookieCipher, err = cookie.NewCipher(utils.SecretBytes(cookieOpts.CookieSecret))
55− if err != nil {
56− return nil, fmt.Errorf("unable to create cookieCipher: %v", err)
57− }
58− }
59−
6044 client := redis.NewClient(opt)
6145
6246 rs := &SessionStore{
63− Client: client,
64− CookieCipher: cookieCipher,
65− CookieDomain: cookieOpts.CookieDomain,
66− CookieExpire: cookieOpts.CookieExpire,
67− CookieHTTPOnly: cookieOpts.CookieHTTPOnly,
68− CookieName: cookieOpts.CookieName,
69− CookiePath: cookieOpts.CookiePath,
70− CookieSecret: cookieOpts.CookieSecret,
71− CookieSecure: cookieOpts.CookieSecure,
47+ Client: client,
48+ CookieCipher: opts.Cipher,
49+ CookieOptions: cookieOpts,
7250 }
7351 return rs, nil
7452
@@ -79,7 +57,7 @@ func NewRedisSessionStore(opts options.RedisStoreOptions, cookieOpts *options.Co
7957func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *sessions.SessionState) error {
8058 // Old sessions that we are refreshing would have a request cookie
8159 // New sessions don't, so we ignore the error. storeValue will check requestCookie
82− requestCookie, _ := req.Cookie(store.CookieName)
60+ requestCookie, _ := req.Cookie(store.CookieOptions.CookieName)
8361 value, err := s.EncodeSessionState(store.CookieCipher)
8462 if err != nil {
8563 return err
@@ -89,15 +67,12 @@ func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *se
8967 return err
9068 }
9169
92− ticketCookie := cookies.MakeCookie(
70+ ticketCookie := cookies.MakeCookieFromOptions(
9371 req,
94− store.CookieName,
72+ store.CookieOptions.CookieName,
9573 ticketString,
96− store.CookiePath,
97− store.CookieDomain,
98− store.CookieHTTPOnly,
99− store.CookieSecure,
100− store.CookieExpire,
74+ store.CookieOptions,
75+ store.CookieOptions.CookieExpire,
10176 time.Now(),
10277 )
10378
@@ -108,7 +83,7 @@ func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *se
10883// Load reads sessions.SessionState information from a ticket
10984// cookie within the HTTP request object
11085func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, error) {
111− requestCookie, err := req.Cookie(store.CookieName)
86+ requestCookie, err := req.Cookie(store.CookieOptions.CookieName)
11287 if err != nil {
11388 return nil, fmt.Errorf("error loading session: %s", err)
11489 }
@@ -122,12 +97,12 @@ func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, erro
12297
12398// LoadSessionFromString loads the session based on the ticket value
12499func (store *SessionStore) LoadSessionFromString(value string) (*sessions.SessionState, error) {
125− ticket, err := decodeTicket(store.CookieName, value)
100+ ticket, err := decodeTicket(store.CookieOptions.CookieName, value)
126101 if err != nil {
127102 return nil, err
128103 }
129104
130− result, err := store.Client.Get(ticket.asHandle(store.CookieName)).Result()
105+ result, err := store.Client.Get(ticket.asHandle(store.CookieOptions.CookieName)).Result()
131106 if err != nil {
132107 return nil, err
133108 }
@@ -151,17 +126,14 @@ func (store *SessionStore) LoadSessionFromString(value string) (*sessions.Sessio
151126// Clear clears any saved session information for a given ticket cookie
152127// from redis, and then clears the session
153128func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) error {
154− requestCookie, _ := req.Cookie(store.CookieName)
129+ requestCookie, _ := req.Cookie(store.CookieOptions.CookieName)
155130
156131 // We go ahead and clear the cookie first, always.
157− clearCookie := cookies.MakeCookie(
132+ clearCookie := cookies.MakeCookieFromOptions(
158133 req,
159− store.CookieName,
134+ store.CookieOptions.CookieName,
160135 "",
161− store.CookiePath,
162− store.CookieDomain,
163− store.CookieHTTPOnly,
164− store.CookieSecure,
136+ store.CookieOptions,
165137 time.Hour*-1,
166138 time.Now(),
167139 )
@@ -169,9 +141,9 @@ func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) erro
169141
170142 // We only return an error if we had an issue with redis
171143 // If there's an issue decoding the ticket, ignore it
172− ticket, _ := decodeTicket(store.CookieName, requestCookie.Value)
144+ ticket, _ := decodeTicket(store.CookieOptions.CookieName, requestCookie.Value)
173145 if ticket != nil {
174− deleted, err := store.Client.Del(ticket.asHandle(store.CookieName)).Result()
146+ deleted, err := store.Client.Del(ticket.asHandle(store.CookieOptions.CookieName)).Result()
175147 fmt.Println("delted %n", deleted)
176148 if err != nil {
177149 return fmt.Errorf("error clearing cookie from redis: %s", err)
@@ -184,7 +156,7 @@ func (store *SessionStore) storeValue(value string, expiresOn time.Time, request
184156 var ticket *TicketData
185157 if requestCookie != nil {
186158 var err error
187− ticket, err = decodeTicket(store.CookieName, requestCookie.Value)
159+ ticket, err = decodeTicket(store.CookieOptions.CookieName, requestCookie.Value)
188160 if err != nil {
189161 return "", err
190162 }
@@ -206,13 +178,13 @@ func (store *SessionStore) storeValue(value string, expiresOn time.Time, request
206178 stream := cipher.NewCFBEncrypter(block, ticket.Secret)
207179 stream.XORKeyStream(ciphertext, []byte(value))
208180
209− handle := ticket.asHandle(store.CookieName)
181+ handle := ticket.asHandle(store.CookieOptions.CookieName)
210182 expires := expiresOn.Sub(time.Now())
211183 err = store.Client.Set(handle, ciphertext, expires).Err()
212184 if err != nil {
213185 return "", err
214186 }
215− return ticket.encodeTicket(store.CookieName), nil
187+ return ticket.encodeTicket(store.CookieOptions.CookieName), nil
216188}
217189
218190func newTicket() (*TicketData, error) {
pkg/sessions/session_store.go+1−1
@@ -15,7 +15,7 @@ func NewSessionStore(opts *options.SessionOptions, cookieOpts *options.CookieOpt
1515 case options.CookieSessionStoreType:
1616 return cookie.NewCookieSessionStore(opts, cookieOpts)
1717 case options.RedisSessionStoreType:
18− return redis.NewRedisSessionStore(opts.RedisStoreOptions, cookieOpts)
18+ return redis.NewRedisSessionStore(opts, cookieOpts)
1919 default:
2020 return nil, fmt.Errorf("unknown session store type '%s'", opts.Type)
2121 }