mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			90 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
 | |
| 
 | |
| 	WebAuthnData 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.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:  "",
 | |
| 	}
 | |
| }
 |