git.iko.soy/typeable/oauth2-proxy
on master help sign in
Simplify redis store options
296d989Joel Speed
pkg/sessions/redis/redis_store.go+25−53
@@ -17,7 +17,6 @@ import (
17 "github.com/pusher/oauth2_proxy/pkg/apis/options"
17 "github.com/pusher/oauth2_proxy/pkg/apis/options"
18 "github.com/pusher/oauth2_proxy/pkg/apis/sessions"
18 "github.com/pusher/oauth2_proxy/pkg/apis/sessions"
19 "github.com/pusher/oauth2_proxy/pkg/cookies"
19 "github.com/pusher/oauth2_proxy/pkg/cookies"
20− "github.com/pusher/oauth2_proxy/pkg/sessions/utils"
21)
20)
22
21
23// TicketData is a structure representing the ticket used in server session storage
22// TicketData is a structure representing the ticket used in server session storage
@@ -29,46 +28,25 @@ type TicketData struct {
29// SessionStore is an implementation of the sessions.SessionStore
28// SessionStore is an implementation of the sessions.SessionStore
30// interface that stores sessions in redis
29// interface that stores sessions in redis
31type SessionStore struct {
30type SessionStore struct {
32− CookieCipher *cookie.Cipher
31+ CookieCipher *cookie.Cipher
33− CookieDomain string
32+ CookieOptions *options.CookieOptions
34− CookieExpire time.Duration
35− CookieHTTPOnly bool
36− CookieName string
37− CookiePath string
38− CookieSecret string
39− CookieSecure bool
40− Client *redis.Client
33+ Client *redis.Client
41}
34}
42
35
43// NewRedisSessionStore initialises a new instance of the SessionStore from
36// NewRedisSessionStore initialises a new instance of the SessionStore from
44// the configuration given
37// the configuration given
45−func NewRedisSessionStore(opts options.RedisStoreOptions, cookieOpts *options.CookieOptions) (sessions.SessionStore, error) {
38+func NewRedisSessionStore(opts *options.SessionOptions, cookieOpts *options.CookieOptions) (sessions.SessionStore, error) {
46− opt, err := redis.ParseURL(opts.RedisConnectionURL)
39+ opt, err := redis.ParseURL(opts.RedisStoreOptions.RedisConnectionURL)
47 if err != nil {
40 if err != nil {
48 return nil, fmt.Errorf("unable to parse redis url: %s", err)
41 return nil, fmt.Errorf("unable to parse redis url: %s", err)
49 }
42 }
50
43
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−
60 client := redis.NewClient(opt)
44 client := redis.NewClient(opt)
61
45
62 rs := &SessionStore{
46 rs := &SessionStore{
63− Client: client,
47+ Client: client,
64− CookieCipher: cookieCipher,
48+ CookieCipher: opts.Cipher,
65− CookieDomain: cookieOpts.CookieDomain,
49+ CookieOptions: cookieOpts,
66− CookieExpire: cookieOpts.CookieExpire,
67− CookieHTTPOnly: cookieOpts.CookieHTTPOnly,
68− CookieName: cookieOpts.CookieName,
69− CookiePath: cookieOpts.CookiePath,
70− CookieSecret: cookieOpts.CookieSecret,
71− CookieSecure: cookieOpts.CookieSecure,
72 }
50 }
73 return rs, nil
51 return rs, nil
74
52
@@ -79,7 +57,7 @@ func NewRedisSessionStore(opts options.RedisStoreOptions, cookieOpts *options.Co
79func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *sessions.SessionState) error {
57func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *sessions.SessionState) error {
80 // Old sessions that we are refreshing would have a request cookie
58 // Old sessions that we are refreshing would have a request cookie
81 // New sessions don't, so we ignore the error. storeValue will check requestCookie
59 // 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)
83 value, err := s.EncodeSessionState(store.CookieCipher)
61 value, err := s.EncodeSessionState(store.CookieCipher)
84 if err != nil {
62 if err != nil {
85 return err
63 return err
@@ -89,15 +67,12 @@ func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *se
89 return err
67 return err
90 }
68 }
91
69
92− ticketCookie := cookies.MakeCookie(
70+ ticketCookie := cookies.MakeCookieFromOptions(
93 req,
71 req,
94− store.CookieName,
72+ store.CookieOptions.CookieName,
95 ticketString,
73 ticketString,
96− store.CookiePath,
74+ store.CookieOptions,
97− store.CookieDomain,
98− store.CookieHTTPOnly,
99− store.CookieSecure,
100− store.CookieExpire,
75+ store.CookieOptions.CookieExpire,
101 time.Now(),
76 time.Now(),
102 )
77 )
103
78
@@ -108,7 +83,7 @@ func (store *SessionStore) Save(rw http.ResponseWriter, req *http.Request, s *se
108// Load reads sessions.SessionState information from a ticket
83// Load reads sessions.SessionState information from a ticket
109// cookie within the HTTP request object
84// cookie within the HTTP request object
110func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, error) {
85func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, error) {
111− requestCookie, err := req.Cookie(store.CookieName)
86+ requestCookie, err := req.Cookie(store.CookieOptions.CookieName)
112 if err != nil {
87 if err != nil {
113 return nil, fmt.Errorf("error loading session: %s", err)
88 return nil, fmt.Errorf("error loading session: %s", err)
114 }
89 }
@@ -122,12 +97,12 @@ func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, erro
122
97
123// LoadSessionFromString loads the session based on the ticket value
98// LoadSessionFromString loads the session based on the ticket value
124func (store *SessionStore) LoadSessionFromString(value string) (*sessions.SessionState, error) {
99func (store *SessionStore) LoadSessionFromString(value string) (*sessions.SessionState, error) {
125− ticket, err := decodeTicket(store.CookieName, value)
100+ ticket, err := decodeTicket(store.CookieOptions.CookieName, value)
126 if err != nil {
101 if err != nil {
127 return nil, err
102 return nil, err
128 }
103 }
129
104
130− result, err := store.Client.Get(ticket.asHandle(store.CookieName)).Result()
105+ result, err := store.Client.Get(ticket.asHandle(store.CookieOptions.CookieName)).Result()
131 if err != nil {
106 if err != nil {
132 return nil, err
107 return nil, err
133 }
108 }
@@ -151,17 +126,14 @@ func (store *SessionStore) LoadSessionFromString(value string) (*sessions.Sessio
151// Clear clears any saved session information for a given ticket cookie
126// Clear clears any saved session information for a given ticket cookie
152// from redis, and then clears the session
127// from redis, and then clears the session
153func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) error {
128func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) error {
154− requestCookie, _ := req.Cookie(store.CookieName)
129+ requestCookie, _ := req.Cookie(store.CookieOptions.CookieName)
155
130
156 // We go ahead and clear the cookie first, always.
131 // We go ahead and clear the cookie first, always.
157− clearCookie := cookies.MakeCookie(
132+ clearCookie := cookies.MakeCookieFromOptions(
158 req,
133 req,
159− store.CookieName,
134+ store.CookieOptions.CookieName,
160 "",
135 "",
161− store.CookiePath,
136+ store.CookieOptions,
162− store.CookieDomain,
163− store.CookieHTTPOnly,
164− store.CookieSecure,
165 time.Hour*-1,
137 time.Hour*-1,
166 time.Now(),
138 time.Now(),
167 )
139 )
@@ -169,9 +141,9 @@ func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) erro
169
141
170 // We only return an error if we had an issue with redis
142 // We only return an error if we had an issue with redis
171 // If there's an issue decoding the ticket, ignore it
143 // 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)
173 if ticket != nil {
145 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()
175 fmt.Println("delted %n", deleted)
147 fmt.Println("delted %n", deleted)
176 if err != nil {
148 if err != nil {
177 return fmt.Errorf("error clearing cookie from redis: %s", err)
149 return fmt.Errorf("error clearing cookie from redis: %s", err)
@@ -184,7 +156,7 @@ func (store *SessionStore) storeValue(value string, expiresOn time.Time, request
184 var ticket *TicketData
156 var ticket *TicketData
185 if requestCookie != nil {
157 if requestCookie != nil {
186 var err error
158 var err error
187− ticket, err = decodeTicket(store.CookieName, requestCookie.Value)
159+ ticket, err = decodeTicket(store.CookieOptions.CookieName, requestCookie.Value)
188 if err != nil {
160 if err != nil {
189 return "", err
161 return "", err
190 }
162 }
@@ -206,13 +178,13 @@ func (store *SessionStore) storeValue(value string, expiresOn time.Time, request
206 stream := cipher.NewCFBEncrypter(block, ticket.Secret)
178 stream := cipher.NewCFBEncrypter(block, ticket.Secret)
207 stream.XORKeyStream(ciphertext, []byte(value))
179 stream.XORKeyStream(ciphertext, []byte(value))
208
180
209− handle := ticket.asHandle(store.CookieName)
181+ handle := ticket.asHandle(store.CookieOptions.CookieName)
210 expires := expiresOn.Sub(time.Now())
182 expires := expiresOn.Sub(time.Now())
211 err = store.Client.Set(handle, ciphertext, expires).Err()
183 err = store.Client.Set(handle, ciphertext, expires).Err()
212 if err != nil {
184 if err != nil {
213 return "", err
185 return "", err
214 }
186 }
215− return ticket.encodeTicket(store.CookieName), nil
187+ return ticket.encodeTicket(store.CookieOptions.CookieName), nil
216}
188}
217
189
218func newTicket() (*TicketData, error) {
190func newTicket() (*TicketData, error) {
pkg/sessions/session_store.go+1−1
@@ -15,7 +15,7 @@ func NewSessionStore(opts *options.SessionOptions, cookieOpts *options.CookieOpt
15 case options.CookieSessionStoreType:
15 case options.CookieSessionStoreType:
16 return cookie.NewCookieSessionStore(opts, cookieOpts)
16 return cookie.NewCookieSessionStore(opts, cookieOpts)
17 case options.RedisSessionStoreType:
17 case options.RedisSessionStoreType:
18− return redis.NewRedisSessionStore(opts.RedisStoreOptions, cookieOpts)
18+ return redis.NewRedisSessionStore(opts, cookieOpts)
19 default:
19 default:
20 return nil, fmt.Errorf("unknown session store type '%s'", opts.Type)
20 return nil, fmt.Errorf("unknown session store type '%s'", opts.Type)
21 }
21 }