indentalUserDB: add mutex for writes and initialize map on UserAdd

This commit is contained in:
Iris Lightshard 2023-07-12 22:47:55 -06:00
parent 8f0c520600
commit d456892299
Signed by: Iris Lightshard
GPG key ID: 3B7FBC22144E6398

View file

@ -11,22 +11,20 @@ import (
"strings"
"strconv"
"time"
"sync"
)
type IndentalUserDB struct {
Users map[string]*auth.User
Basis string
mtx sync.Mutex
}
func CreateIndentalUserDB(filePath string) *IndentalUserDB {
u, err := readDB(filePath)
if err == nil {
uMap := map[string]*auth.User{}
for _, usr := range u {
uMap[usr.Name] = usr
}
return &IndentalUserDB{
Users: uMap,
Users: u,
Basis: filePath,
}
} else {
@ -45,11 +43,13 @@ func (self *IndentalUserDB) InitiateSession(user string, password string, ttl in
return "", errors.New("Incorrect password")
}
sessionId := cookie.GenToken(64)
self.mtx.Lock()
self.Users[user].Session = sessionId
self.Users[user].LoginTime = time.Now()
self.Users[user].LastSeen = time.Now()
self.mtx.Unlock()
// SetData calls Lock & Unlock and writes DB to file
self.SetData(user, "token_expiry", strconv.Itoa(ttl))
writeDB(self.Basis, self.Users)
return sessionId, nil
}
@ -61,11 +61,13 @@ func (self *IndentalUserDB) GrantToken(user, password string, ttl int) (string,
return "", errors.New("Incorrect password")
}
sessionId := cookie.GenToken(64)
self.mtx.Lock()
self.Users[user].Session = sessionId
self.Users[user].LoginTime = time.Now()
self.Users[user].LastSeen = time.Now()
self.mtx.Unlock()
// SetData calls Lock & Unlock and writes DB to file
self.SetData(user, "token_expiry", strconv.Itoa(ttl))
writeDB(self.Basis, self.Users)
return base64.StdEncoding.EncodeToString([]byte(user + "\n" + sessionId)), nil
}
@ -83,6 +85,8 @@ func (self *IndentalUserDB) ValidateUser(user string, sessionId string) (bool, e
self.EndSession(user)
return true, errors.New("Cookie or token expired")
} else {
self.mtx.Lock()
defer self.mtx.Unlock()
self.Users[user].LastSeen = time.Now()
writeDB(self.Basis, self.Users)
}
@ -132,6 +136,8 @@ func (self *IndentalUserDB) EndSession(user string) error {
return errors.New("User not in DB")
}
self.mtx.Lock()
defer self.mtx.Unlock()
self.Users[user].Session = ""
self.Users[user].LastSeen = time.Now()
writeDB(self.Basis, self.Users)
@ -143,6 +149,8 @@ func (self *IndentalUserDB) DeleteUser(user string) error {
return errors.New("User not in DB")
}
self.mtx.Lock()
defer self.mtx.Unlock()
delete(self.Users, user)
writeDB(self.Basis, self.Users)
return nil
@ -157,6 +165,8 @@ func (self *IndentalUserDB) ChangePassword(user string, password string, oldPass
}
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 10)
self.mtx.Lock()
defer self.mtx.Unlock()
self.Users[user].Pass = string(hash[:])
writeDB(self.Basis, self.Users)
return nil
@ -169,12 +179,15 @@ func (self *IndentalUserDB) AddUser(user string, password string) error {
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 10)
self.mtx.Lock()
defer self.mtx.Unlock()
self.Users[user] = &auth.User{
Name: user,
Pass: string(hash[:]),
LastSeen: time.UnixMicro(0),
LoginTime: time.UnixMicro(0),
Session: "",
Data: map[string]interface{}{},
}
writeDB(self.Basis, self.Users)
return nil
@ -184,6 +197,7 @@ func (self *IndentalUserDB) GetLastLoginTime(user string) (time.Time, error) {
if usr, exists := self.Users[user]; exists {
return usr.LoginTime, nil
}
return time.UnixMicro(0), errors.New("User not in DB")
}
@ -191,15 +205,20 @@ func (self *IndentalUserDB) GetLastTimeSeen(user string) (time.Time, error) {
if usr, exists := self.Users[user]; exists {
return usr.LastSeen, nil
}
return time.UnixMicro(0), errors.New("User not in DB")
}
func (self *IndentalUserDB) SetData(user string, key string, value interface{}) error {
if _, exists := self.Users[user]; !exists {
return errors.New("User not in DB")
}
self.mtx.Lock()
defer self.mtx.Unlock()
self.Users[user].Data[key] = value
writeDB(self.Basis, self.Users)
return nil
}
@ -207,6 +226,7 @@ func (self *IndentalUserDB) GetData(user string, key string) (interface{}, error
if _, usrExists := self.Users[user]; !usrExists {
return nil, errors.New("User not in DB")
}
data, exists := self.Users[user].Data[key]
if !exists {
return nil, errors.New("Key not found in user data")