indentalUserDB: add mutex for writes and initialize map on UserAdd
This commit is contained in:
parent
8f0c520600
commit
d456892299
1 changed files with 27 additions and 7 deletions
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue