added prefix scan and fixed logout issue

This commit is contained in:
ston1th 2019-07-06 11:31:12 +02:00
commit 8143e484cd
12 changed files with 99 additions and 77 deletions

View file

@ -21,15 +21,13 @@ func (db *DB) Check(sig string) (ok bool) {
func (db *DB) Map() (list jwt.BlacklistMap, err error) {
list = make(jwt.BlacklistMap)
err = db.store.ForEach(func(k string, v []byte) error {
if trim, ok := hasTrimPrefix(k, blacklistPrefix); ok {
var exp int64
err := db.store.Unmarshal(v, &exp)
if err != nil {
return err
}
list[trim] = exp
err = db.store.ForEachPrefix(blacklistPrefix, func(k string, v []byte) error {
var exp int64
err := db.store.Unmarshal(v, &exp)
if err != nil {
return err
}
list[k] = exp
return nil
})
return

View file

@ -96,12 +96,10 @@ func (db *DB) Restore(r io.Reader) (err error) {
if err != nil {
return
}
err = db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
p := new(core.Page)
db.store.Get(pagePrefix+trim, p)
db.Index.Add(p.Title, p.StoreTitle, render.Render(p))
}
err = db.store.ForEachPrefix(pagePrefix, func(k string, _ []byte) error {
p := new(core.Page)
db.store.Get(pagePrefix+k, p)
db.Index.Add(p.Title, p.StoreTitle, render.Render(p))
return nil
})
return

View file

@ -20,14 +20,6 @@ var reservedNames = []string{
"view",
}
// Parts taken from strings.TrimPrefix
func hasTrimPrefix(s, prefix string) (string, bool) {
if len(s) >= len(prefix) && s[0:len(prefix)] == prefix {
return s[len(prefix):], true
}
return s, false
}
func validatePassword(pw string) (b []byte) {
b = []byte(pw)
if len(pw) <= 56 {

View file

@ -21,10 +21,8 @@ var migrators = []migrator{
version = 1
// recreate all pages with new format
var pages []string
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
pages = append(pages, trim)
}
db.store.ForEachPrefix(pagePrefix, func(k string, _ []byte) error {
pages = append(pages, k)
return nil
})
var p core.Page

View file

@ -24,19 +24,17 @@ var (
func (db *DB) GetAllSections(username string, admin bool) (sections core.SectionPages) {
m := make(map[string]core.UpdatedPages)
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
if trim == core.IndexURI {
return nil
}
p, err := db.getPage(trim, username)
if err == nil {
s := trim[:strings.Index(trim, "/")]
if _, ok := m[s]; !ok {
m[s] = core.UpdatedPages{}
}
m[s] = append(m[s], *p)
db.store.ForEachPrefix(pagePrefix, func(k string, _ []byte) error {
if k == core.IndexURI {
return nil
}
p, err := db.getPage(k, username)
if err == nil {
s := k[:strings.Index(k, "/")]
if _, ok := m[s]; !ok {
m[s] = core.UpdatedPages{}
}
m[s] = append(m[s], *p)
}
return nil
})
@ -67,18 +65,16 @@ func (db *DB) GetAllSectionPages(section, username string, admin bool) (pages co
if err != nil {
return
}
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
if !strings.HasPrefix(trim, section+"/") {
return nil
}
if trim == core.IndexURI {
return nil
}
p, err := db.getPage(trim, username)
if err == nil {
pages = append(pages, *p)
}
db.store.ForEachPrefix(pagePrefix, func(k string, _ []byte) error {
if !strings.HasPrefix(k, section+"/") {
return nil
}
if k == core.IndexURI {
return nil
}
p, err := db.getPage(k, username)
if err == nil {
pages = append(pages, *p)
}
return nil
})

View file

@ -17,12 +17,10 @@ var (
)
func (db *DB) GetSections() (secs core.Sections, err error) {
err = db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, sectionPrefix); ok {
s, err := db.GetSection(trim)
if err == nil {
secs = append(secs, s)
}
err = db.store.ForEachPrefix(sectionPrefix, func(k string, _ []byte) error {
s, err := db.GetSection(k)
if err == nil {
secs = append(secs, s)
}
return nil
})
@ -96,11 +94,9 @@ func (db *DB) DeleteSection(section string) error {
}
section += "/"
var pages []string
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
if strings.HasPrefix(trim, section) {
pages = append(pages, trim)
}
db.store.ForEachPrefix(pagePrefix, func(k string, _ []byte) error {
if strings.HasPrefix(k, section) {
pages = append(pages, k)
}
return nil
})

View file

@ -16,6 +16,9 @@ import (
const userPrefix = "user/"
var (
errUserLocked = errors.New("db: user locked")
errUserLogin = errors.New("db: wrong login")
errUserPin = errors.New("db: wrong pin")
errUserNotFound = errors.New("db: user not found")
errUserExists = errors.New("db: user already exist")
errNameReserved = errors.New("db: name is reserved")
@ -24,13 +27,11 @@ var (
)
func (db *DB) GetUsers() (users core.Users, err error) {
err = db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, userPrefix); ok {
u, err := db.GetUser(trim)
u.Password = ""
if err == nil {
users = append(users, u)
}
err = db.store.ForEachPrefix(userPrefix, func(k string, _ []byte) error {
u, err := db.GetUser(k)
u.Password = ""
if err == nil {
users = append(users, u)
}
return nil
})
@ -94,7 +95,7 @@ func (db *DB) Login(username, password string) (u core.User, err error) {
return
}
if u.Locked == 3 {
err = errors.New("db: user locked")
err = errUserLocked
return
}
if err = bcrypt.CompareHashAndPassword([]byte(u.Password), validatePassword(password)); err != nil {
@ -103,7 +104,7 @@ func (db *DB) Login(username, password string) (u core.User, err error) {
if err != nil {
return
}
err = errors.New("db: wrong login")
err = errUserLogin
return
}
if u.Locked > 0 {
@ -122,7 +123,7 @@ func (db *DB) Totp(username, pin string) (u core.User, err error) {
return
}
if u.Locked == 3 {
err = errors.New("db: user locked")
err = errUserLocked
return
}
if !otp.Validate(pin, u.Secret) {
@ -131,7 +132,7 @@ func (db *DB) Totp(username, pin string) (u core.User, err error) {
if err != nil {
return
}
err = errors.New("db: wrong pin")
err = errUserPin
return
}
if u.Locked > 0 {