api_auth.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package api
  2. import (
  3. "errors"
  4. "strconv"
  5. "github.com/torkelo/grafana-pro/pkg/models"
  6. "github.com/gin-gonic/gin"
  7. "github.com/gorilla/sessions"
  8. )
  9. type authContext struct {
  10. account *models.Account
  11. userAccount *models.Account
  12. }
  13. func (auth *authContext) getAccountId() int {
  14. return auth.account.Id
  15. }
  16. func (self *HttpServer) authDenied(c *gin.Context) {
  17. c.Writer.Header().Set("Location", "/login")
  18. c.Abort(302)
  19. }
  20. func authGetRequestAccountId(c *gin.Context, session *sessions.Session) (int, error) {
  21. accountId := session.Values["accountId"]
  22. urlQuery := c.Request.URL.Query()
  23. if len(urlQuery["render"]) > 0 {
  24. accId, _ := strconv.Atoi(urlQuery["accountId"][0])
  25. session.Values["accountId"] = accId
  26. accountId = accId
  27. }
  28. if accountId == nil {
  29. return -1, errors.New("Auth: session account id not found")
  30. }
  31. return accountId.(int), nil
  32. }
  33. func (self *HttpServer) auth() gin.HandlerFunc {
  34. return func(c *gin.Context) {
  35. session, _ := sessionStore.Get(c.Request, "grafana-session")
  36. accountId, err := authGetRequestAccountId(c, session)
  37. if err != nil && c.Request.URL.Path != "/login" {
  38. self.authDenied(c)
  39. return
  40. }
  41. account, err := self.store.GetAccount(accountId)
  42. if err != nil {
  43. self.authDenied(c)
  44. return
  45. }
  46. usingAccount, err := self.store.GetAccount(account.UsingAccountId)
  47. if err != nil {
  48. self.authDenied(c)
  49. return
  50. }
  51. c.Set("userAccount", account)
  52. c.Set("usingAccount", usingAccount)
  53. session.Save(c.Request, c.Writer)
  54. }
  55. }