diff --git a/ii/db.go b/ii/db.go index cb18287..dbab0f4 100644 --- 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 }