first working version

This commit is contained in:
ston1th 2018-09-14 00:14:49 +02:00
commit 85f93bae69
32 changed files with 863 additions and 571 deletions

View file

@ -8,7 +8,6 @@ import (
"git.giftfish.de/ston1th/gowiki/pkg/core"
"git.giftfish.de/ston1th/gowiki/pkg/index"
"git.giftfish.de/ston1th/gowiki/pkg/store"
"git.giftfish.de/ston1th/gowiki/pkg/util"
)
const (
@ -17,11 +16,9 @@ const (
usersFile = "users.db"
pagesFile = "pages.db"
bcryptCost = 13
indexName = "Index"
welcome = `# Welcome to GoWiki
This is the [Index](/wiki/Index) page.
You can customize it how you like.`
wikiSection = "wiki"
)
/*const (
@ -40,12 +37,13 @@ type DB struct {
Index *index.Index
}
func NewDB(indexPath string) (db *DB, err error) {
func New(indexPath string) (db *DB, err error) {
db = &DB{cache: cache.NewCache()}
db.Index, err = index.NewIndex(indexPath)
if err != nil {
return
}
//TODO
//db.Index, err = index.NewIndex(indexPath)
//if err != nil {
// return
//}
db.users, err = store.NewBoltStore(usersFile, nil)
if err != nil {
@ -66,11 +64,9 @@ func NewDB(indexPath string) (db *DB, err error) {
if err != nil {
return
}
if _, err = db.pageExists(util.StoreTitle(wikiSection, indexName), defUser); err != nil {
_, err = db.CreatePage(indexName, wikiSection, welcome, defUser, core.Public)
if err != nil {
return
}
_, err = db.CreatePage(core.IndexPage, core.WikiSection, welcome, defUser, core.Public)
if err != nil && err != store.ErrKeyNotFound {
return
}
return
}
@ -84,5 +80,7 @@ func (db *DB) Close() error {
if err != nil {
return err
}
return db.Index.Close()
return nil
//TODO
//return db.Index.Close()
}

View file

@ -5,6 +5,26 @@ import (
"time"
)
var reservedUsers = []string{
"all",
"login",
"logout",
"new",
"search",
"user",
"view",
"wiki",
}
func reservedUser(username string) bool {
for _, v := range reservedUsers {
if username == v {
return true
}
}
return false
}
func validatePassword(pw string) (b []byte) {
b = []byte(pw)
if len(pw) <= 56 {

View file

@ -5,20 +5,38 @@ import (
"git.giftfish.de/ston1th/gowiki/pkg/render"
"git.giftfish.de/ston1th/gowiki/pkg/store"
"git.giftfish.de/ston1th/gowiki/pkg/util"
"sort"
)
var (
errPageNotFound = store.ErrKeyNotFound
errPermissionDenied = dbErr("permission denied")
errInvalidPermission = dbErr("invalid permission")
errPrivateWikiPage = dbErr("private wiki pages are not allowed")
errDeleteIndexPage = dbErr("index page can not be deleted")
)
func (db *DB) GetAllPages(username string) (pages core.Pages) {
db.pages.ForEach(func(title string, _ []byte) error {
if title == core.IndexURI {
return nil
}
p, err := db.GetPage(title, username)
if err == nil {
pages = append(pages, *p)
}
return nil
})
sort.Sort(pages)
return
}
func (db *DB) GetPage(title, username string) (p *core.Page, err error) {
p = db.cache.Get(title)
if p == nil {
p = new(core.Page)
err = db.pages.Get(title, p)
p, err = db.getPage(title, username)
db.cache.Add(title, p)
return
}
if !core.ReadPerm(username, p) {
err = errPageNotFound
@ -26,7 +44,7 @@ func (db *DB) GetPage(title, username string) (p *core.Page, err error) {
return
}
func (db *DB) pageExists(title, username string) (p *core.Page, err error) {
func (db *DB) getPage(title, username string) (p *core.Page, err error) {
p = new(core.Page)
err = db.pages.Get(title, p)
if err != nil {
@ -43,78 +61,98 @@ func (db *DB) CreatePage(title, section, markdown, username string, p core.Permi
err = errInvalidPermission
return
}
if section == wikiSection && p == core.Private {
if section == core.WikiSection && p == core.Private {
err = errPrivateWikiPage
return
}
st := util.StoreTitle(section, title)
if _, err = db.pageExists(st, username); err != nil {
if _, err = db.getPage(st, username); err != nil && err != store.ErrKeyNotFound {
return
}
page = &core.Page{
Title: title,
Markdown: markdown,
Created: created(username),
Owner: username,
Perm: p,
Title: title,
StoreTitle: st,
Markdown: markdown,
Created: created(username),
Owner: username,
Perm: p,
}
search := render.Render(page)
//search := render.Render(page)
render.Render(page)
err = db.pages.Set(st, page)
if err != nil {
return
}
err = db.Index.Add(title, st, search)
if err != nil {
return
}
//TODO
//err = db.Index.Add(title, st, search)
//if err != nil {
// return
//}
db.cache.Add(st, page)
return
}
func (db *DB) UpdatePage(title, section, markdown, username string, perm int) (page *core.Page, err error) {
p := core.ParsePerm(perm)
func (db *DB) UpdatePage(title, section, markdown, username string, p core.Permission) (err error) {
if p == core.Invalid {
err = errInvalidPermission
return
}
if section == wikiSection && p == core.Private {
if section == core.WikiSection && p == core.Private {
err = errPrivateWikiPage
return
}
st := util.StoreTitle(section, title)
page, err = db.pageExists(st, username)
page, err := db.getPage(st, username)
if err != nil {
return
}
if !core.WritePerm(username, section, page) {
return errPermissionDenied
}
page.Markdown = markdown
page.Updated = created(username)
page.Perm = p
search := render.Render(page)
//TODO
//search := render.Render(page)
render.Render(page)
err = db.pages.Set(st, page)
if err != nil {
return
}
err = db.Index.Add(title, st, search)
if err != nil {
return
}
//TODO
//err = db.Index.Add(title, st, search)
//if err != nil {
// return
//}
db.cache.Add(st, page)
return
}
func (db *DB) DeletePage(title, section, username string) (err error) {
st := util.StoreTitle(section, title)
if _, err = db.pageExists(st, username); err != nil {
var page *core.Page
if section == core.WikiSection && title == core.IndexPage {
err = errDeleteIndexPage
return
}
st := util.StoreTitle(section, title)
if page, err = db.getPage(st, username); err != nil {
return
}
if !core.WritePerm(username, section, page) {
return errPermissionDenied
}
if err = db.pages.Delete(st); err != nil {
return
}
return db.Index.Delete(st)
db.cache.Delete(st)
return nil
//TODO
//return db.Index.Delete(st)
}

View file

@ -4,19 +4,24 @@ import (
"errors"
"git.giftfish.de/ston1th/gowiki/pkg/core"
"golang.org/x/crypto/bcrypt"
"sort"
)
var (
errUserNotFound = dbErr("user not found")
errUserExists = dbErr("user already exist")
errUserReserved = dbErr("username is reserved")
)
func (db *DB) GetUsers() (users []core.User, err error) {
// TODO
/*users, err = db.DumpUsers()
for i := range users {
users[i].Password = ""
}*/
func (db *DB) GetUsers() (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)
}
return nil
})
sort.Sort(users)
return
}
@ -81,6 +86,9 @@ func (bs *BoltStore) RestoreUsers(users []User) error {
}*/
func (db *DB) CreateUser(username, password string, admin bool) error {
if reservedUser(username) {
return errUserReserved
}
if err := db.UserExists(username); err == nil {
return errUserExists
}