single db with prefixes, dump/restore, blacklisting on user deletion

This commit is contained in:
ston1th 2018-09-23 23:56:12 +02:00
commit d4971cda89
20 changed files with 264 additions and 163 deletions

View file

@ -5,10 +5,16 @@ package db
import (
"errors"
"git.giftfish.de/ston1th/gowiki/pkg/core"
"git.giftfish.de/ston1th/gowiki/pkg/log"
"git.giftfish.de/ston1th/jwt/v3"
"golang.org/x/crypto/bcrypt"
"sort"
"strconv"
"strings"
)
const userPrefix = "user/"
var (
errUserNotFound = dbErr("user not found")
errUserExists = dbErr("user already exist")
@ -16,10 +22,12 @@ var (
)
func (db *DB) DumpUsers() (users core.Users, err error) {
db.users.ForEach(func(username string, _ []byte) error {
u, err := db.GetUser(username)
if err == nil {
users = append(users, u)
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, userPrefix); ok {
u, err := db.GetUser(trim)
if err == nil {
users = append(users, u)
}
}
return nil
})
@ -42,12 +50,12 @@ func (db *DB) GetUserWithoutPassword(username string) (u core.User, err error) {
}
func (db *DB) GetUser(username string) (u core.User, err error) {
err = db.users.Get(username, &u)
err = db.store.Get(userPrefix+username, &u)
return
}
func (db *DB) UserExists(username string) error {
return db.users.Get(username, nil)
return db.store.Get(userPrefix+username, nil)
}
// TODO
@ -85,9 +93,10 @@ func (db *DB) CreateUser(username, password string, admin bool) error {
if err != nil {
return err
}
return db.users.Set(username, &core.User{
return db.store.Set(userPrefix+username, &core.User{
Username: username,
Password: string(hash),
Created: strconv.Itoa(int(jwt.Now())),
Admin: admin,
})
}
@ -103,7 +112,7 @@ func (db *DB) Login(username, password string) (u core.User, err error) {
}
if err = bcrypt.CompareHashAndPassword([]byte(u.Password), validatePassword(password)); err != nil {
u.Locked++
err = db.users.Set(username, u)
err = db.store.Set(userPrefix+username, u)
if err != nil {
return
}
@ -112,7 +121,7 @@ func (db *DB) Login(username, password string) (u core.User, err error) {
}
if u.Locked > 0 {
u.Locked = 0
err = db.users.Set(username, u)
err = db.store.Set(userPrefix+username, u)
if err != nil {
return
}
@ -128,7 +137,7 @@ func (db *DB) UnlockUser(username string) (err error) {
}
if u.Locked > 0 {
u.Locked = 0
err = db.users.Set(username, u)
err = db.store.Set(userPrefix+username, u)
if err != nil {
return
}
@ -146,7 +155,7 @@ func (db *DB) UpdateUserPassword(username, password string) error {
return err
}
u.Password = string(hash)
return db.users.Set(username, u)
return db.store.Set(userPrefix+username, u)
}
func (db *DB) AdminUpdateUser(username, password string, admin bool) error {
@ -165,13 +174,40 @@ func (db *DB) AdminUpdateUser(username, password string, admin bool) error {
}
u.Password = string(hash)
}
return db.users.Set(username, u)
return db.store.Set(userPrefix+username, u)
}
//TODO delete all user owned pages
func (db *DB) DeleteUser(username string) error {
if username == defUser {
return errors.New("user '" + defUser + "' cannot be deleted")
}
return db.users.Delete(username)
u, err := db.GetUser(username)
if err != nil {
return err
}
err = db.store.Delete(userPrefix + username)
if err != nil {
return err
}
err = db.lockout(username, u.Created)
if err != nil {
return err
}
username += "/"
var pages []string
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
if strings.HasPrefix(trim, username) {
pages = append(pages, trim)
}
}
return nil
})
for _, p := range pages {
err := db.deletePage(p)
if err != nil {
log.Debugf("DeleteUser %s, %s", username, err)
}
}
return nil
}