upgraded bootstrap, fixed style, added share blacklisting
This commit is contained in:
parent
85f93bae69
commit
3fb1cfc17d
37 changed files with 811 additions and 892 deletions
|
|
@ -1,11 +1,11 @@
|
|||
// Copyright (C) 2017 Marius Schellenberger
|
||||
// Copyright (C) 2018 Marius Schellenberger
|
||||
|
||||
package server
|
||||
|
||||
import (
|
||||
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
||||
"git.giftfish.de/ston1th/gowiki/pkg/log"
|
||||
"git.giftfish.de/ston1th/gowiki/pkg/util"
|
||||
"git.giftfish.de/ston1th/gowiki/pkg/render"
|
||||
"git.giftfish.de/ston1th/jwt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
|
@ -122,14 +122,15 @@ func searchHandler(ctx *Context) {
|
|||
return
|
||||
}
|
||||
|
||||
res, err := ctx.Srv.DB.Index.Search(search)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
//TODO
|
||||
//res, err := ctx.Srv.DB.Index.Search(search)
|
||||
//if err != nil {
|
||||
// ctx.Data.Msg = err.Error()
|
||||
// ctx.Exec()
|
||||
// return
|
||||
//}
|
||||
//ctx.Data.Data = res
|
||||
ctx.Data.Search = search
|
||||
ctx.Data.Data = res
|
||||
ctx.Exec()
|
||||
}
|
||||
}
|
||||
|
|
@ -150,15 +151,17 @@ func pageNewHandler(ctx *Context) {
|
|||
ctx.Data = webData{Title: "New Page"}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.Data.Data = core.Page{Perm: core.Public}
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
section := ctx.Form("section")
|
||||
title := ctx.Form("title")
|
||||
title := render.Title(ctx.Form("title"))
|
||||
markdown := ctx.Form("markdown")
|
||||
perm := ctx.Form("perm")
|
||||
perm := core.ParsePermString(ctx.Form("perm"))
|
||||
p := core.Page{
|
||||
Title: title,
|
||||
Markdown: markdown,
|
||||
Perm: perm,
|
||||
}
|
||||
ctx.Data.Data = p
|
||||
if !ctx.CheckXsrf(nil) {
|
||||
|
|
@ -167,7 +170,7 @@ func pageNewHandler(ctx *Context) {
|
|||
if section != core.WikiSection {
|
||||
section = ctx.User()
|
||||
}
|
||||
page, err := ctx.Srv.DB.CreatePage(title, section, markdown, ctx.User(), core.ParsePermString(perm))
|
||||
page, err := ctx.Srv.DB.CreatePage(title, section, markdown, ctx.User(), perm)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
|
|
@ -208,7 +211,7 @@ func pageHandler(ctx *Context) {
|
|||
ctx.Template("pageHandler")
|
||||
}
|
||||
}
|
||||
page, err := ctx.Srv.DB.GetPage(util.StoreTitle(section, title), user)
|
||||
page, err := ctx.Srv.DB.GetPage(render.StoreTitle(section, title), user)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
ctx.NotFound()
|
||||
|
|
@ -227,91 +230,135 @@ func pageMDHandler(f ctxHandler) ctxHandler {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO add share token blacklisting
|
||||
func pageShareHandler(ctx *Context) {
|
||||
ctx.Template("pageShareHandler")
|
||||
ctx.Data = webData{}
|
||||
section := ctx.Var("section")
|
||||
title := ctx.Var("title")
|
||||
title := render.Title(ctx.Var("title"))
|
||||
user := ctx.User()
|
||||
st := util.StoreTitle(section, title)
|
||||
st := render.StoreTitle(section, title)
|
||||
page, err := ctx.Srv.DB.GetPage(st, user)
|
||||
if err != nil {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
t := jwt.NewToken(map[string]interface{}{
|
||||
sharedClaim: user,
|
||||
sectionClaim: section,
|
||||
titleClaim: title,
|
||||
jwt.ExpClaim: jwt.NewExp(time.Hour * 24),
|
||||
}, nil)
|
||||
|
||||
if err = ctx.Srv.JWT.Sign(t); err != nil {
|
||||
log.Println("SignToken:", err)
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
/* TODO
|
||||
host := ctx.Request.Header.Get("X-Forwarded-For")
|
||||
if host == "" {
|
||||
ctx.Request.Host
|
||||
}
|
||||
ctx.Data.Data = "https://" + host + "/view/" + t.String()
|
||||
*/
|
||||
ctx.Data.Key = t.String()
|
||||
ctx.Data.Data = st
|
||||
ctx.Data.Title = page.Title
|
||||
ctx.Data.BodyTitle = page.Title
|
||||
ctx.Exec()
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
duration := ctx.Form("duration")
|
||||
if !ctx.CheckXsrf(nil) {
|
||||
return
|
||||
}
|
||||
d, err := time.ParseDuration(duration)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
t := jwt.NewToken(map[string]interface{}{
|
||||
sharedClaim: user,
|
||||
sectionClaim: section,
|
||||
titleClaim: title,
|
||||
jwt.ExpClaim: jwt.NewExp(d),
|
||||
}, nil)
|
||||
|
||||
if err = ctx.Srv.JWT.Sign(t); err != nil {
|
||||
log.Println("SignToken:", err)
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
ctx.Data.Key = t.String()
|
||||
ctx.Exec()
|
||||
}
|
||||
}
|
||||
|
||||
func pageBlacklistHandler(ctx *Context) {
|
||||
ctx.Template("pageBlacklistHandler")
|
||||
ctx.Data = webData{
|
||||
Title: "Blacklist",
|
||||
BodyTitle: "Blacklist",
|
||||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
if !ctx.CheckXsrf(nil) {
|
||||
return
|
||||
}
|
||||
t, err := jwt.DecodeToken(ctx.Form("share"))
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
err = ctx.Srv.JWT.Verify(t)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
user := t.Claims.GetString(sharedClaim)
|
||||
if user == "" {
|
||||
ctx.Data.Msg = "blacklisting denied: no share token"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
if ctx.User() != user {
|
||||
ctx.Data.Msg = "blacklisting denied: token was issued by " + user
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
err = ctx.Srv.JWT.Invalidate(t)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Exec()
|
||||
}
|
||||
}
|
||||
|
||||
func pageEditHandler(ctx *Context) {
|
||||
ctx.Template("pageEditHandler")
|
||||
ctx.Data = webData{}
|
||||
section := ctx.Var("section")
|
||||
title := ctx.Var("title")
|
||||
page, err := ctx.Srv.DB.GetPage(util.StoreTitle(section, title), ctx.User())
|
||||
title := render.Title(ctx.Var("title"))
|
||||
page, err := ctx.Srv.DB.GetPage(render.StoreTitle(section, title), ctx.User())
|
||||
if err != nil {
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
ctx.Data.Title = page.Title
|
||||
ctx.Data.BodyTitle = page.Title
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.Data.Data = page
|
||||
ctx.Data.Title = page.Title
|
||||
ctx.Data.BodyTitle = page.Title
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
storeTitle := ctx.Form("store_title")
|
||||
section, title = util.UnstoreTitle(storeTitle)
|
||||
markdown := ctx.Form("markdown")
|
||||
perm := core.ParsePermString(ctx.Form("perm"))
|
||||
ctx.Data.Data = core.Page{
|
||||
Title: page.Title,
|
||||
StoreTitle: storeTitle,
|
||||
Markdown: markdown,
|
||||
Perm: perm,
|
||||
}
|
||||
ctx.Data.Title = page.Title
|
||||
ctx.Data.BodyTitle = page.Title
|
||||
page.Markdown = ctx.Form("markdown")
|
||||
page.Perm = core.ParsePermString(ctx.Form("perm"))
|
||||
ctx.Data.Data = page
|
||||
if !ctx.CheckXsrf(nil) {
|
||||
return
|
||||
}
|
||||
err = ctx.Srv.DB.UpdatePage(title, section, markdown, ctx.User(), perm)
|
||||
err = ctx.Srv.DB.UpdatePage(title, section, page.Markdown, ctx.User(), page.Perm)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Redirect("/"+page.StoreTitle, 302)
|
||||
ctx.Redirect(page.StoreTitle, 302)
|
||||
}
|
||||
}
|
||||
|
||||
func pageDelHandler(ctx *Context) {
|
||||
section := ctx.Var("section")
|
||||
title := ctx.Var("title")
|
||||
st := util.StoreTitle(section, title)
|
||||
title := render.Title(ctx.Var("title"))
|
||||
st := render.StoreTitle(section, title)
|
||||
ctx.Template("pageDelHandler")
|
||||
ctx.Data.Data = st
|
||||
ctx.Data.Title = title
|
||||
|
|
@ -473,6 +520,7 @@ func userDelHandler(ctx *Context) {
|
|||
}
|
||||
|
||||
func logoutHandler(ctx *Context) {
|
||||
ctx.Srv.JWT.Invalidate(&ctx.Token)
|
||||
ctx.SetCookie(nil)
|
||||
ctx.Redirect(core.IndexURI, 302)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue