split db and bolt to store interface
This commit is contained in:
parent
07ff5ccffb
commit
7e77fd7d27
14 changed files with 419 additions and 545 deletions
227
pkg/db/user.go
227
pkg/db/user.go
|
|
@ -1,66 +1,47 @@
|
|||
package db
|
||||
|
||||
import (
|
||||
"github.com/boltdb/bolt"
|
||||
"errors"
|
||||
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
Username string
|
||||
Password string
|
||||
Admin bool
|
||||
Locked int
|
||||
}
|
||||
|
||||
var (
|
||||
errUserNotFound = dbErr("user not found")
|
||||
errUserExists = dbErr("user already exist")
|
||||
)
|
||||
|
||||
func (bs *BoltStore) GetUsers() (users []User, err error) {
|
||||
users, err = bs.DumpUsers()
|
||||
func (db *DB) GetUsers() (users []core.User, err error) {
|
||||
// TODO
|
||||
/*users, err = db.DumpUsers()
|
||||
for i := range users {
|
||||
users[i].Password = ""
|
||||
}
|
||||
}*/
|
||||
return
|
||||
}
|
||||
|
||||
func (bs *BoltStore) GetUserWithoutPassword(username string) (u User, err error) {
|
||||
u, err = bs.GetUser(username)
|
||||
func (db *DB) GetUserWithoutPassword(username string) (u core.User, err error) {
|
||||
u, err = db.GetUser(username)
|
||||
u.Password = ""
|
||||
return
|
||||
}
|
||||
|
||||
func (bs *BoltStore) GetUser(username string) (u User, err error) {
|
||||
err = bs.db.View(func(tx *bolt.Tx) error {
|
||||
v := tx.Bucket([]byte(userTable)).Get([]byte(username))
|
||||
if v == nil {
|
||||
return errUserNotFound
|
||||
}
|
||||
return bs.Unmarshal(v, &u)
|
||||
})
|
||||
func (db *DB) GetUser(username string) (u core.User, err error) {
|
||||
err = db.users.Get(username, &u)
|
||||
return
|
||||
}
|
||||
|
||||
func (bs *BoltStore) UserIsAdmin(username string) (admin bool) {
|
||||
bs.db.View(func(tx *bolt.Tx) error {
|
||||
u, _ := bs.GetUser(username)
|
||||
admin = u.Admin
|
||||
return nil
|
||||
})
|
||||
return
|
||||
func (db *DB) UserIsAdmin(username string) bool {
|
||||
u, _ := db.GetUser(username)
|
||||
return u.Admin
|
||||
}
|
||||
|
||||
func (bs *BoltStore) UserExists(username string) error {
|
||||
return bs.db.View(func(tx *bolt.Tx) error {
|
||||
if tx.Bucket([]byte(userTable)).Get([]byte(username)) == nil {
|
||||
return errUserNoFound
|
||||
}
|
||||
return nil
|
||||
})
|
||||
func (db *DB) UserExists(username string) error {
|
||||
return db.users.Get(username, nil)
|
||||
}
|
||||
|
||||
func (bs *BoltStore) DumpUsers() (users []User, err error) {
|
||||
// TODO
|
||||
/*func (bs *BoltStore) DumpUsers() (users []User, err error) {
|
||||
var buf [][]byte
|
||||
err = bs.db.View(func(tx *bolt.Tx) error {
|
||||
return tx.Bucket([]byte(userTable)).ForEach(func(k, v []byte) error {
|
||||
|
|
@ -102,135 +83,101 @@ func (bs *BoltStore) RestoreUsers(users []User) error {
|
|||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
}*/
|
||||
|
||||
func (bs *BoltStore) CreateUser(username, password string, admin bool) error {
|
||||
if err := bs.UserExists(username); err == nil {
|
||||
func (db *DB) CreateUser(username, password string, admin bool) error {
|
||||
if err := db.UserExists(username); err == nil {
|
||||
return errUserExists
|
||||
}
|
||||
return bs.db.Update(func(tx *bolt.Tx) error {
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
v, err := bs.Marshal(&User{
|
||||
Username: username,
|
||||
Password: string(hash),
|
||||
Admin: admin,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Bucket([]byte(userTable)).Put([]byte(username), v)
|
||||
})
|
||||
}
|
||||
|
||||
func (bs *BoltStore) Login(username, password string) error {
|
||||
var e error
|
||||
err := bs.db.Update(func(tx *bolt.Tx) error {
|
||||
us, err := bs.GetUser(username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if us.Locked == 3 {
|
||||
return errors.New("db: user locked")
|
||||
}
|
||||
b := tx.Bucket([]byte(userTable))
|
||||
if err := bcrypt.CompareHashAndPassword([]byte(us.Password), validatePassword(password)); err != nil {
|
||||
us.Locked++
|
||||
v, err := bs.Marshal(us)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = b.Put([]byte(username), v); err != nil {
|
||||
return err
|
||||
}
|
||||
e = errors.New("db: wrong login")
|
||||
return nil
|
||||
}
|
||||
us.Locked = 0
|
||||
v, err := bs.Marshal(us)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return b.Put([]byte(username), v)
|
||||
})
|
||||
if e != nil {
|
||||
return e
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
return db.users.Set(username, &core.User{
|
||||
Username: username,
|
||||
Password: string(hash),
|
||||
Admin: admin,
|
||||
})
|
||||
}
|
||||
|
||||
func (bs *BoltStore) UnlockUser(username string) error {
|
||||
return bs.db.Update(func(tx *bolt.Tx) error {
|
||||
u, err := bs.GetUser(username)
|
||||
func (db *DB) Login(username, password string) (err error) {
|
||||
var u core.User
|
||||
u, err = db.GetUser(username)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if u.Locked == 3 {
|
||||
return errors.New("db: user locked")
|
||||
}
|
||||
if err = bcrypt.CompareHashAndPassword([]byte(u.Password), validatePassword(password)); err != nil {
|
||||
u.Locked++
|
||||
err = db.users.Set(username, u)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if u.Locked < 3 {
|
||||
return nil
|
||||
return
|
||||
}
|
||||
return errors.New("db: wrong login")
|
||||
}
|
||||
if u.Locked > 0 {
|
||||
u.Locked = 0
|
||||
v, err := bs.Marshal(u)
|
||||
err = db.users.Set(username, u)
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
return tx.Bucket([]byte(userTable)).Put([]byte(username), v)
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (bs *BoltStore) UpdateUserPassword(username, password string) error {
|
||||
return bs.db.Update(func(tx *bolt.Tx) error {
|
||||
if password != "" {
|
||||
us, err := bs.GetUser(username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
us.Password = string(hash)
|
||||
v, err := bs.Marshal(us)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Bucket([]byte(userTable)).Put([]byte(username), v)
|
||||
func (db *DB) UnlockUser(username string) (err error) {
|
||||
var u core.User
|
||||
u, err = db.GetUser(username)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if u.Locked > 0 {
|
||||
u.Locked = 0
|
||||
err = db.users.Set(username, u)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (bs *BoltStore) AdminUpdateUser(username, password string, admin bool) error {
|
||||
func (db *DB) UpdateUserPassword(username, password string) error {
|
||||
u, err := db.GetUser(username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.Password = string(hash)
|
||||
return db.users.Set(username, u)
|
||||
}
|
||||
|
||||
func (db *DB) AdminUpdateUser(username, password string, admin bool) error {
|
||||
if username == defUser && !admin {
|
||||
return errors.New("user '" + defUser + "' cannot lose admin privileges")
|
||||
}
|
||||
return bs.db.Update(func(tx *bolt.Tx) error {
|
||||
us, err := bs.GetUser(username)
|
||||
u, err := db.GetUser(username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.Admin = admin
|
||||
if password != "" {
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
us.Admin = admin
|
||||
if password != "" {
|
||||
hash, err := bcrypt.GenerateFromPassword(validatePassword(password), bcryptCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
us.Password = string(hash)
|
||||
}
|
||||
v, err := bs.Marshal(us)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Bucket([]byte(userTable)).Put([]byte(username), v)
|
||||
})
|
||||
u.Password = string(hash)
|
||||
}
|
||||
return db.users.Set(username, u)
|
||||
}
|
||||
|
||||
func (bs *BoltStore) DeleteUser(username string) error {
|
||||
func (db *DB) DeleteUser(username string) error {
|
||||
if username == defUser {
|
||||
return errors.New("user '" + defUser + "' cannot be deleted")
|
||||
}
|
||||
if err := bs.UserExists(username); err != nil {
|
||||
return err
|
||||
}
|
||||
return bs.db.Update(func(tx *bolt.Tx) error {
|
||||
return tx.Bucket([]byte(userTable)).Delete([]byte(username))
|
||||
})
|
||||
return db.users.Delete(username)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue