major changes
This commit is contained in:
parent
a3270f399d
commit
2b56832843
83 changed files with 7760 additions and 1244 deletions
184
handler.go
184
handler.go
|
|
@ -4,39 +4,16 @@ package main
|
|||
|
||||
import (
|
||||
"html/template"
|
||||
"net"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"time"
|
||||
)
|
||||
|
||||
func webserver(l net.Listener) {
|
||||
cookieStore()
|
||||
loadTemplates()
|
||||
srv := &http.Server{
|
||||
Handler: buildRoutes(),
|
||||
}
|
||||
log.Fatal("webserver: ", srv.Serve(l))
|
||||
type notFoundHandler struct {
|
||||
s *HTTPServer
|
||||
}
|
||||
|
||||
type notFoundHandler struct{}
|
||||
|
||||
func (notFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
f := func(ctx *Context) {
|
||||
ctx.Template("notFoundHandler")
|
||||
ctx.Data = webData{
|
||||
Title: "404",
|
||||
}
|
||||
ctx.Exec()
|
||||
}
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
f(newContext(w, r))
|
||||
}
|
||||
|
||||
func contextWrapper(h ctxHandler) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
h(newContext(w, r))
|
||||
}
|
||||
func (nf *notFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
newContext(w, r, nf.s).NotFound()
|
||||
}
|
||||
|
||||
func adminAuthHandler(h ctxHandler) ctxHandler {
|
||||
|
|
@ -45,7 +22,7 @@ func adminAuthHandler(h ctxHandler) ctxHandler {
|
|||
h(ctx)
|
||||
return
|
||||
}
|
||||
ctx.Redirect("/404", 302)
|
||||
ctx.NotFound()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -59,7 +36,17 @@ func userAuthHandler(h ctxHandler) ctxHandler {
|
|||
h(ctx)
|
||||
return
|
||||
}
|
||||
ctx.Redirect("/404", 302)
|
||||
ctx.NotFound()
|
||||
}
|
||||
}
|
||||
|
||||
func authHandler(h ctxHandler) ctxHandler {
|
||||
return func(ctx *Context) {
|
||||
if ctx.LoggedOn() {
|
||||
h(ctx)
|
||||
return
|
||||
}
|
||||
ctx.NotFound()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -69,9 +56,9 @@ func staticHandler(ctx *Context) {
|
|||
ctx.SetHeader("Expires", time.Now().Add(time.Hour*12).Format(http.TimeFormat))
|
||||
switch ctx.Path() {
|
||||
case "/bootstrap.css":
|
||||
err = ctx.Write(res["bootstrap.css"])
|
||||
err = ctx.Write(ctx.Srv.res["bootstrap.css"])
|
||||
case "/custom.css":
|
||||
err = ctx.Write(res["custom.css"])
|
||||
err = ctx.Write(ctx.Srv.res["custom.css"])
|
||||
}
|
||||
if err != nil {
|
||||
log.Println("static:", err)
|
||||
|
|
@ -79,7 +66,6 @@ func staticHandler(ctx *Context) {
|
|||
}
|
||||
|
||||
func indexHandler(ctx *Context) {
|
||||
ctx.InitToken()
|
||||
if !ctx.LoggedOn() {
|
||||
ctx.UnsetUdata()
|
||||
}
|
||||
|
|
@ -87,7 +73,6 @@ func indexHandler(ctx *Context) {
|
|||
}
|
||||
|
||||
func loginHandler(ctx *Context) {
|
||||
ctx.InitToken()
|
||||
if ctx.LoggedOn() {
|
||||
ctx.Redirect("/wiki/Index", 302)
|
||||
return
|
||||
|
|
@ -99,38 +84,31 @@ func loginHandler(ctx *Context) {
|
|||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
user := ctx.Form("user")
|
||||
password := ctx.Form("password")
|
||||
submit := ctx.Form("submit")
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if user == "" || password == "" || submit != "Login" {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong inputs"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
err := db.Login(user, password)
|
||||
err := ctx.Srv.BS.Login(user, password)
|
||||
if err != nil {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.SetUdata(user, db.UserIsAdmin(user))
|
||||
ctx.SetUdata(user, ctx.Srv.BS.UserIsAdmin(user))
|
||||
ctx.Redirect("/wiki/Index", 302)
|
||||
}
|
||||
}
|
||||
|
||||
func searchHandler(ctx *Context) {
|
||||
ctx.InitToken()
|
||||
ctx.Template("searchHandler")
|
||||
ctx.Data = webData{
|
||||
Title: "Search",
|
||||
|
|
@ -138,34 +116,27 @@ func searchHandler(ctx *Context) {
|
|||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
search := ctx.Form("search")
|
||||
submit := ctx.Form("submit")
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if search == "" || submit != "Search" {
|
||||
ctx.NewToken()
|
||||
if submit != "Search" {
|
||||
ctx.Data.Msg = "wrong inputs"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
|
||||
res, err := engine.Search(!ctx.LoggedOn(), search)
|
||||
res, err := ctx.Srv.Index.Search(!ctx.LoggedOn(), search)
|
||||
if err != nil {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Data.Search = search
|
||||
ctx.Data.Data = template.HTML(res)
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
}
|
||||
}
|
||||
|
|
@ -177,7 +148,7 @@ func allHandler(ctx *Context) {
|
|||
BodyTitle: "All Articles",
|
||||
Admin: ctx.GetAdmin(),
|
||||
}
|
||||
all, err := engine.GetAll(!ctx.LoggedOn())
|
||||
all, err := ctx.Srv.Index.GetAll(!ctx.LoggedOn())
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
}
|
||||
|
|
@ -187,14 +158,9 @@ func allHandler(ctx *Context) {
|
|||
|
||||
func wikiNewHandler(ctx *Context) {
|
||||
ctx.Template("wikiNewHandler")
|
||||
ctx.Data = webData{
|
||||
Title: "New Article",
|
||||
BodyTitle: "New Article",
|
||||
Admin: ctx.GetAdmin(),
|
||||
}
|
||||
ctx.Data = webData{Title: "New Article"}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
title := ctx.Form("title")
|
||||
|
|
@ -210,28 +176,7 @@ func wikiNewHandler(ctx *Context) {
|
|||
MD: text,
|
||||
}
|
||||
ctx.Data.Data = art
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.NewToken()
|
||||
m, err := regexp.MatchString("[^a-zA-Z0-9 _-]", title)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
if m {
|
||||
ctx.Data.Msg = "title contains forbidden characters, allowed are [a-zA-Z0-9 _-]"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
err = engine.Exists(!ctx.LoggedOn(), title)
|
||||
if err == nil {
|
||||
ctx.Data.Msg = "article alerady exsist"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if submit != "Submit" {
|
||||
|
|
@ -239,7 +184,7 @@ func wikiNewHandler(ctx *Context) {
|
|||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
newTitle, err := engine.Index(title, text, ctx.GetUser(), pub)
|
||||
newTitle, err := ctx.Srv.Index.Index(title, text, ctx.GetUser(), pub)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
|
|
@ -256,11 +201,10 @@ func wikiHandler(ctx *Context) {
|
|||
ctx.Data = webData{
|
||||
Admin: ctx.GetAdmin(),
|
||||
}
|
||||
ctx.NewToken()
|
||||
title := ctx.Var("title")
|
||||
art, err := engine.Get(!ctx.LoggedOn(), title)
|
||||
art, err := ctx.Srv.Index.Get(!ctx.LoggedOn(), title)
|
||||
if err != nil {
|
||||
ctx.Redirect("/404", 302)
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
art.LinkTitle = title
|
||||
|
|
@ -283,16 +227,16 @@ func wikiEditHandler(ctx *Context) {
|
|||
title := ctx.Var("title")
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.NewToken()
|
||||
art, err := engine.Get(!ctx.LoggedOn(), title)
|
||||
art, err := ctx.Srv.Index.Get(!ctx.LoggedOn(), title)
|
||||
if err != nil {
|
||||
ctx.Redirect("/404", 302)
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
art.LinkTitle = title
|
||||
ctx.Data.Data = art
|
||||
ctx.Data.Title = art.Title
|
||||
ctx.Data.BodyTitle = art.Title
|
||||
ctx.Data.Editor = ctx.Srv.Editors.Set(title, ctx.GetUser())
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
ftitle := ctx.Form("title")
|
||||
|
|
@ -311,24 +255,26 @@ func wikiEditHandler(ctx *Context) {
|
|||
}
|
||||
ctx.Data.Title = ftitle
|
||||
ctx.Data.BodyTitle = ftitle
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if submit == "Back" {
|
||||
ctx.Srv.Editors.RemoveEditor(title, ctx.GetUser())
|
||||
ctx.Redirect("/wiki/"+title, 302)
|
||||
return
|
||||
}
|
||||
ctx.NewToken()
|
||||
if submit != "Submit" {
|
||||
ctx.Data.Msg = "wrong inputs"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
err := engine.Update(title, text, ctx.GetUser(), pub)
|
||||
err := ctx.Srv.Index.Update(title, text, ctx.GetUser(), pub)
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Srv.Editors.Remove(title)
|
||||
ctx.Redirect("/wiki/"+title, 302)
|
||||
}
|
||||
}
|
||||
|
|
@ -336,24 +282,26 @@ func wikiEditHandler(ctx *Context) {
|
|||
func wikiDelHandler(ctx *Context) {
|
||||
title := ctx.Var("title")
|
||||
submit := ctx.Form("submit")
|
||||
if !ctx.CheckToken() {
|
||||
f := func() {
|
||||
ctx.Redirect("/wiki/"+title, 302)
|
||||
}
|
||||
if !ctx.CheckToken(f) {
|
||||
return
|
||||
}
|
||||
if submit != "Delete" {
|
||||
ctx.Redirect("/wiki/"+title, 302)
|
||||
f()
|
||||
return
|
||||
}
|
||||
if err := engine.Delete(title); err != nil {
|
||||
if err := ctx.Srv.Index.Delete(title); err != nil {
|
||||
log.Println("delete:", err)
|
||||
ctx.Redirect("/wiki/"+title, 302)
|
||||
f()
|
||||
}
|
||||
ctx.Redirect("/wiki/Index", 302)
|
||||
}
|
||||
|
||||
func usersHandler(ctx *Context) {
|
||||
if !ctx.LoggedOn() {
|
||||
ctx.Redirect("/404", 302)
|
||||
ctx.NotFound()
|
||||
return
|
||||
}
|
||||
ctx.Template("usersHandler")
|
||||
|
|
@ -362,8 +310,7 @@ func usersHandler(ctx *Context) {
|
|||
BodyTitle: "Users",
|
||||
User: ctx.GetUser(),
|
||||
}
|
||||
ctx.NewToken()
|
||||
us, err := db.GetUsers()
|
||||
us, err := ctx.Srv.BS.GetUsers()
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
}
|
||||
|
|
@ -379,7 +326,6 @@ func userNewHandler(ctx *Context) {
|
|||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
user := ctx.Form("user")
|
||||
|
|
@ -391,21 +337,15 @@ func userNewHandler(ctx *Context) {
|
|||
adm = true
|
||||
}
|
||||
submit := ctx.Form("submit")
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if user == "" || password == "" || password != repeat || submit != "Submit" {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong inputs"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
log.Println(user, password, adm)
|
||||
if err := db.CreateUser(user, password, adm); err != nil {
|
||||
ctx.NewToken()
|
||||
if err := ctx.Srv.BS.CreateUser(user, password, adm); err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
|
|
@ -422,14 +362,13 @@ func userEditHandler(ctx *Context) {
|
|||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
u, err := db.GetUserWithoutPassword(ctx.Var("user"))
|
||||
u, err := ctx.Srv.BS.GetUserWithoutPassword(ctx.Var("user"))
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Data.Data = u
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
user := ctx.Var("user")
|
||||
|
|
@ -441,29 +380,23 @@ func userEditHandler(ctx *Context) {
|
|||
adm = true
|
||||
}
|
||||
submit := ctx.Form("submit")
|
||||
if !ctx.CheckToken() {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong csrf token"
|
||||
ctx.Exec()
|
||||
if !ctx.CheckToken(nil) {
|
||||
return
|
||||
}
|
||||
if user == "" || password != repeat || submit != "Submit" {
|
||||
ctx.NewToken()
|
||||
ctx.Data.Msg = "wrong inputs"
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
if ctx.GetAdmin() {
|
||||
if err := db.AdminUpdateUser(user, password, adm); err != nil {
|
||||
ctx.NewToken()
|
||||
if err := ctx.Srv.BS.AdminUpdateUser(user, password, adm); err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
} else {
|
||||
if user == ctx.GetUser() {
|
||||
if err := db.UpdateUserPassword(user, password); err != nil {
|
||||
ctx.NewToken()
|
||||
if err := ctx.Srv.BS.UpdateUserPassword(user, password); err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
|
|
@ -478,7 +411,7 @@ func userEditHandler(ctx *Context) {
|
|||
|
||||
func userUnlockHandler(ctx *Context) {
|
||||
user := ctx.Var("user")
|
||||
if err := db.UnlockUser(user); err != nil {
|
||||
if err := ctx.Srv.BS.UnlockUser(user); err != nil {
|
||||
log.Println("unlock:", err)
|
||||
}
|
||||
ctx.Redirect("/users", 302)
|
||||
|
|
@ -492,17 +425,16 @@ func userDelHandler(ctx *Context) {
|
|||
}
|
||||
switch ctx.Method() {
|
||||
case "GET":
|
||||
user, err := db.GetUserWithoutPassword(ctx.Var("user"))
|
||||
user, err := ctx.Srv.BS.GetUserWithoutPassword(ctx.Var("user"))
|
||||
if err != nil {
|
||||
ctx.Data.Msg = err.Error()
|
||||
ctx.Exec()
|
||||
return
|
||||
}
|
||||
ctx.Data.Data = user
|
||||
ctx.NewToken()
|
||||
ctx.Exec()
|
||||
case "POST":
|
||||
if err := db.DeleteUser(ctx.Var("user")); err != nil {
|
||||
if err := ctx.Srv.BS.DeleteUser(ctx.Var("user")); err != nil {
|
||||
log.Println("delete:", err)
|
||||
}
|
||||
ctx.Redirect("/users", 302)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue