save/restore session token when users db reloading (if user unlocked);
tracking of when the points.txt file was last modified to detect changesmaster
parent
ad803f86ba
commit
f704996613
29
ii/db.go
29
ii/db.go
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue