have user data persist between restarts in redis session

This commit is contained in:
Gregory Wells
2026-06-08 19:21:08 -04:00
parent 109199ea45
commit 4cce7b7454
2 changed files with 24 additions and 16 deletions
+14 -13
View File
@@ -7,7 +7,6 @@ import (
"log"
"net/http"
"strings"
"sync"
"astraltech.xyz/accountmanager/src/components"
"astraltech.xyz/accountmanager/src/email"
@@ -15,6 +14,7 @@ import (
"astraltech.xyz/accountmanager/src/ldap"
"astraltech.xyz/accountmanager/src/logging"
"astraltech.xyz/accountmanager/src/session"
"astraltech.xyz/accountmanager/src/store"
)
var (
@@ -31,8 +31,7 @@ type UserData struct {
}
var (
userData = make(map[string]*UserData)
userDataMutex sync.RWMutex
userData store.KeyValueStore[*UserData]
)
var ErrPasswordExpired = errors.New("Password expired")
@@ -94,25 +93,22 @@ func profileHandler(w http.ResponseWriter, r *http.Request) {
return
}
_, exists := userData[sessionData.UserID]
if !exists {
logging.Error("Session id exists but user does not exist")
data, err := userData.Get(sessionData.UserID)
if err != nil {
logging.Error(err.Error())
http.Redirect(w, r, "/login", http.StatusSeeOther)
return
}
if r.Method == http.MethodGet {
tmpl := template.Must(template.ParseFiles("src/pages/profile_page.html"))
userDataMutex.RLock()
tmpl.Execute(w, ProfileData{
Username: sessionData.UserID,
Email: userData[sessionData.UserID].Email,
DisplayName: userData[sessionData.UserID].DisplayName,
Email: data.Email,
DisplayName: data.DisplayName,
CSRFToken: sessionData.CSRFToken,
})
userDataMutex.RUnlock()
return
}
}
@@ -207,8 +203,10 @@ func changePasswordHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"success": true}`))
user_data, err := userData.Get(sessionData.UserID)
data := map[string]any{
"Username": userData[sessionData.UserID].DisplayName,
"Username": user_data.DisplayName,
"ServiceName": "Astral Tech",
}
@@ -216,7 +214,7 @@ func changePasswordHandler(w http.ResponseWriter, r *http.Request) {
if err != nil {
logging.Errorf("Failed to load email template: %s", err.Error())
}
noReplyEmail.SendEmail([]string{userData[sessionData.UserID].Email}, "Password expired", email_template)
noReplyEmail.SendEmail([]string{user_data.Email}, "Password expired", email_template)
}
func main() {
@@ -231,11 +229,14 @@ func main() {
sessionManager = session.GetSessionManager()
if serverConfig.WebserverConfig.SessionStore == "in_memory" {
sessionManager.SetStoreType(session.InMemory)
userData = store.NewMemoryStore[*UserData]()
} else if serverConfig.WebserverConfig.SessionStore == "redis" {
sessionManager.SetStoreType(session.Redis, serverConfig.WebserverConfig.RedisConfigInfo.RedisURL, serverConfig.WebserverConfig.RedisConfigInfo.Prefix)
userData = store.NewRedisStore[*UserData](serverConfig.WebserverConfig.RedisConfigInfo.RedisURL, serverConfig.WebserverConfig.RedisConfigInfo.Prefix)
} else {
logging.Warnf("'%s' is an unknown session store type defaulting to in memory", serverConfig.WebserverConfig.SessionStore)
sessionManager.SetStoreType(session.InMemory)
userData = store.NewMemoryStore[*UserData]()
}
noReplyEmail = email.CreateEmailAccount(email.EmailAccountData{