@@ -348,13 +348,12 @@ func NewProcessCookieTest(opts ProcessCookieTestOpts) *ProcessCookieTest {
348348
349349 pc_test.opts = NewOptions()
350350 pc_test.opts.Upstreams = append(pc_test.opts.Upstreams, "unused")
351− pc_test.opts.CookieSecret = "foobar"
352351 pc_test.opts.ClientID = "bazquux"
353352 pc_test.opts.ClientSecret = "xyzzyplugh"
354353 pc_test.opts.CookieSecret = "0123456789abcdef"
355354 // First, set the CookieRefresh option so proxy.AesCipher is created,
356355 // needed to encrypt the access_token.
357− pc_test.opts.CookieRefresh = time.Duration(24) * time.Hour
356+ pc_test.opts.CookieRefresh = time.Hour
358357 pc_test.opts.Validate()
359358
360359 pc_test.proxy = NewOauthProxy(pc_test.opts, func(email string) bool {
@@ -379,14 +378,13 @@ func NewProcessCookieTestWithDefaults() *ProcessCookieTest {
379378 })
380379}
381380
382−func (p *ProcessCookieTest) MakeCookie(value, access_token string) *http.Cookie {
383− cookie_value, _ := buildCookieValue(
384− value, p.proxy.AesCipher, access_token)
385− return p.proxy.MakeCookie(p.req, cookie_value, p.opts.CookieExpire)
381+func (p *ProcessCookieTest) MakeCookie(value, access_token string, ref time.Time) *http.Cookie {
382+ cookie_value, _ := buildCookieValue(value, p.proxy.AesCipher, access_token)
383+ return p.proxy.MakeCookie(p.req, cookie_value, p.opts.CookieExpire, ref)
386384}
387385
388386func (p *ProcessCookieTest) AddCookie(value, access_token string) {
389− p.req.AddCookie(p.MakeCookie(value, access_token))
387+ p.req.AddCookie(p.MakeCookie(value, access_token, time.Now()))
390388}
391389
392390func (p *ProcessCookieTest) ProcessCookie() (email, user, access_token string, ok bool) {
@@ -416,7 +414,7 @@ func TestProcessCookieFailIfParsingCookieValueFails(t *testing.T) {
416414 pc_test.proxy.AesCipher, "my_access_token")
417415 pc_test.req.AddCookie(pc_test.proxy.MakeCookie(
418416 pc_test.req, value+"some bogus bytes",
419− pc_test.opts.CookieExpire))
417+ pc_test.opts.CookieExpire, time.Now()))
420418 _, _, _, ok := pc_test.ProcessCookie()
421419 assert.Equal(t, false, ok)
422420}
@@ -424,7 +422,8 @@ func TestProcessCookieFailIfParsingCookieValueFails(t *testing.T) {
424422func TestProcessCookieRefreshNotSet(t *testing.T) {
425423 pc_test := NewProcessCookieTestWithDefaults()
426424 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
427− cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "")
425+ reference := time.Now().Add(time.Duration(-2) * time.Hour)
426+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "", reference)
428427 pc_test.req.AddCookie(cookie)
429428
430429 _, _, _, ok := pc_test.ProcessCookie()
@@ -435,10 +434,11 @@ func TestProcessCookieRefreshNotSet(t *testing.T) {
435434func TestProcessCookieRefresh(t *testing.T) {
436435 pc_test := NewProcessCookieTestWithDefaults()
437436 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
438− cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
437+ reference := time.Now().Add(time.Duration(-2) * time.Hour)
438+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
439439 pc_test.req.AddCookie(cookie)
440440
441− pc_test.proxy.CookieRefresh = time.Duration(24) * time.Hour
441+ pc_test.proxy.CookieRefresh = time.Hour
442442 _, _, _, ok := pc_test.ProcessCookie()
443443 assert.Equal(t, true, ok)
444444 assert.NotEqual(t, []string(nil), pc_test.rw.HeaderMap["Set-Cookie"])
@@ -446,25 +446,58 @@ func TestProcessCookieRefresh(t *testing.T) {
446446
447447func TestProcessCookieRefreshThresholdNotCrossed(t *testing.T) {
448448 pc_test := NewProcessCookieTestWithDefaults()
449− pc_test.proxy.CookieExpire = time.Duration(25) * time.Hour
450− cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
449+ pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
450+ reference := time.Now().Add(time.Duration(-30) * time.Minute)
451+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
451452 pc_test.req.AddCookie(cookie)
452453
453− pc_test.proxy.CookieRefresh = time.Duration(24) * time.Hour
454+ pc_test.proxy.CookieRefresh = time.Hour
454455 _, _, _, ok := pc_test.ProcessCookie()
455456 assert.Equal(t, true, ok)
456457 assert.Equal(t, []string(nil), pc_test.rw.HeaderMap["Set-Cookie"])
457458}
458459
460+func TestProcessCookieFailIfCookieExpired(t *testing.T) {
461+ pc_test := NewProcessCookieTestWithDefaults()
462+ pc_test.proxy.CookieExpire = time.Duration(24) * time.Hour
463+ reference := time.Now().Add(time.Duration(25) * time.Hour * -1)
464+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
465+ pc_test.req.AddCookie(cookie)
466+
467+ if _, _, _, ok := pc_test.ProcessCookie(); ok {
468+ t.Error("ProcessCookie() should have failed")
469+ }
470+ if set_cookie := pc_test.rw.HeaderMap["Set-Cookie"]; set_cookie != nil {
471+ t.Error("expected Set-Cookie to be nil, instead was: ", set_cookie)
472+ }
473+}
474+
475+func TestProcessCookieFailIfRefreshSetAndCookieExpired(t *testing.T) {
476+ pc_test := NewProcessCookieTestWithDefaults()
477+ pc_test.proxy.CookieExpire = time.Duration(24) * time.Hour
478+ reference := time.Now().Add(time.Duration(25) * time.Hour * -1)
479+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
480+ pc_test.req.AddCookie(cookie)
481+
482+ pc_test.proxy.CookieRefresh = time.Hour
483+ if _, _, _, ok := pc_test.ProcessCookie(); ok {
484+ t.Error("ProcessCookie() should have failed")
485+ }
486+ if set_cookie := pc_test.rw.HeaderMap["Set-Cookie"]; set_cookie != nil {
487+ t.Error("expected Set-Cookie to be nil, instead was: ", set_cookie)
488+ }
489+}
490+
459491func TestProcessCookieFailIfRefreshSetAndTokenNoLongerValid(t *testing.T) {
460492 pc_test := NewProcessCookieTest(ProcessCookieTestOpts{
461493 provider_validate_cookie_response: false,
462494 })
463495 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
464− cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
496+ reference := time.Now().Add(time.Duration(-24) * time.Hour)
497+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
465498 pc_test.req.AddCookie(cookie)
466499
467− pc_test.proxy.CookieRefresh = time.Duration(24) * time.Hour
500+ pc_test.proxy.CookieRefresh = time.Hour
468501 _, _, _, ok := pc_test.ProcessCookie()
469502 assert.Equal(t, false, ok)
470503 assert.Equal(t, []string(nil), pc_test.rw.HeaderMap["Set-Cookie"])
@@ -475,10 +508,11 @@ func TestProcessCookieFailIfRefreshSetAndUserNoLongerValid(t *testing.T) {
475508 pc_test.validate_user = false
476509
477510 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
478− cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
511+ reference := time.Now().Add(time.Duration(-2) * time.Hour)
512+ cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token", reference)
479513 pc_test.req.AddCookie(cookie)
480514
481− pc_test.proxy.CookieRefresh = time.Duration(24) * time.Hour
515+ pc_test.proxy.CookieRefresh = time.Hour
482516 _, _, _, ok := pc_test.ProcessCookie()
483517 assert.Equal(t, false, ok)
484518 assert.Equal(t, []string(nil), pc_test.rw.HeaderMap["Set-Cookie"])