working sections version
This commit is contained in:
parent
16ea95bf09
commit
9424084a36
28 changed files with 367 additions and 251 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue