upgraded bootstrap, fixed style, added share blacklisting

This commit is contained in:
ston1th 2018-09-14 20:49:50 +02:00
commit 3fb1cfc17d
37 changed files with 811 additions and 892 deletions

View file

@ -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)
}