113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
package middleware
|
|
|
|
import (
|
|
"dk/internal/auth"
|
|
"dk/internal/router"
|
|
"dk/internal/session"
|
|
"dk/internal/users"
|
|
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
func Auth(authManager *auth.AuthManager) router.Middleware {
|
|
return func(next router.Handler) router.Handler {
|
|
return func(ctx router.Ctx, params []string) {
|
|
sessionID := auth.GetSessionCookie(ctx)
|
|
|
|
if sessionID != "" {
|
|
if sess, exists := authManager.GetSession(sessionID); exists {
|
|
authManager.UpdateSession(sessionID)
|
|
|
|
user, err := users.Find(sess.UserID)
|
|
if err == nil && user != nil {
|
|
ctx.SetUserValue("session", sess)
|
|
ctx.SetUserValue("user", user)
|
|
|
|
auth.SetSessionCookie(ctx, sessionID)
|
|
}
|
|
}
|
|
}
|
|
|
|
next(ctx, params)
|
|
}
|
|
}
|
|
}
|
|
|
|
func RequireAuth(paths ...string) router.Middleware {
|
|
redirect := "/login"
|
|
if len(paths) > 0 && paths[0] != "" {
|
|
redirect = paths[0]
|
|
}
|
|
|
|
return func(next router.Handler) router.Handler {
|
|
return func(ctx router.Ctx, params []string) {
|
|
if !IsAuthenticated(ctx) {
|
|
ctx.Redirect(redirect, fasthttp.StatusFound)
|
|
return
|
|
}
|
|
|
|
user := ctx.UserValue("user").(*users.User)
|
|
user.UpdateLastOnline()
|
|
user.Save()
|
|
|
|
next(ctx, params)
|
|
}
|
|
}
|
|
}
|
|
|
|
func RequireGuest(paths ...string) router.Middleware {
|
|
redirect := "/"
|
|
if len(paths) > 0 && paths[0] != "" {
|
|
redirect = paths[0]
|
|
}
|
|
|
|
return func(next router.Handler) router.Handler {
|
|
return func(ctx router.Ctx, params []string) {
|
|
if IsAuthenticated(ctx) {
|
|
ctx.Redirect(redirect, fasthttp.StatusFound)
|
|
return
|
|
}
|
|
next(ctx, params)
|
|
}
|
|
}
|
|
}
|
|
|
|
func IsAuthenticated(ctx router.Ctx) bool {
|
|
_, exists := ctx.UserValue("user").(*users.User)
|
|
return exists
|
|
}
|
|
|
|
func GetCurrentUser(ctx router.Ctx) *users.User {
|
|
if user, ok := ctx.UserValue("user").(*users.User); ok {
|
|
return user
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetCurrentSession(ctx router.Ctx) *session.Session {
|
|
if sess, ok := ctx.UserValue("session").(*session.Session); ok {
|
|
return sess
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Login(ctx router.Ctx, authManager *auth.AuthManager, user *users.User) {
|
|
sess := authManager.CreateSession(user)
|
|
auth.SetSessionCookie(ctx, sess.ID)
|
|
|
|
ctx.SetUserValue("session", sess)
|
|
ctx.SetUserValue("user", user)
|
|
}
|
|
|
|
func Logout(ctx router.Ctx, authManager *auth.AuthManager) {
|
|
sessionID := auth.GetSessionCookie(ctx)
|
|
if sessionID != "" {
|
|
authManager.DeleteSession(sessionID)
|
|
}
|
|
|
|
auth.DeleteSessionCookie(ctx)
|
|
|
|
ctx.SetUserValue("session", nil)
|
|
ctx.SetUserValue("user", nil)
|
|
}
|