@@ -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"
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
40− Client *redis.Client
33+ Client *redis.Client
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)
51− var cookieCipher *cookie.Cipher
52− if len(cookieOpts.CookieSecret) > 0 {
54− cookieCipher, err = cookie.NewCipher(utils.SecretBytes(cookieOpts.CookieSecret))
56− return nil, fmt.Errorf("unable to create cookieCipher: %v", err)
60 client := redis.NewClient(opt)
44 client := redis.NewClient(opt)
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,
73 return rs, nil
51 return rs, nil
@@ -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
92− ticketCookie := cookies.MakeCookie(
70+ ticketCookie := cookies.MakeCookieFromOptions(
94− store.CookieName,
72+ store.CookieOptions.CookieName,
95 ticketString,
73 ticketString,
96− store.CookiePath,
74+ store.CookieOptions,
98− store.CookieHTTPOnly,
100− store.CookieExpire,
75+ store.CookieOptions.CookieExpire,
101 time.Now(),
76 time.Now(),
@@ -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)
@@ -122,12 +97,12 @@ func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, erro
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
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
@@ -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)
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(
159− store.CookieName,
134+ store.CookieOptions.CookieName,
161− store.CookiePath,
136+ store.CookieOptions,
163− store.CookieHTTPOnly,
165 time.Hour*-1,
137 time.Hour*-1,
166 time.Now(),
138 time.Now(),
@@ -169,9 +141,9 @@ func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) erro
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
@@ -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))
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
215− return ticket.encodeTicket(store.CookieName), nil
187+ return ticket.encodeTicket(store.CookieOptions.CookieName), nil
218func newTicket() (*TicketData, error) {
190func newTicket() (*TicketData, error) {