working sections version

This commit is contained in:
ston1th 2019-03-27 23:08:59 +01:00
commit 9424084a36
28 changed files with 367 additions and 251 deletions

View file

@ -68,7 +68,8 @@ func New(cfg core.Config) (db *DB, err error) {
if err != nil {
return
}
return db.RunMigrations()
err = db.RunMigrations()
return
}
func (db *DB) Dump(w io.Writer) error {

View file

@ -4,7 +4,6 @@ package db
import (
"crypto/sha256"
"git.giftfish.de/ston1th/gowiki/pkg/core"
"time"
)
@ -14,10 +13,11 @@ var reservedNames = []string{
"logout",
"new",
"search",
"section",
"sections",
"user",
"users",
"view",
"wiki",
}
// Parts taken from strings.TrimPrefix
@ -28,20 +28,6 @@ func hasTrimPrefix(s, prefix string) (string, bool) {
return s, false
}
func addOrRemove(s string, a []string) []string {
i, _ := core.Contains(s, a)
switch i {
case -1:
return append(a, s)
case 0:
return a[1:]
case len(a):
return a[:i]
default:
return append(a[:i], a[i+1:]...)
}
}
func validatePassword(pw string) (b []byte) {
b = []byte(pw)
if len(pw) <= 56 {

View file

@ -3,11 +3,12 @@ package db
import (
"git.giftfish.de/ston1th/gowiki/pkg/core"
"git.giftfish.de/ston1th/gowiki/pkg/log"
"git.giftfish.de/ston1th/gowiki/pkg/store"
)
const (
versionKey = "version/version"
currentVersion = 2
currentVersion = 1
)
type migrator func(*DB) (int, error)
@ -18,10 +19,6 @@ var migrators = []migrator{
},
func(db *DB) (version int, err error) {
version = 1
return
},
func(db *DB) (version int, err error) {
version = 2
// recreate all pages with new format
var pages []string
db.store.ForEach(func(k string, _ []byte) error {
@ -38,12 +35,25 @@ var migrators = []migrator{
log.Printf("db: migrator[%d]: pageGet %s: %s", version, k, err)
continue
}
if p.Perm == 3 {
p.Perm = core.Private
}
err = db.store.Set(k, &p)
if err != nil {
log.Printf("db: migrator[%d]: pageSet %s: %s", version, k, err)
continue
}
}
users, err := db.GetUsers()
if err != nil {
return
}
for _, u := range users {
err = db.CreateSection(u.Username, []string{u.Username}, true)
if err != nil {
log.Printf("db: migrator[%d]: userSection %s: %s", version, u.Username, err)
}
}
return
},
}
@ -51,16 +61,21 @@ var migrators = []migrator{
func (db *DB) RunMigrations() (err error) {
var version int
err = db.store.Get(versionKey, &version)
if err == ErrKeyNotFound {
err = db.store.Set(versionKey, 0)
if err == store.ErrKeyNotFound {
err = db.store.Set(versionKey, currentVersion)
if err != nil {
return
}
err = db.store.Get(versionKey, &version)
if err != nil {
return
}
}
log.Printf("db: detected database version %d", version)
log.Printf("db: database version %d", version)
for version < currentVersion {
log.Printf("db: running migration %d", version)
version, err = migrators[version](db)
v := version + 1
log.Printf("db: running migration %d", v)
version, err = migrators[v](db)
if err != nil {
return
}
@ -69,4 +84,5 @@ func (db *DB) RunMigrations() (err error) {
return
}
}
return
}

View file

@ -21,7 +21,7 @@ var (
errDeleteIndexPage = errors.New("db: index page can not be deleted")
)
func (db *DB) GetAllSections(username string) (sections core.SectionPages) {
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 {
@ -39,6 +39,16 @@ func (db *DB) GetAllSections(username string) (sections core.SectionPages) {
}
return nil
})
if admin {
secs, err := db.GetSections()
if err == nil {
for _, s := range secs {
if _, ok := m[s.Name]; !ok {
m[s.Name] = core.UpdatedPages{}
}
}
}
}
for s, p := range m {
sort.Sort(p)
l := len(p)
@ -51,7 +61,11 @@ func (db *DB) GetAllSections(username string) (sections core.SectionPages) {
return
}
func (db *DB) GetAllSectionPages(section, username string) (pages core.Pages, err error) {
func (db *DB) GetAllSectionPages(section, username string, admin bool) (pages core.Pages, err error) {
err = db.SectionExists(section)
if err != nil {
return
}
db.store.ForEach(func(k string, _ []byte) error {
if trim, ok := hasTrimPrefix(k, pagePrefix); ok {
if !strings.HasPrefix(trim, section+"/") {
@ -67,7 +81,7 @@ func (db *DB) GetAllSectionPages(section, username string) (pages core.Pages, er
}
return nil
})
if len(pages) == 0 {
if len(pages) == 0 && !admin {
err = errPageNotFound
return
}
@ -128,6 +142,14 @@ func (db *DB) CreatePage(title, section, markdown, username string, p core.Permi
if err != store.ErrKeyNotFound {
return
}
s, err := db.GetSection(section)
if err != nil {
return
}
if _, ok := core.Contains(username, s.Members); !ok {
err = errPermissionDenied
return
}
page = &core.Page{
Title: title,

View file

@ -4,6 +4,7 @@ package db
import (
"git.giftfish.de/ston1th/gowiki/pkg/core"
"git.giftfish.de/ston1th/gowiki/pkg/log"
"git.giftfish.de/ston1th/gowiki/pkg/render"
)
@ -11,6 +12,7 @@ func (db *DB) ReadPerm(st, username string, p core.Permission) bool {
section, _ := render.SplitStoreTitle(st)
s, err := db.GetSection(section)
if err != nil {
log.Debugf("db: read: %s", err)
return false
}
return core.ReadPerm(username, p, s)
@ -20,6 +22,7 @@ func (db *DB) WritePerm(st, username string, p core.Permission) bool {
section, _ := render.SplitStoreTitle(st)
s, err := db.GetSection(section)
if err != nil {
log.Debugf("db: read: %s", err)
return false
}
return core.WritePerm(username, p, s)

View file

@ -30,6 +30,20 @@ func (db *DB) GetSections() (secs core.Sections, err error) {
return
}
func (db *DB) GetUserSections(username string) (sections map[string]bool, err error) {
sections = make(map[string]bool)
secs, err := db.GetSections()
if err != nil {
return
}
for _, s := range secs {
if _, ok := core.Contains(username, s.Members); ok {
sections[s.Name] = false
}
}
return
}
func (db *DB) GetSection(section string) (s core.Section, err error) {
err = db.store.Get(sectionPrefix+section, &s)
return
@ -68,11 +82,11 @@ func (db *DB) UpdateSection(section string, members []string, user bool) error {
return db.store.Set(sectionPrefix+section, &core.Section{section, user, m})
}
func (db *DB) DeleteSection(section string, user bool) error {
func (db *DB) DeleteSection(section string) error {
if section == core.WikiSection {
return errors.New("section '" + core.WikiSection + "' cannot be deleted")
}
s, err := db.GetSection(section)
err := db.SectionExists(section)
if err != nil {
return err
}
@ -80,9 +94,6 @@ func (db *DB) DeleteSection(section string, user bool) error {
if err != nil {
return err
}
if !s.User && !user {
return nil
}
section += "/"
var pages []string
db.store.ForEach(func(k string, _ []byte) error {

View file

@ -220,5 +220,5 @@ func (db *DB) DeleteUser(username string) error {
if err != nil {
return err
}
return db.DeleteSection(username, true)
return db.DeleteSection(username)
}