From f9bfa180b81c869d7f752f2619575624834711a3 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Mon, 5 Sep 2016 08:17:54 +0200 Subject: [PATCH 1/7] Delete store file in case if cookies max-age < 0 --- store.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/store.go b/store.go index ba3b9e9..3d511d0 100644 --- a/store.go +++ b/store.go @@ -207,6 +207,15 @@ func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error) { // Save adds a single session to the response. func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter, session *Session) error { + // Delete if max-age is < 0 + if session.Options.MaxAge < 0 { + if err := s.erase(session); err != nil { + return err + } + http.SetCookie(w, NewCookie(session.Name(), "", session.Options)) + return nil + } + if session.ID == "" { // Because the ID is used in the filename, encode it to // use alphanumeric characters only. @@ -268,3 +277,10 @@ func (s *FilesystemStore) load(session *Session) error { } return nil } + +// delete session file +func (s *FilesystemStore) erase(session *Session) error { + filename := s.path + "session_" + session.ID + err := os.Remove(filename) + return err +} From a7f605d878bd4649ce5c9a499ff32e8379424912 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Tue, 6 Sep 2016 12:03:30 +0200 Subject: [PATCH 2/7] Improve the file path definition in erase function --- store.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/store.go b/store.go index 3d511d0..7a0ca7f 100644 --- a/store.go +++ b/store.go @@ -280,7 +280,8 @@ func (s *FilesystemStore) load(session *Session) error { // delete session file func (s *FilesystemStore) erase(session *Session) error { - filename := s.path + "session_" + session.ID + filename := filepath.Join(s.path, "session_"+session.ID) + err := os.Remove(filename) return err } From 20b323aa55bda5e691cbaf7d7295158c84b678fa Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Tue, 6 Sep 2016 12:08:07 +0200 Subject: [PATCH 3/7] Protect the session file with mutex in delete func --- store.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/store.go b/store.go index 7a0ca7f..90795e4 100644 --- a/store.go +++ b/store.go @@ -282,6 +282,9 @@ func (s *FilesystemStore) load(session *Session) error { func (s *FilesystemStore) erase(session *Session) error { filename := filepath.Join(s.path, "session_"+session.ID) + fileMutex.RLock() + defer fileMutex.RUnlock() + err := os.Remove(filename) return err } From 7f9c43d8f5298d4bb462801e61152528bd3d1991 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Tue, 6 Sep 2016 13:55:37 +0200 Subject: [PATCH 4/7] Delete filesystem session if max-age is <= 0 --- store.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/store.go b/store.go index 90795e4..2bb6a45 100644 --- a/store.go +++ b/store.go @@ -207,8 +207,8 @@ func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error) { // Save adds a single session to the response. func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter, session *Session) error { - // Delete if max-age is < 0 - if session.Options.MaxAge < 0 { + // Delete if max-age is <= 0 + if session.Options.MaxAge <= 0 { if err := s.erase(session); err != nil { return err } From e138b2548bf6ae391fd228b8efc38eb70c1669f4 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Tue, 6 Sep 2016 14:11:34 +0200 Subject: [PATCH 5/7] Add tests for filesystem store delete function --- store_test.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/store_test.go b/store_test.go index 022acba..29d84c5 100644 --- a/store_test.go +++ b/store_test.go @@ -71,3 +71,55 @@ func TestGH2MaxLength(t *testing.T) { t.Fatal("failed to Save:", err) } } + +// Test delete filesystem store with max-age: -1 +func TestGH8FilesystemStoreDelete(t *testing.T) { + store := NewFilesystemStore("", []byte("some key")) + req, err := http.NewRequest("GET", "http://www.example.com", nil) + if err != nil { + t.Fatal("failed to create request", err) + } + w := httptest.NewRecorder() + + session, err := store.New(req, "hello") + if err != nil { + t.Fatal("failed to create session", err) + } + + err = session.Save(req,w) + if err != nil { + t.Fatal("failed to save session", err) + } + + session.Options.MaxAge = -1 + err = session.Save(req, w) + if err != nil { + t.Fatal("failed to delete session", err) + } +} + +// Test delete filesystem store with max-age: 0 +func TestGH8FilesystemStoreDelete2(t *testing.T) { + store := NewFilesystemStore("", []byte("some key")) + req, err := http.NewRequest("GET", "http://www.example.com", nil) + if err != nil { + t.Fatal("failed to create request", err) + } + w := httptest.NewRecorder() + + session, err := store.New(req, "hello") + if err != nil { + t.Fatal("failed to create session", err) + } + + err = session.Save(req,w) + if err != nil { + t.Fatal("failed to save session", err) + } + + session.Options.MaxAge = 0 + err = session.Save(req, w) + if err != nil { + t.Fatal("failed to delete session", err) + } +} From 3b12f6052c160d3a6d9c20e28dabceeb6ce546f9 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Tue, 6 Sep 2016 23:14:23 +0200 Subject: [PATCH 6/7] Extend the doc with the file session deletion. --- store.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/store.go b/store.go index 2bb6a45..4ff6b6c 100644 --- a/store.go +++ b/store.go @@ -205,6 +205,11 @@ func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error) { } // Save adds a single session to the response. +// +// If the Options.MaxAge of the session is <= 0 then the session file will be +// deleted from the store path. With this process it enforces the properly +// session cookie handling so no need to trust in the cookie management in the +// web browser. func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter, session *Session) error { // Delete if max-age is <= 0 From aede3ed433900c2ef06d8fb9cc311a1d51f33cb8 Mon Sep 17 00:00:00 2001 From: Zoltan Papp Date: Wed, 7 Sep 2016 23:03:38 +0200 Subject: [PATCH 7/7] formate source code in store_test.go --- store_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/store_test.go b/store_test.go index 29d84c5..bfc53fa 100644 --- a/store_test.go +++ b/store_test.go @@ -86,7 +86,7 @@ func TestGH8FilesystemStoreDelete(t *testing.T) { t.Fatal("failed to create session", err) } - err = session.Save(req,w) + err = session.Save(req, w) if err != nil { t.Fatal("failed to save session", err) } @@ -112,7 +112,7 @@ func TestGH8FilesystemStoreDelete2(t *testing.T) { t.Fatal("failed to create session", err) } - err = session.Save(req,w) + err = session.Save(req, w) if err != nil { t.Fatal("failed to save session", err) }