From 09e0683ae0b6d3422b245b7cb79845dd323f540b Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Mon, 8 Jun 2026 18:24:59 -0400 Subject: [PATCH] fully convert redis over to custom key value store type --- src/session/session_in_memory.go | 152 +++++++++++++++---------------- src/session/session_manager.go | 12 +-- src/session/session_store.go | 10 +- src/store/store.go | 2 +- src/store/store_redis.go | 3 +- 5 files changed, 94 insertions(+), 85 deletions(-) diff --git a/src/session/session_in_memory.go b/src/session/session_in_memory.go index 8e99dce..3426432 100644 --- a/src/session/session_in_memory.go +++ b/src/session/session_in_memory.go @@ -1,90 +1,90 @@ package session -import ( - "sync" - "time" +// import ( +// "sync" +// "time" - "astraltech.xyz/accountmanager/src/logging" - "astraltech.xyz/accountmanager/src/worker" -) +// "astraltech.xyz/accountmanager/src/logging" +// "astraltech.xyz/accountmanager/src/worker" +// ) -type MemoryStore struct { - sessions map[string]*SessionData - lock sync.RWMutex -} +// type MemoryStore struct { +// sessions map[string]*SessionData +// lock sync.RWMutex +// } -func NewMemoryStore() *MemoryStore { - logging.Debug("Creating new in memory session store") - store := &MemoryStore{ - sessions: make(map[string]*SessionData), - } - worker.CreateWorker(time.Minute*5, store.cleanup) - return store -} +// func NewMemoryStore() *MemoryStore { +// logging.Debug("Creating new in memory session store") +// store := &MemoryStore{ +// sessions: make(map[string]*SessionData), +// } +// worker.CreateWorker(time.Minute*5, store.cleanup) +// return store +// } -func (m *MemoryStore) Create(sessionID string, session *SessionData) (err error) { - hashedSession := hashSession(sessionID) +// func (m *MemoryStore) Create(sessionID string, session *SessionData) (err error) { +// hashedSession := hashSession(sessionID) - m.lock.Lock() - defer m.lock.Unlock() - _, exist := m.sessions[hashedSession] - if exist { - return ErrSessionAlreadyExists - } +// m.lock.Lock() +// defer m.lock.Unlock() +// _, exist := m.sessions[hashedSession] +// if exist { +// return ErrSessionAlreadyExists +// } - m.sessions[hashedSession] = session - return nil -} -func (m *MemoryStore) Get(sessionID string) (*SessionData, error) { - m.lock.RLock() - hashed := hashSession(sessionID) - data, exists := m.sessions[hashed] - m.lock.RUnlock() - if exists == false { - return nil, ErrSessionNotFound - } - copy := *data - return ©, nil -} -func (m *MemoryStore) Update(sessionID string, session *SessionData) error { - hashedSession := hashSession(sessionID) +// m.sessions[hashedSession] = session +// return nil +// } +// func (m *MemoryStore) Get(sessionID string) (*SessionData, error) { +// m.lock.RLock() +// hashed := hashSession(sessionID) +// data, exists := m.sessions[hashed] +// m.lock.RUnlock() +// if exists == false { +// return nil, ErrSessionNotFound +// } +// copy := *data +// return ©, nil +// } +// func (m *MemoryStore) Update(sessionID string, session *SessionData) error { +// hashedSession := hashSession(sessionID) - m.lock.Lock() - defer m.lock.Unlock() - _, exist := m.sessions[hashedSession] - if !exist { - return ErrSessionNotFound - } - m.sessions[hashedSession] = session - return nil -} +// m.lock.Lock() +// defer m.lock.Unlock() +// _, exist := m.sessions[hashedSession] +// if !exist { +// return ErrSessionNotFound +// } +// m.sessions[hashedSession] = session +// return nil +// } -func (m *MemoryStore) cleanup() { - logging.Debug("Cleaning up memory store sessions") - now := time.Now() +// func (m *MemoryStore) cleanup() { +// logging.Debug("Cleaning up memory store sessions") +// now := time.Now() - m.lock.Lock() - defer m.lock.Unlock() +// m.lock.Lock() +// defer m.lock.Unlock() - deleted := 0 - for id, session := range m.sessions { - if now.After(session.ExpiresAt) { - delete(m.sessions, id) - deleted = deleted + 1 - } - } - logging.Infof("Cleaned up %d stale sessions", deleted) -} +// deleted := 0 +// for id, session := range m.sessions { +// if now.After(session.ExpiresAt) { +// delete(m.sessions, id) +// deleted = deleted + 1 +// } +// } +// logging.Infof("Cleaned up %d stale sessions", deleted) +// } -func (m *MemoryStore) Delete(sessionID string) error { - hashedSession := hashSession(sessionID) +// func (m *MemoryStore) Delete(sessionID string) error { +// hashedSession := hashSession(sessionID) - m.lock.Lock() - defer m.lock.Unlock() - _, exist := m.sessions[hashedSession] - if !exist { - return ErrSessionNotFound - } - delete(m.sessions, hashedSession) - return nil -} +// m.lock.Lock() +// defer m.lock.Unlock() +// _, exist := m.sessions[hashedSession] +// if !exist { +// return ErrSessionNotFound +// } +// delete(m.sessions, hashedSession) +// return nil +// } diff --git a/src/session/session_manager.go b/src/session/session_manager.go index f6a384d..62d95af 100644 --- a/src/session/session_manager.go +++ b/src/session/session_manager.go @@ -12,7 +12,7 @@ import ( const SessionCookieName = "session_token" type SessionManager struct { - store store.Store[string, *SessionData] + store store.KeyValueStore[*SessionData] } var instance *SessionManager @@ -37,12 +37,12 @@ func (manager *SessionManager) SetStoreType(storeType StoreType) { switch storeType { case InMemory: { - manager.store = NewMemoryStore() + // manager.store = NewMemoryStore() break } case Redis: { - manager.store = NewRedisStore() + manager.store = store.NewRedisStore[*SessionData]() break } } @@ -72,10 +72,10 @@ func (manager *SessionManager) CreateSession(userID string) (cookie *http.Cookie Name: SessionCookieName, Value: token, Path: "/", - HttpOnly: true, // Essential: prevents JS access - Secure: true, // Set to TRUE in production (HTTPS) + HttpOnly: true, + Secure: true, SameSite: http.SameSiteLaxMode, - MaxAge: 3600, // 1 hour + MaxAge: 3600, } return newCookie, nil } diff --git a/src/session/session_store.go b/src/session/session_store.go index b7e92e4..025d14c 100644 --- a/src/session/session_store.go +++ b/src/session/session_store.go @@ -1,6 +1,14 @@ package session -import "time" +import ( + "errors" + "time" +) + +var ErrSessionNotFound = errors.New("Session not found") +var ErrSessionAlreadyExists = errors.New("Session already exists") +var ErrSessionExpired = errors.New("Session expired") +var ErrSessionBackend = errors.New("Session backend") type SessionData struct { UserID string `json:"userid"` diff --git a/src/store/store.go b/src/store/store.go index 8819774..85d9194 100644 --- a/src/store/store.go +++ b/src/store/store.go @@ -2,7 +2,7 @@ package store // A simple key value store that can either just be single instance in memory or a redis server (for now) -type Store[Value any] interface { +type KeyValueStore[Value any] interface { Create(key string, value Value) error Get(key string) (Value, error) Update(key string, session Value) error diff --git a/src/store/store_redis.go b/src/store/store_redis.go index eeb9139..0b8555a 100644 --- a/src/store/store_redis.go +++ b/src/store/store_redis.go @@ -42,6 +42,7 @@ func NewRedisStore[Value any]() *RedisStore[Value] { store := &RedisStore[Value]{ client: rdb, ctx: ctx, + prefix: "random_string_1", } return store } @@ -77,7 +78,7 @@ func (m *RedisStore[Value]) Get(sessionID string) (Value, error) { return session_data, ErrKeyBackend } - if err := json.Unmarshal(data, session_data); err != nil { + if err := json.Unmarshal(data, &session_data); err != nil { logging.Error(err.Error()) return session_data, ErrKeyBackend }