From f9d0371beee55c7442030af5fddc84e4fbd9c7dd Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Fri, 9 Dec 2022 12:29:01 +0000 Subject: [PATCH] [v9.3.x] Login: Fix failure to login a new user via an external provider if quota are enabled (#60086) Login: Fix failure to login a new user via an external provider if quota are enabled (#60015) * Login: Fix failure to login a new user via an external provider if quota are enabled (cherry picked from commit 341d7b01ee6f8a4f73a8d7b46d12e0a4db476134) Co-authored-by: Sofia Papagiannaki <1632407+papagian@users.noreply.github.com> --- pkg/services/quota/model.go | 2 ++ pkg/services/quota/quotaimpl/quota.go | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/services/quota/model.go b/pkg/services/quota/model.go index 091c60c4f366..c9915bebb0cd 100644 --- a/pkg/services/quota/model.go +++ b/pkg/services/quota/model.go @@ -11,7 +11,9 @@ import ( var ErrBadRequest = errutil.NewBase(errutil.StatusBadRequest, "quota.bad-request") var ErrInvalidTargetSrv = errutil.NewBase(errutil.StatusBadRequest, "quota.invalid-target") var ErrInvalidScope = errutil.NewBase(errutil.StatusBadRequest, "quota.invalid-scope") +var ErrFailedToGetScope = errutil.NewBase(errutil.StatusInternal, "quota.failed-get-scope") var ErrInvalidTarget = errutil.NewBase(errutil.StatusInternal, "quota.invalid-target-table") +var ErrUsageFoundForTarget = errutil.NewBase(errutil.StatusNotFound, "quota.missing-target-usage") var ErrTargetSrvConflict = errutil.NewBase(errutil.StatusBadRequest, "quota.target-srv-conflict") var ErrDisabled = errutil.NewBase(errutil.StatusForbidden, "quota.disabled", errutil.WithPublicMessage("Quotas not enabled")) var ErrInvalidTagFormat = errutil.NewBase(errutil.StatusInternal, "quota.invalid-invalid-tag-format") diff --git a/pkg/services/quota/quotaimpl/quota.go b/pkg/services/quota/quotaimpl/quota.go index 9cc8be38af53..65763f204633 100644 --- a/pkg/services/quota/quotaimpl/quota.go +++ b/pkg/services/quota/quotaimpl/quota.go @@ -2,7 +2,6 @@ package quotaimpl import ( "context" - "fmt" "sync" "github.com/grafana/grafana/pkg/infra/db" @@ -205,9 +204,24 @@ func (s *service) CheckQuotaReached(ctx context.Context, targetSrv quota.TargetS case limit == 0: return true, nil default: + scope, err := t.GetScope() + if err != nil { + return false, quota.ErrFailedToGetScope.Errorf("failed to get the scope for target: %s", t) + } + + // do not check user quota if the user information is not available (eg no user is signed in) + if scope == quota.UserScope && (scopeParams == nil || scopeParams.UserID == 0) { + continue + } + + // do not check user quota if the org information is not available (eg no user is signed in) + if scope == quota.OrgScope && (scopeParams == nil || scopeParams.OrgID == 0) { + continue + } + u, ok := targetUsage.Get(t) if !ok { - return false, fmt.Errorf("no usage for target:%s", t) + return false, quota.ErrUsageFoundForTarget.Errorf("no usage for target:%s", t) } if u >= limit { return true, nil