sess.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package srv
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "git.clearsky.net.au/cody/gex.git/utils"
  6. "git.clearsky.net.au/cody/gex.git/utils/jwt"
  7. "time"
  8. )
  9. type Sess struct {
  10. req *Req
  11. res *Res
  12. Expires time.Time
  13. User_id int
  14. Roles []string
  15. Data map[string]string
  16. }
  17. // config defaults
  18. var SESS_TOKEN string = "SessToken"
  19. var SESS_TIMEOUT time.Duration = 1 * time.Hour
  20. var SESS_SECRET string = "secret"
  21. func (sess *Sess) Construct(req *Req, res *Res) {
  22. sess.req = req
  23. sess.res = res
  24. sess.Data = make(map[string]string)
  25. sess.SetDefaults()
  26. // check cookie is valid and not expired
  27. cookie, err := req.Cookie(SESS_TOKEN)
  28. if err != nil {
  29. //utils.Err(err)
  30. return
  31. }
  32. // decode jwt to json bytes
  33. jsonByt, err := jwt.Decode(cookie, SESS_SECRET)
  34. if err != nil {
  35. utils.Err(err)
  36. return
  37. }
  38. // decode json bytes to session
  39. err = json.Unmarshal(jsonByt, &sess)
  40. if err != nil {
  41. utils.Err(err)
  42. return
  43. }
  44. // if session token has expired, return default session
  45. if time.Now().After(sess.Expires) {
  46. if !time.Now().After(sess.Expires.Add(SESS_TIMEOUT)) {
  47. sess.Expires = time.Now().Add(20 * time.Minute)
  48. return
  49. }
  50. fmt.Println("session expired")
  51. sess.SetDefaults()
  52. }
  53. }
  54. func (sess *Sess) SetDefaults() {
  55. sess.Expires = time.Now().Add(20 * time.Minute)
  56. sess.User_id = 0
  57. sess.Roles = []string{"Guest", "Everyone"}
  58. }
  59. func (sess *Sess) Token() (string, error) {
  60. jsonStr, err := json.Marshal(sess)
  61. if err != nil {
  62. return "", err
  63. }
  64. // encode the json to jwt and set the cookie
  65. token, err := jwt.Encode(jsonStr, SESS_SECRET)
  66. if err != nil {
  67. return "", err
  68. }
  69. return token, nil
  70. }
  71. // Saves token to cookie
  72. func (sess *Sess) Save() {
  73. // get the session token
  74. token, err := sess.Token()
  75. if err != nil {
  76. sess.res.Send(err.Error())
  77. return
  78. }
  79. // set the token cookie
  80. sess.res.Cookie(SESS_TOKEN, token)
  81. }
  82. func (sess *Sess) HasRole(role string) bool {
  83. for _, val := range sess.Roles {
  84. if role == val {
  85. return true
  86. }
  87. }
  88. return false
  89. }
  90. func (sess *Sess) Set(key string, val string) {
  91. sess.Data[key] = val
  92. }
  93. func (sess *Sess) Get(key string) string {
  94. return sess.Data[key]
  95. }