diff --git a/storage/files/files.go b/storage/files/files.go index a5cbbe7..fc56d79 100644 --- a/storage/files/files.go +++ b/storage/files/files.go @@ -12,6 +12,7 @@ import ( "time" //"git.mtux.eu/darkgopher/session" + "git.mtux.eu/darkgopher/session" "github.com/djherbis/atime" ) @@ -24,7 +25,7 @@ var pder *ProviderFiles func init() { pder = &ProviderFiles{} - //session.Register("files", pder) + session.Register("files", pder) } // ckdirpath return filename from sid @@ -63,7 +64,7 @@ func (pder *ProviderFiles) SetParams(p any) (err error) { } // Init create empty session file if not exists and retturn *Session -func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) { +func (pder *ProviderFiles) Init(sid string) (sess session.Session, err error) { pder.lock.Lock() defer pder.lock.Unlock() var fd *os.File @@ -75,11 +76,11 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) { sess = &SessionFile{sid} ssel := pder.list.PushBack(sess) pder.sessions[sid] = ssel - return + return sess, nil } // Load return existing session by sid or new session if not exists -func (pder *ProviderFiles) Load(sid string) (sess *SessionFile, err error) { +func (pder *ProviderFiles) Load(sid string) (sess session.Session, err error) { pder.lock.Lock() defer pder.lock.Unlock() if pder.Exists(sid) { @@ -103,17 +104,16 @@ func (pder *ProviderFiles) Destroy(sid string) (err error) { // 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 { + 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) + ssel.Value.(*SessionFile).sid = newsid delete(pder.sessions, oldsid) - }*/ - + pder.sessions[newsid] = ssel + } return } @@ -126,6 +126,30 @@ func (pder *ProviderFiles) Exists(sid string) bool { return true } +// GC periodically remove old sessions rom storages +func (pder *ProviderFiles) GC(maxlifetime int64) { + pder.lock.Lock() + defer pder.lock.Unlock() + for { + ssel := pder.list.Back() + if ssel == nil { + break + } + sid := ssel.Value.(*SessionFile).sid + var at time.Time + var err error + if at, err = pder.getAtime(sid); err != nil { + continue + } + if at.UnixMilli()+(maxlifetime*session.MilisPerSec()) < time.Now().UnixMilli() { + pder.list.Remove(ssel) + delete(pder.sessions, sid) + ckf := ckdirpath(sid) + os.Remove(ckf) + } + } +} + // SessionFile save session data into files using gob encode/dacode type SessionFile struct { sid string diff --git a/storage/memory/memory.go b/storage/memory/memory.go index 608f1ab..0a9e9be 100644 --- a/storage/memory/memory.go +++ b/storage/memory/memory.go @@ -85,9 +85,8 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) { defer pder.lock.Unlock() if ssel, ok := pder.sessions[oldsid]; ok { 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 + pder.sessions[newsid] = ssel //add new sid into map } return }