save/restore session token when users db reloading (if user unlocked);

tracking of when the points.txt file was last modified to detect changes
master
vasyahacker 2023-05-18 08:56:43 +04:00
parent ad803f86ba
commit f704996613
1 changed files with 23 additions and 6 deletions

View File

@ -875,6 +875,7 @@ type User struct {
}
// User database.
// ModTime: last modification time of points.txt to detect DB changes.
// FileSize - size of points.txt to detect DB changes.
// Names: holds User structure by user name
// ById: holds user name by user id
@ -887,6 +888,7 @@ type UDB struct {
Tokens map[string]string
List []string
Sync sync.RWMutex
ModTime int64
FileSize int64
}
@ -1088,15 +1090,16 @@ func (db *UDB) Edit(u *User) error {
if err := os.Rename(db.Path+".tmp", db.Path); err != nil {
return err
}
db.FileSize = 0 // force to reload
db.ModTime = 0 // force to reload
return nil
}
// Load user information in memory if it is needed (FileSize changed).
// Load user information in memory if it is needed (ModTime or FileSize changed).
// So, it is safe to call it on every request.
func (db *UDB) LoadUsers() error {
db.Sync.Lock()
defer db.Sync.Unlock()
var mtime int64
var fsize int64
file, err := os.Open(db.Path)
if err == nil {
@ -1106,16 +1109,22 @@ func (db *UDB) LoadUsers() error {
Error.Printf("Can not stat %s file: %s", db.Path, err)
return err
}
mtime = info.ModTime().Unix()
fsize = info.Size()
} else if os.IsNotExist(err) {
fsize = 0
mtime = 0
} else {
Error.Printf("Can not open %s file: %s", db.Path, err)
return err
}
if db.FileSize == fsize {
if db.ModTime == mtime && db.FileSize == fsize {
return nil
}
// save old tokens before reload
old_tokens := make(map[string]string)
for otoken, oname := range db.Tokens {
old_tokens[oname] = otoken
}
db.Names = make(map[string]User)
db.Tokens = make(map[string]string)
db.ById = make(map[int32]string)
@ -1137,8 +1146,15 @@ func (db *UDB) LoadUsers() error {
u.Mail = a[2]
u.Secret = a[3]
u.Tags = NewTags(a[4])
//u.Token = a[5]
//db.Tokens[u.Token] = u.Name
//restore token if user onlocked
token, ok := old_tokens[u.Name]
if ok {
locked, _ := u.Tags.Get("locked")
if locked != "" && locked == "no" {
u.Token = token
db.Tokens[token] = u.Name
}
}
db.ById[u.Id] = u.Name
db.Names[u.Name] = u
db.List = append(db.List, u.Name)
@ -1148,6 +1164,7 @@ func (db *UDB) LoadUsers() error {
Error.Printf("Can not read user DB: %s", err)
return errors.New(err.Error())
}
db.ModTime = mtime
db.FileSize = fsize
return nil
}