From 44330e3eab4db9ed30fa666ab59e89dc9a6b1331 Mon Sep 17 00:00:00 2001 From: DarkGopher Date: Thu, 19 Jun 2025 14:43:07 +0200 Subject: [PATCH] no list.Remove() need or ChangeID --- storage/files/files.go | 39 ++++++++++++++++++++++++++++++++++++--- storage/memory/memory.go | 13 ++++++------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/storage/files/files.go b/storage/files/files.go index 1927a8a..a5cbbe7 100644 --- a/storage/files/files.go +++ b/storage/files/files.go @@ -27,6 +27,7 @@ func init() { //session.Register("files", pder) } +// ckdirpath return filename from sid func ckdirpath(sid string) string { return fmt.Sprintf("%s/%s/%s.%s", pder.sessPath, sessDir, sid, sessExt) } @@ -34,6 +35,7 @@ func ckdirpath(sid string) string { // ProviderFiles implement filesystem session provider type ProviderFiles struct { lock sync.Mutex + sessions map[string]*list.Element list *list.List //or gc sessPath string } @@ -70,8 +72,10 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) { return nil, fmt.Errorf("create session file: %s failed with err: %w", ckf, err) } defer fd.Close() - pder.list.PushBack(sid) - return &SessionFile{sid}, nil + sess = &SessionFile{sid} + ssel := pder.list.PushBack(sess) + pder.sessions[sid] = ssel + return } // Load return existing session by sid or new session if not exists @@ -79,11 +83,40 @@ func (pder *ProviderFiles) Load(sid string) (sess *SessionFile, err error) { pder.lock.Lock() defer pder.lock.Unlock() if pder.Exists(sid) { - return &SessionFile{sid}, nil + return pder.sessions[sid].Value.(*SessionFile), nil } return pder.Init(sid) } +// Destroy remove session file +func (pder *ProviderFiles) Destroy(sid string) (err error) { + pder.lock.Lock() + defer pder.lock.Unlock() + if pder.Exists(sid) { + ssel := pder.sessions[sid] + delete(pder.sessions, sid) + pder.list.Remove(ssel) + return os.Remove(ckdirpath(sid)) + } + return +} + +// ChangeID change oldsid to newsid and preserve session data +func (pder *ProviderFiles) ChangeID(oldsid, newsid string) (err error) { + /*if ssel, ok := pder.sessions[oldsid]; ok { + ckfold := ckdirpath(oldsid) + ckfnew := ckdirpath(newsid) + if err = os.Rename(ckfold, ckfnew); err != nil { + return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err) + } + oldssel := pder.sessions[oldsid] + pder.list.Remove(oldssel) + delete(pder.sessions, oldsid) + }*/ + + return +} + // Exists check if session sid exists in storage func (pder *ProviderFiles) Exists(sid string) bool { ckf := ckdirpath(sid) diff --git a/storage/memory/memory.go b/storage/memory/memory.go index 292870f..608f1ab 100644 --- a/storage/memory/memory.go +++ b/storage/memory/memory.go @@ -57,7 +57,7 @@ func (pder *ProviderMemory) Exists(sid string) (ex bool) { return } -// read return existing unexpired session or create new +// Load return existing unexpired session or create new func (pder *ProviderMemory) Load(sid string) (ses session.Session, err error) { pder.lock.Lock() defer pder.lock.Unlock() @@ -72,8 +72,8 @@ func (pder *ProviderMemory) Destroy(sid string) (err error) { pder.lock.Lock() defer pder.lock.Unlock() if ssel, ok := pder.sessions[sid]; ok { - delete(pder.sessions, sid) pder.list.Remove(ssel) + delete(pder.sessions, sid) return nil } return @@ -84,11 +84,10 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) { pder.lock.Lock() defer pder.lock.Unlock() if ssel, ok := pder.sessions[oldsid]; ok { - ssel.Value.(*SessionMemory).sid = newsid - le := pder.sessions[oldsid] - pder.list.Remove(le) - delete(pder.sessions, oldsid) - pder.sessions[newsid] = ssel + ssel.Value.(*SessionMemory).sid = newsid //set internal sid to new + le := pder.sessions[oldsid] //get list el with old sid + delete(pder.sessions, oldsid) //remove old sid in map + pder.sessions[newsid] = le //add new sid into map } return }