rtr.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package srv
  2. import (
  3. "net/http"
  4. "git.clearsky.net.au/cody/gex.git/utils"
  5. )
  6. var rtr *http.ServeMux
  7. var permissions = make(map[string][]string)
  8. /*
  9. Our Special HandleFunc
  10. */
  11. func Route(pattern string, roles []string, handler func(req *Req, res *Res)) {
  12. permissions[pattern] = roles
  13. realHandler := func(w http.ResponseWriter, r *http.Request) {
  14. var req Req
  15. var res Res
  16. var sess Sess
  17. req.Construct(r)
  18. res.Construct(w, r)
  19. sess.Construct(&req, &res)
  20. req.Sess = sess
  21. req.Sess.Save()
  22. // Route Access Check
  23. proceed := false
  24. pattern := req.Pattern
  25. for _, val := range permissions[pattern] {
  26. if sess.HasRole(val) {
  27. proceed = true
  28. break
  29. }
  30. }
  31. if !proceed {
  32. res.Redirect("/403?referrer=" + req.Path)
  33. return
  34. }
  35. // run middleware on request
  36. for _, fun := range middleware {
  37. err := fun(&req, &res)
  38. if err != nil {
  39. utils.Err(err)
  40. return
  41. }
  42. }
  43. handler(&req, &res)
  44. }
  45. rtr.HandleFunc(pattern, realHandler)
  46. }
  47. func InitRouter() {
  48. rtr = http.NewServeMux()
  49. // Public Files
  50. fs := http.FileServer(http.Dir("app/pub"))
  51. rtr.Handle("GET /app/pub/", http.StripPrefix("/app/pub/", fs))
  52. }