middleware.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package sec
  2. import (
  3. "errors"
  4. "git.clearsky.net.au/cody/gex.git/sess"
  5. "git.clearsky.net.au/cody/gex.git/srv"
  6. "git.clearsky.net.au/cody/gex.git/utils"
  7. )
  8. func Middleware(req *srv.Req, res *srv.Res) error {
  9. sess, err := sess.GetCtxSess(req)
  10. if err != nil {
  11. utils.Err(err)
  12. return err
  13. }
  14. // default auth
  15. auth := Auth{0, "Guest", []string{"Guest", "Everyone"}}
  16. // if auth context exists, convert it to an Auth type
  17. if sess.Data["Auth"] != nil {
  18. sessAuth, ok := sess.Data["Auth"].(map[string]any)
  19. if !ok {
  20. err := errors.New("auth context in session data is not of the expected type, request cancelled")
  21. utils.Err(err)
  22. return err
  23. }
  24. auth.User_id, ok = sessAuth["User_id"].(float64)
  25. if !ok {
  26. err := errors.New("auth context in session data is not of the expected type, request cancelled")
  27. utils.Err(err)
  28. return err
  29. }
  30. auth.User_name, ok = sessAuth["User_name"].(string)
  31. if !ok {
  32. err := errors.New("auth context in session data is not of the expected type, request cancelled")
  33. utils.Err(err)
  34. return err
  35. }
  36. sessAuthRoles, ok := sessAuth["Roles"].([]any)
  37. if !ok {
  38. err := errors.New("auth context in session data is not of the expected type, request cancelled")
  39. utils.Err(err)
  40. return err
  41. }
  42. auth.Roles = []string{}
  43. for _, v := range sessAuthRoles {
  44. val, ok := v.(string)
  45. if !ok {
  46. err := errors.New("auth context in session data is not of the expected type, request cancelled")
  47. utils.Err(err)
  48. return err
  49. }
  50. auth.Roles = append(auth.Roles, val)
  51. }
  52. }
  53. sess.Data["Auth"] = auth
  54. sess.Save()
  55. // Route Access Check
  56. pattern := req.Pattern
  57. if permissions[pattern] == nil {
  58. return nil
  59. }
  60. for _, val := range permissions[pattern] {
  61. if auth.HasRole(val) {
  62. return nil
  63. }
  64. }
  65. res.Send("No Access")
  66. return errors.New("no access, request cancelled")
  67. }