github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/csession/session.go (about) 1 // Package csession - Content managed by Project Forge, see [projectforge.md] for details. 2 package csession 3 4 import ( 5 "net/http" 6 7 "github.com/pkg/errors" 8 9 "github.com/kyleu/dbaudit/app/lib/user" 10 "github.com/kyleu/dbaudit/app/util" 11 ) 12 13 const ( 14 WebAuthKey = "auth" 15 WebFlashKey = "flash" 16 ReferKey = "refer" 17 ) 18 19 func NewCookie(v string) *http.Cookie { 20 return &http.Cookie{Name: util.AppKey, Value: v, Path: "/", MaxAge: 365 * 24 * 60 * 60, HttpOnly: true, SameSite: http.SameSiteLaxMode} 21 } 22 23 func StoreInSession(k string, v string, w http.ResponseWriter, websess util.ValueMap, logger util.Logger) error { 24 websess[k] = v 25 return SaveSession(w, websess, logger) 26 } 27 28 func RemoveFromSession(k string, w http.ResponseWriter, websess util.ValueMap, logger util.Logger) error { 29 delete(websess, k) 30 return SaveSession(w, websess, logger) 31 } 32 33 func SaveSession(w http.ResponseWriter, websess util.ValueMap, logger util.Logger) error { 34 js := util.ToJSONCompact(websess) 35 enc, err := util.EncryptMessage(nil, js, logger) 36 if err != nil { 37 return err 38 } 39 http.SetCookie(w, NewCookie(enc)) 40 return nil 41 } 42 43 func GetFromSession(key string, websess util.ValueMap) (string, error) { 44 value, ok := websess[key] 45 if !ok { 46 return "", errors.Errorf("could not find a matching session value with key [%s] for this request", key) 47 } 48 s, ok := value.(string) 49 if !ok { 50 return "", errors.Errorf("session value with key [%s] is of type [%T], not [string]", key, value) 51 } 52 return s, nil 53 } 54 55 func SaveProfile(n *user.Profile, w http.ResponseWriter, sess util.ValueMap, logger util.Logger) error { 56 if n != nil && n.Name == "" { 57 n.Name = user.DefaultProfile.Name 58 } 59 if n == nil || n.Equals(user.DefaultProfile) { 60 return errors.Wrap(RemoveFromSession("profile", w, sess, logger), "unable to remove profile from session") 61 } 62 if n.Name == user.DefaultProfile.Name { 63 n.Name = "" 64 } 65 err := StoreInSession("profile", util.ToJSON(n), w, sess, logger) 66 if err != nil { 67 return errors.Wrap(err, "unable to save profile in session") 68 } 69 return nil 70 }