package srv import ( "encoding/json" "fmt" "git.clearsky.net.au/cody/gex.git/utils" "git.clearsky.net.au/cody/gex.git/utils/jwt" "time" ) type Sess struct { req *Req res *Res Expires time.Time User_id int Roles []string Data map[string]string } // config defaults var SESS_TOKEN string = "SessToken" var SESS_TIMEOUT time.Duration = 1 * time.Hour var SESS_SECRET string = "secret" func (sess *Sess) Construct(req *Req, res *Res) { sess.req = req sess.res = res sess.Data = make(map[string]string) sess.SetDefaults() // check cookie is valid and not expired cookie, err := req.Cookie(SESS_TOKEN) if err != nil { //utils.Err(err) return } // decode jwt to json bytes jsonByt, err := jwt.Decode(cookie, SESS_SECRET) if err != nil { utils.Err(err) return } // decode json bytes to session err = json.Unmarshal(jsonByt, &sess) if err != nil { utils.Err(err) return } // if session token has expired, return default session if time.Now().After(sess.Expires) { if !time.Now().After(sess.Expires.Add(SESS_TIMEOUT)) { sess.Expires = time.Now().Add(20 * time.Minute) return } fmt.Println("session expired") sess.SetDefaults() } } func (sess *Sess) SetDefaults() { sess.Expires = time.Now().Add(20 * time.Minute) sess.User_id = 0 sess.Roles = []string{"Guest", "Everyone"} } func (sess *Sess) Token() (string, error) { jsonStr, err := json.Marshal(sess) if err != nil { return "", err } // encode the json to jwt and set the cookie token, err := jwt.Encode(jsonStr, SESS_SECRET) if err != nil { return "", err } return token, nil } // Saves token to cookie func (sess *Sess) Save() { // get the session token token, err := sess.Token() if err != nil { sess.res.Send(err.Error()) return } // set the token cookie sess.res.Cookie(SESS_TOKEN, token) } func (sess *Sess) HasRole(role string) bool { for _, val := range sess.Roles { if role == val { return true } } return false } func (sess *Sess) Set(key string, val string) { sess.Data[key] = val } func (sess *Sess) Get(key string) string { return sess.Data[key] }