wg-portal/internal/app/api/v0/handlers/web_session.go
2025-03-09 21:16:42 +01:00

89 lines
1.8 KiB
Go

package handlers
import (
"context"
"encoding/gob"
"net/http"
"strings"
"time"
"github.com/alexedwards/scs/v2"
"github.com/h44z/wg-portal/internal/config"
)
func init() {
gob.Register(SessionData{})
}
type SessionData struct {
LoggedIn bool
IsAdmin bool
UserIdentifier string
Firstname string
Lastname string
Email string
OauthState string
OauthNonce string
OauthProvider string
OauthReturnTo string
CsrfToken string
}
const sessionApiV0Key = "session_api_v0"
type SessionWrapper struct {
*scs.SessionManager
}
func NewSessionWrapper(cfg *config.Config) *SessionWrapper {
sessionManager := scs.New()
sessionManager.Lifetime = 24 * time.Hour
sessionManager.IdleTimeout = 1 * time.Hour
sessionManager.Cookie.Name = cfg.Web.SessionIdentifier
sessionManager.Cookie.Secure = strings.HasPrefix(cfg.Web.ExternalUrl, "https")
sessionManager.Cookie.HttpOnly = true
sessionManager.Cookie.SameSite = http.SameSiteLaxMode
sessionManager.Cookie.Path = "/"
sessionManager.Cookie.Persist = false
wrappedSessionManager := &SessionWrapper{sessionManager}
return wrappedSessionManager
}
func (s *SessionWrapper) SetData(ctx context.Context, value SessionData) {
s.SessionManager.Put(ctx, sessionApiV0Key, value)
}
func (s *SessionWrapper) GetData(ctx context.Context) SessionData {
sessionData, ok := s.SessionManager.Get(ctx, sessionApiV0Key).(SessionData)
if !ok {
return s.defaultSessionData()
}
return sessionData
}
func (s *SessionWrapper) DestroyData(ctx context.Context) {
_ = s.SessionManager.Destroy(ctx)
}
func (s *SessionWrapper) defaultSessionData() SessionData {
return SessionData{
LoggedIn: false,
IsAdmin: false,
UserIdentifier: "",
Firstname: "",
Lastname: "",
Email: "",
OauthState: "",
OauthNonce: "",
OauthProvider: "",
OauthReturnTo: "",
}
}