new session manager code

This commit is contained in:
2026-04-01 14:41:12 -04:00
parent d70e679a01
commit f651894a0f

View File

@@ -0,0 +1,81 @@
package session
import (
"net/http"
"time"
"astraltech.xyz/accountmanager/src/logging"
)
const SessionCookieName = "session_token"
type SessionManager struct {
store SessionStore
}
type StoreType int
const (
InMemory StoreType = iota
)
func CreateSessionManager(storeType StoreType) *SessionManager {
sessionManager := SessionManager{}
switch storeType {
case InMemory:
{
sessionManager.store = NewMemoryStore()
break
}
}
return &sessionManager
}
func (manager *SessionManager) CreateSession(userID string) (cookie *http.Cookie, err error) {
logging.Debugf("Creating a new session for %s", userID)
token, err := GenerateSessionToken(32) // Use crypto/rand for this
if err != nil {
return nil, err
}
CSRFToken, err := GenerateSessionToken(32)
if err != nil {
return nil, err
}
newSessionData := SessionData{
UserID: userID,
CSRFToken: CSRFToken,
ExpiresAt: time.Now().Add(time.Hour),
}
err = manager.store.Create(token, &newSessionData)
if err != nil {
return nil, err
}
newCookie := &http.Cookie{
Name: SessionCookieName,
Value: token,
Path: "/",
HttpOnly: true, // Essential: prevents JS access
Secure: true, // Set to TRUE in production (HTTPS)
SameSite: http.SameSiteLaxMode,
MaxAge: 3600, // 1 hour
}
return newCookie, nil
}
func (manager *SessionManager) GetSession(r *http.Request) (*SessionData, error) {
logging.Debug("Validating session from request")
cookie, err := r.Cookie(SessionCookieName)
if err != nil {
return nil, ErrSessionNotFound
}
token := cookie.Value
if token == "" {
return nil, ErrSessionNotFound
}
data, err := manager.store.Get(token)
if err != nil {
return nil, ErrSessionNotFound
}
return data, nil
}