141 lines
3.0 KiB
Go
141 lines
3.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"fmt"
|
|
"git.markbailey.dev/cerbervs/ptpp/util"
|
|
"net/http"
|
|
"os"
|
|
|
|
"git.markbailey.dev/cerbervs/ptpp/lib/logger"
|
|
"git.markbailey.dev/cerbervs/ptpp/lib/session"
|
|
)
|
|
|
|
type Func func(http.Handler) http.Handler
|
|
|
|
var sess session.IManager
|
|
|
|
func Compose(xs []Func) Func {
|
|
return func(next http.Handler) http.Handler {
|
|
for i := len(xs) - 1; i >= 0; i-- {
|
|
x := xs[i]
|
|
next = x(next)
|
|
}
|
|
|
|
return next
|
|
}
|
|
}
|
|
|
|
func WithLogger(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
handlerSess := sess.SessionStart(w, r)
|
|
|
|
username, ok := handlerSess.Get("username").(string)
|
|
if !ok {
|
|
username = "<Not Found>"
|
|
}
|
|
|
|
ipAddr := r.Header.Get("X-Real-IP")
|
|
if ipAddr == "" {
|
|
ipAddr = r.Header.Get("X-Forwarded-For")
|
|
}
|
|
if ipAddr == "" {
|
|
ipAddr = r.RemoteAddr
|
|
}
|
|
|
|
handlerLogger := logger.NewCompositeLogger()
|
|
output := fmt.Sprintf(
|
|
"%s Request sent from %s to %s (username? %s)",
|
|
r.Method,
|
|
ipAddr,
|
|
r.URL.Path,
|
|
username,
|
|
)
|
|
handlerLogger.Info(output)
|
|
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func WithAuth(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var (
|
|
claims *util.CustomClaims
|
|
cookie *http.Cookie
|
|
err error
|
|
token string
|
|
handlerSess = sess.SessionStart(w, r)
|
|
)
|
|
|
|
if handlerSess.Get("username") != nil {
|
|
req := util.AddValuesToRequestContext(r, map[any]any{
|
|
"username": handlerSess.Get("username"),
|
|
})
|
|
next.ServeHTTP(w, req)
|
|
return
|
|
}
|
|
|
|
if cookie, err = r.Cookie("token"); err != nil {
|
|
_ = util.Redirect(w, r, "/signin", http.StatusSeeOther, true)
|
|
return
|
|
}
|
|
if token = cookie.Value; token == "" {
|
|
_ = util.Redirect(w, r, "/signin", http.StatusSeeOther, true)
|
|
return
|
|
}
|
|
if claims, err = util.ParseToken(token, os.Getenv("TOKEN_SECRET")); err != nil {
|
|
_ = util.Redirect(w, r, "/signin", http.StatusSeeOther, true)
|
|
return
|
|
}
|
|
|
|
req := util.AddValuesToRequestContext(r, map[any]any{
|
|
"username": claims.Username,
|
|
})
|
|
next.ServeHTTP(w, req)
|
|
})
|
|
}
|
|
|
|
func WithUsername(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var (
|
|
claims *util.CustomClaims
|
|
cookie *http.Cookie
|
|
err error
|
|
token string
|
|
handlerSess = sess.SessionStart(w, r)
|
|
)
|
|
|
|
if handlerSess.Get("username") != nil {
|
|
req := util.AddValuesToRequestContext(r, map[any]any{
|
|
"username": handlerSess.Get("username"),
|
|
})
|
|
next.ServeHTTP(w, req)
|
|
return
|
|
}
|
|
|
|
var uname *string
|
|
if cookie, err = r.Cookie("token"); err == nil {
|
|
if token = cookie.Value; token == "" {
|
|
uname = nil
|
|
}
|
|
if claims, err = util.ParseToken(token, os.Getenv("TOKEN_SECRET")); err != nil {
|
|
uname = nil
|
|
}
|
|
uname = &claims.Username
|
|
}
|
|
|
|
if uname != nil {
|
|
req := util.AddValuesToRequestContext(r, map[any]any{
|
|
"username": uname,
|
|
})
|
|
next.ServeHTTP(w, req)
|
|
return
|
|
}
|
|
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func init() {
|
|
sess, _ = session.NewManager("memory", "ptpp", 3600)
|
|
}
|