quota.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package quota
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. m "github.com/grafana/grafana/pkg/models"
  5. "github.com/grafana/grafana/pkg/registry"
  6. "github.com/grafana/grafana/pkg/setting"
  7. )
  8. func init() {
  9. registry.RegisterService(&QuotaService{})
  10. }
  11. type QuotaService struct {
  12. AuthTokenService m.UserTokenService `inject:""`
  13. }
  14. func (qs *QuotaService) Init() error {
  15. return nil
  16. }
  17. func (qs *QuotaService) QuotaReached(c *m.ReqContext, target string) (bool, error) {
  18. if !setting.Quota.Enabled {
  19. return false, nil
  20. }
  21. // get the list of scopes that this target is valid for. Org, User, Global
  22. scopes, err := m.GetQuotaScopes(target)
  23. if err != nil {
  24. return false, err
  25. }
  26. for _, scope := range scopes {
  27. c.Logger.Debug("Checking quota", "target", target, "scope", scope)
  28. switch scope.Name {
  29. case "global":
  30. if scope.DefaultLimit < 0 {
  31. continue
  32. }
  33. if scope.DefaultLimit == 0 {
  34. return true, nil
  35. }
  36. if target == "session" {
  37. usedSessions, err := qs.AuthTokenService.ActiveTokenCount()
  38. if err != nil {
  39. return false, err
  40. }
  41. if int64(usedSessions) > scope.DefaultLimit {
  42. c.Logger.Debug("Sessions limit reached", "active", usedSessions, "limit", scope.DefaultLimit)
  43. return true, nil
  44. }
  45. continue
  46. }
  47. query := m.GetGlobalQuotaByTargetQuery{Target: scope.Target}
  48. if err := bus.Dispatch(&query); err != nil {
  49. return true, err
  50. }
  51. if query.Result.Used >= scope.DefaultLimit {
  52. return true, nil
  53. }
  54. case "org":
  55. if !c.IsSignedIn {
  56. continue
  57. }
  58. query := m.GetOrgQuotaByTargetQuery{OrgId: c.OrgId, Target: scope.Target, Default: scope.DefaultLimit}
  59. if err := bus.Dispatch(&query); err != nil {
  60. return true, err
  61. }
  62. if query.Result.Limit < 0 {
  63. continue
  64. }
  65. if query.Result.Limit == 0 {
  66. return true, nil
  67. }
  68. if query.Result.Used >= query.Result.Limit {
  69. return true, nil
  70. }
  71. case "user":
  72. if !c.IsSignedIn || c.UserId == 0 {
  73. continue
  74. }
  75. query := m.GetUserQuotaByTargetQuery{UserId: c.UserId, Target: scope.Target, Default: scope.DefaultLimit}
  76. if err := bus.Dispatch(&query); err != nil {
  77. return true, err
  78. }
  79. if query.Result.Limit < 0 {
  80. continue
  81. }
  82. if query.Result.Limit == 0 {
  83. return true, nil
  84. }
  85. if query.Result.Used >= query.Result.Limit {
  86. return true, nil
  87. }
  88. }
  89. }
  90. return false, nil
  91. }