session.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package sess
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "git.clearsky.net.au/cody/gex.git/pkg/gex"
  6. "git.clearsky.net.au/cody/gex.git/pkg/sess/jwt"
  7. "time"
  8. )
  9. type Sess struct {
  10. req *gex.Req
  11. res gex.Res
  12. User_id int
  13. User_name string
  14. Roles []string
  15. Expires time.Time
  16. }
  17. func (sess *Sess) HasRole(roleName string) bool {
  18. for _, role := range sess.Roles {
  19. if role == roleName {
  20. return true
  21. }
  22. }
  23. return false
  24. }
  25. func (sess *Sess) setDefaults() {
  26. sess.User_id = 0
  27. sess.User_name = "Guest"
  28. sess.Roles = []string{"Guest", "Everyone"}
  29. sess.Expires = Expires
  30. }
  31. func (sess *Sess) Construct(req *gex.Req, res gex.Res) {
  32. sess.req = req
  33. sess.res = res
  34. sess.setDefaults()
  35. // check cookie is valid (not expired too)
  36. cookie, err := req.Cookie(TokenName)
  37. if err != nil {
  38. //fmt.Println("cookie error")
  39. return
  40. }
  41. // decode jwt to json bytes
  42. jsonByt, err := jwt.Decode(cookie, Secret)
  43. if err != nil {
  44. fmt.Println("jwt decode error")
  45. return
  46. }
  47. // decode json bytes to session
  48. err = json.Unmarshal(jsonByt, &sess)
  49. if err != nil {
  50. fmt.Println("jwt to session error")
  51. return
  52. }
  53. // if session token has expired, return default session
  54. if time.Now().After(sess.Expires) {
  55. fmt.Println("session expired")
  56. sess.setDefaults()
  57. }
  58. sess.Expires = Expires
  59. }
  60. func (sess *Sess) Token() (string, error) {
  61. jsonStr, err := json.Marshal(sess)
  62. if err != nil {
  63. return "", err
  64. }
  65. // encode the json to jwt and set the cookie
  66. token, err := jwt.Encode(jsonStr, Secret)
  67. if err != nil {
  68. return "", err
  69. }
  70. return token, nil
  71. }
  72. // Saves token to cookie
  73. func (sess *Sess) Save() {
  74. // get existing session or create new one
  75. // get the session token
  76. token, err := sess.Token()
  77. if err != nil {
  78. sess.res.Send(err.Error())
  79. return
  80. }
  81. // set the token cookie
  82. sess.res.Cookie(TokenName, token)
  83. }