* Usage Stats: Rename service to use a more idiomatic name * Usage Stats: Update MetricsFunc definition and implementations * Revert "Usage Stats: Rename service to use a more idiomatic name" This reverts commit910ecce3e8. * Usage Stats: Update MetricsFunc definition and implementations (cherry picked from commitf601921670)
98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
package ossaccesscontrol
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
|
"github.com/grafana/grafana/pkg/infra/usagestats"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
|
"github.com/grafana/grafana/pkg/services/accesscontrol/evaluator"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
// OSSAccessControlService is the service implementing role based access control.
|
|
type OSSAccessControlService struct {
|
|
Cfg *setting.Cfg `inject:""`
|
|
UsageStats usagestats.UsageStats `inject:""`
|
|
Log log.Logger
|
|
}
|
|
|
|
// Init initializes the OSSAccessControlService.
|
|
func (ac *OSSAccessControlService) Init() error {
|
|
ac.Log = log.New("accesscontrol")
|
|
|
|
ac.registerUsageMetrics()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ac *OSSAccessControlService) IsDisabled() bool {
|
|
if ac.Cfg == nil {
|
|
return true
|
|
}
|
|
|
|
_, exists := ac.Cfg.FeatureToggles["accesscontrol"]
|
|
return !exists
|
|
}
|
|
|
|
func (ac *OSSAccessControlService) registerUsageMetrics() {
|
|
ac.UsageStats.RegisterMetricsFunc(func() (map[string]interface{}, error) {
|
|
return map[string]interface{}{
|
|
"stats.oss.accesscontrol.enabled.count": ac.getUsageMetrics(),
|
|
}, nil
|
|
})
|
|
}
|
|
|
|
func (ac *OSSAccessControlService) getUsageMetrics() interface{} {
|
|
if ac.IsDisabled() {
|
|
return 0
|
|
}
|
|
|
|
return 1
|
|
}
|
|
|
|
// Evaluate evaluates access to the given resource
|
|
func (ac *OSSAccessControlService) Evaluate(ctx context.Context, user *models.SignedInUser, permission string, scope ...string) (bool, error) {
|
|
return evaluator.Evaluate(ctx, ac, user, permission, scope...)
|
|
}
|
|
|
|
// GetUserPermissions returns user permissions based on built-in roles
|
|
func (ac *OSSAccessControlService) GetUserPermissions(ctx context.Context, user *models.SignedInUser) ([]*accesscontrol.Permission, error) {
|
|
timer := prometheus.NewTimer(metrics.MAccessPermissionsSummary)
|
|
defer timer.ObserveDuration()
|
|
|
|
builtinRoles := ac.GetUserBuiltInRoles(user)
|
|
permissions := make([]*accesscontrol.Permission, 0)
|
|
for _, builtin := range builtinRoles {
|
|
if roleNames, ok := accesscontrol.FixedRoleGrants[builtin]; ok {
|
|
for _, name := range roleNames {
|
|
r, exists := accesscontrol.FixedRoles[name]
|
|
if !exists {
|
|
continue
|
|
}
|
|
for _, p := range r.Permissions {
|
|
permission := p
|
|
permissions = append(permissions, &permission)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return permissions, nil
|
|
}
|
|
|
|
func (ac *OSSAccessControlService) GetUserBuiltInRoles(user *models.SignedInUser) []string {
|
|
roles := []string{string(user.OrgRole)}
|
|
for _, role := range user.OrgRole.Children() {
|
|
roles = append(roles, string(role))
|
|
}
|
|
if user.IsGrafanaAdmin {
|
|
roles = append(roles, accesscontrol.RoleGrafanaAdmin)
|
|
}
|
|
|
|
return roles
|
|
}
|