SessionFiles done...

This commit is contained in:
DarkGopher 2025-06-19 19:17:11 +02:00
parent 44330e3eab
commit 045163310e
2 changed files with 34 additions and 11 deletions

View file

@ -12,6 +12,7 @@ import (
"time" "time"
//"git.mtux.eu/darkgopher/session" //"git.mtux.eu/darkgopher/session"
"git.mtux.eu/darkgopher/session"
"github.com/djherbis/atime" "github.com/djherbis/atime"
) )
@ -24,7 +25,7 @@ var pder *ProviderFiles
func init() { func init() {
pder = &ProviderFiles{} pder = &ProviderFiles{}
//session.Register("files", pder) session.Register("files", pder)
} }
// ckdirpath return filename from sid // 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 // 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() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
var fd *os.File var fd *os.File
@ -75,11 +76,11 @@ func (pder *ProviderFiles) Init(sid string) (sess *SessionFile, err error) {
sess = &SessionFile{sid} sess = &SessionFile{sid}
ssel := pder.list.PushBack(sess) ssel := pder.list.PushBack(sess)
pder.sessions[sid] = ssel pder.sessions[sid] = ssel
return return sess, nil
} }
// Load return existing session by sid or new session if not exists // 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() pder.lock.Lock()
defer pder.lock.Unlock() defer pder.lock.Unlock()
if pder.Exists(sid) { 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 // ChangeID change oldsid to newsid and preserve session data
func (pder *ProviderFiles) ChangeID(oldsid, newsid string) (err error) { 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) ckfold := ckdirpath(oldsid)
ckfnew := ckdirpath(newsid) ckfnew := ckdirpath(newsid)
if err = os.Rename(ckfold, ckfnew); err != nil { if err = os.Rename(ckfold, ckfnew); err != nil {
return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err) return fmt.Errorf("Rename cookie file: %s to: %s failed: %v", ckfold, ckfnew, err)
} }
oldssel := pder.sessions[oldsid] ssel.Value.(*SessionFile).sid = newsid
pder.list.Remove(oldssel)
delete(pder.sessions, oldsid) delete(pder.sessions, oldsid)
}*/ pder.sessions[newsid] = ssel
}
return return
} }
@ -126,6 +126,30 @@ func (pder *ProviderFiles) Exists(sid string) bool {
return true 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 // SessionFile save session data into files using gob encode/dacode
type SessionFile struct { type SessionFile struct {
sid string sid string

View file

@ -85,9 +85,8 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
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 //set internal sid to new 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 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 return
} }