first working version

This commit is contained in:
ston1th 2019-04-28 18:16:40 +02:00
commit de359ab415
47 changed files with 1016 additions and 2012 deletions

View file

@ -11,6 +11,7 @@ import (
"html/template"
"net/http"
"net/url"
"reflect"
"time"
)
@ -21,59 +22,29 @@ const (
refererClaim = "referer"
)
func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) (ctx *Context) {
func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) *Context {
h := w.Header()
h.Set("X-Frame-Options", "DENY")
h.Set("X-Frame-Options", "sameorigin")
h.Set("X-Content-Type-Options", "nosniff")
h.Set("X-XSS-Protection", "1; mode=block")
h.Set("Content-Security-Policy", "default-src 'none';style-src 'self';img-src 'self' https: data:;connect-src 'self';frame-ancestors 'none'")
h.Set("Content-Security-Policy", "default-src 'none';object-src 'self';frame-src 'self';style-src 'self';img-src 'self' https: data:;connect-src 'self';frame-ancestors 'self'")
h.Set("Referrer-Policy", "same-origin")
ctx = &Context{
return &Context{
Request: r,
Response: w,
Srv: s,
Time: time.Now(),
}
path := ctx.Path()
if path == "/bootstrap.css" || path == "/custom.css" || path == "/favicon.ico" {
return
}
if c, err := r.Cookie(cookieName); err == nil {
t, err := jwt.DecodeToken(c.Value)
if err != nil {
ctx.LogSetCookie("DecodeToken:", err)
return
}
if err = s.JWT.Verify(t); err != nil {
ctx.LogSetCookie("VerifyToken:", err)
return
}
if t.Claims.GetString(totpClaim) != "" {
if path == core.TotpURI || path == core.LoginURI || path == core.LogoutURI {
ctx.Token = *t
return
}
ctx.Redirect(core.TotpURI, http.StatusFound)
return nil
}
if err = s.JWT.Invalidate(t); err != nil {
log.Println("Invalidate:", err)
}
}
ctx.SetCookie(nil, 0)
return
}
type Context struct {
Request *http.Request
Response http.ResponseWriter
Srv *HTTPServer
T *template.Template
Status int
Err error
Time time.Time
Request *http.Request
Response http.ResponseWriter
Srv *HTTPServer
T *template.Template
HTTPStatus int
Err error
Time time.Time
Token jwt.Token
@ -96,7 +67,9 @@ type webData struct {
Msg string
Search string
Data interface{}
Path string
Paths core.Paths
Data interface{}
}
type loginData struct {
@ -104,20 +77,10 @@ type loginData struct {
Referer string
}
type sectionData struct {
Name string
Members map[string]bool
}
type pageData struct {
Page core.Page
Sections map[string]bool
}
func (c *Context) Exec() {
defer c.log()
defer c.Log()
if c.T == nil {
c.Status = http.StatusInternalServerError
c.Status(http.StatusInternalServerError)
c.Err = errors.New("template is nil")
return
}
@ -132,24 +95,24 @@ func (c *Context) Exec() {
c.Data.Time = time.Since(c.Time).Nanoseconds() / 1e6
if c.Data.Msg != "" {
c.Status = http.StatusBadRequest
c.Status(http.StatusBadRequest)
}
c.Err = c.T.Execute(c.Response, c.Data)
if c.Err != nil {
c.Status = http.StatusInternalServerError
}
if c.Status == 0 {
c.Status = http.StatusOK
c.Status(http.StatusInternalServerError)
}
}
func (c *Context) log() {
func (c *Context) Log() {
if c.HTTPStatus == 0 {
c.HTTPStatus = int(reflect.Indirect(reflect.ValueOf(c.Response)).FieldByName("status").Int())
}
if c.Err != nil {
log.Printf("%s %s %s %d error: %s\n", c.Request.RemoteAddr, c.Request.Method, c.Request.URL, c.Status, c.Err)
log.Printf("%s %s %s %d error: %s\n", c.Request.RemoteAddr, c.Request.Method, c.Request.URL, c.HTTPStatus, c.Err)
return
}
log.Printf("%s %s %s %d\n", c.Request.RemoteAddr, c.Request.Method, c.Request.URL, c.Status)
log.Printf("%s %s %s %d\n", c.Request.RemoteAddr, c.Request.Method, c.Request.URL, c.HTTPStatus)
}
func (c *Context) Error(i interface{}) {
@ -165,20 +128,19 @@ func (c *Context) Error(i interface{}) {
func (c *Context) NotFound() {
c.Template("notFoundHandler")
c.Data = webData{Title: "404"}
c.Status = http.StatusNotFound
c.Response.WriteHeader(http.StatusNotFound)
c.Status(http.StatusNotFound)
c.Exec()
}
func (c *Context) Forbidden() {
c.Template("forbiddenHandler")
c.Data = webData{Title: "403"}
c.Status = http.StatusForbidden
c.Response.WriteHeader(http.StatusForbidden)
c.Status(http.StatusForbidden)
c.Exec()
}
func (c *Context) SwitchHandler() {
log.Debug("server: switching to normal handler")
c.Srv.srv.Handler = c.Srv.handler
c.Redirect(core.IndexURI, http.StatusFound)
}
@ -192,6 +154,11 @@ func (c *Context) Write(buf []byte) (err error) {
return
}
func (c *Context) Status(status int) {
c.HTTPStatus = status
c.Response.WriteHeader(status)
}
func (c *Context) SetHeader(name, value string) {
c.Response.Header().Set(name, value)
}