pop-camarades/middlewares/saved_session.go

59 lines
1.2 KiB
Go

package middlewares
import (
"errors"
"time"
"git.readonly.ch/bouzoure/pop-camarades/helpers"
"git.readonly.ch/bouzoure/pop-camarades/models"
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
)
func SavedSessionMiddleware(c *fiber.Ctx) error {
sess, err := helpers.GetSessionStore(c)
if err != nil {
return err
}
if sess.Get("totp-verified") == "yes" {
return c.Next()
}
sessionUUID := c.Cookies("saved-session-uuid")
sessionSecret := c.Cookies("saved-session-secret")
if len(sessionUUID) > 0 && len(sessionSecret) > 0 {
db, err := helpers.GetDatabase()
if err != nil {
return err
}
var savedSession models.UserSavedSession
result := db.Find(
&savedSession,
"uuid = ? AND expiration >= ?",
sessionUUID,
time.Now(),
)
if errors.Is(result.Error, gorm.ErrRecordNotFound) || result.RowsAffected < 1 {
c.ClearCookie("saved-session-uuid")
c.ClearCookie("saved-session-secret")
return c.Next()
}
if result.Error != nil {
return result.Error
}
if helpers.CheckPasswordHash(sessionSecret, savedSession.Secret) {
sess.Set("userid", savedSession.UserID)
sess.Set("totp-verified", "yes")
sess.Save()
}
}
return c.Next()
}