123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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]
- }
|