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  }