no list.Remove() need or ChangeID

This commit is contained in:
DarkGopher 2025-06-19 14:43:07 +02:00
parent ffd730b057
commit 44330e3eab
2 changed files with 42 additions and 10 deletions

View file

@ -27,6 +27,7 @@ func init() {
//session.Register("files", pder) //session.Register("files", pder)
} }
// ckdirpath return filename from sid
func ckdirpath(sid string) string { func ckdirpath(sid string) string {
return fmt.Sprintf("%s/%s/%s.%s", pder.sessPath, sessDir, sid, sessExt) 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 // ProviderFiles implement filesystem session provider
type ProviderFiles struct { type ProviderFiles struct {
lock sync.Mutex lock sync.Mutex
sessions map[string]*list.Element
list *list.List //or gc list *list.List //or gc
sessPath string 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) return nil, fmt.Errorf("create session file: %s failed with err: %w", ckf, err)
} }
defer fd.Close() defer fd.Close()
pder.list.PushBack(sid) sess = &SessionFile{sid}
return &SessionFile{sid}, nil ssel := pder.list.PushBack(sess)
pder.sessions[sid] = ssel
return
} }
// Load return existing session by sid or new session if not exists // 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() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
if pder.Exists(sid) { if pder.Exists(sid) {
return &SessionFile{sid}, nil return pder.sessions[sid].Value.(*SessionFile), nil
} }
return pder.Init(sid) 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 // Exists check if session sid exists in storage
func (pder *ProviderFiles) Exists(sid string) bool { func (pder *ProviderFiles) Exists(sid string) bool {
ckf := ckdirpath(sid) ckf := ckdirpath(sid)

View file

@ -57,7 +57,7 @@ func (pder *ProviderMemory) Exists(sid string) (ex bool) {
return 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) { func (pder *ProviderMemory) Load(sid string) (ses session.Session, err error) {
pder.lock.Lock() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
@ -72,8 +72,8 @@ func (pder *ProviderMemory) Destroy(sid string) (err error) {
pder.lock.Lock() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
if ssel, ok := pder.sessions[sid]; ok { if ssel, ok := pder.sessions[sid]; ok {
delete(pder.sessions, sid)
pder.list.Remove(ssel) pder.list.Remove(ssel)
delete(pder.sessions, sid)
return nil return nil
} }
return return
@ -84,11 +84,10 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
pder.lock.Lock() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
if ssel, ok := pder.sessions[oldsid]; ok { if ssel, ok := pder.sessions[oldsid]; ok {
ssel.Value.(*SessionMemory).sid = newsid ssel.Value.(*SessionMemory).sid = newsid //set internal sid to new
le := pder.sessions[oldsid] le := pder.sessions[oldsid] //get list el with old sid
pder.list.Remove(le) delete(pder.sessions, oldsid) //remove old sid in map
delete(pder.sessions, oldsid) pder.sessions[newsid] = le //add new sid into map
pder.sessions[newsid] = ssel
} }
return return
} }