commit f7049966136b7ab86cf58048b3954d0e3302900d
parent ad803f86ba5d55da962366dfc8b69d28f1bc2edc
Author: vasyahacker <vasya@magicfreedom.com>
Date: Thu, 18 May 2023 08:56:43 +0400
save/restore session token when users db reloading (if user unlocked);
tracking of when the points.txt file was last modified to detect changes
Diffstat:
| M | ii/db.go | | | 29 | +++++++++++++++++++++++------ |
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/ii/db.go b/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
}