mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			134 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package ossaccesscontrol
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"errors"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/api/routing"
 | |
| 	"github.com/grafana/grafana/pkg/infra/db"
 | |
| 	"github.com/grafana/grafana/pkg/services/accesscontrol"
 | |
| 	"github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions"
 | |
| 	"github.com/grafana/grafana/pkg/services/dashboards"
 | |
| 	"github.com/grafana/grafana/pkg/services/featuremgmt"
 | |
| 	"github.com/grafana/grafana/pkg/services/folder"
 | |
| 	"github.com/grafana/grafana/pkg/services/libraryelements"
 | |
| 	"github.com/grafana/grafana/pkg/services/licensing"
 | |
| 	"github.com/grafana/grafana/pkg/services/team"
 | |
| 	"github.com/grafana/grafana/pkg/services/user"
 | |
| 	"github.com/grafana/grafana/pkg/setting"
 | |
| )
 | |
| 
 | |
| type FolderPermissionsService struct {
 | |
| 	*resourcepermissions.Service
 | |
| }
 | |
| 
 | |
| var FolderViewActions = []string{dashboards.ActionFoldersRead, accesscontrol.ActionAlertingRuleRead, libraryelements.ActionLibraryPanelsRead, accesscontrol.ActionAlertingSilencesRead}
 | |
| var FolderEditActions = append(FolderViewActions, []string{
 | |
| 	dashboards.ActionFoldersWrite,
 | |
| 	dashboards.ActionFoldersDelete,
 | |
| 	dashboards.ActionDashboardsCreate,
 | |
| 	accesscontrol.ActionAlertingRuleCreate,
 | |
| 	accesscontrol.ActionAlertingRuleUpdate,
 | |
| 	accesscontrol.ActionAlertingRuleDelete,
 | |
| 	accesscontrol.ActionAlertingSilencesCreate,
 | |
| 	accesscontrol.ActionAlertingSilencesWrite,
 | |
| 	libraryelements.ActionLibraryPanelsCreate,
 | |
| 	libraryelements.ActionLibraryPanelsWrite,
 | |
| 	libraryelements.ActionLibraryPanelsDelete,
 | |
| }...)
 | |
| var FolderAdminActions = append(FolderEditActions, []string{dashboards.ActionFoldersPermissionsRead, dashboards.ActionFoldersPermissionsWrite}...)
 | |
| 
 | |
| func registerFolderRoles(cfg *setting.Cfg, features featuremgmt.FeatureToggles, service accesscontrol.Service) error {
 | |
| 	if !cfg.RBAC.PermissionsWildcardSeed("folder") {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	viewer := accesscontrol.RoleRegistration{
 | |
| 		Role: accesscontrol.RoleDTO{
 | |
| 			Name:        "fixed:folders:viewer",
 | |
| 			DisplayName: "Viewer",
 | |
| 			Description: "View all folders and dashboards.",
 | |
| 			Group:       "Folders",
 | |
| 			Permissions: accesscontrol.PermissionsForActions(append(getDashboardViewActions(features), FolderViewActions...), dashboards.ScopeFoldersAll),
 | |
| 			Hidden:      true,
 | |
| 		},
 | |
| 		Grants: []string{"Viewer"},
 | |
| 	}
 | |
| 
 | |
| 	editor := accesscontrol.RoleRegistration{
 | |
| 		Role: accesscontrol.RoleDTO{
 | |
| 			Name:        "fixed:folders:editor",
 | |
| 			DisplayName: "Editor",
 | |
| 			Description: "Edit all folders and dashboards.",
 | |
| 			Group:       "Folders",
 | |
| 			Permissions: accesscontrol.PermissionsForActions(append(getDashboardEditActions(features), FolderEditActions...), dashboards.ScopeFoldersAll),
 | |
| 			Hidden:      true,
 | |
| 		},
 | |
| 		Grants: []string{"Editor"},
 | |
| 	}
 | |
| 
 | |
| 	admin := accesscontrol.RoleRegistration{
 | |
| 		Role: accesscontrol.RoleDTO{
 | |
| 			Name:        "fixed:folders:admin",
 | |
| 			DisplayName: "Admin",
 | |
| 			Description: "Administer all folders and dashboards",
 | |
| 			Group:       "folders",
 | |
| 			Permissions: accesscontrol.PermissionsForActions(append(getDashboardAdminActions(features), FolderAdminActions...), dashboards.ScopeFoldersAll),
 | |
| 			Hidden:      true,
 | |
| 		},
 | |
| 		Grants: []string{"Admin"},
 | |
| 	}
 | |
| 
 | |
| 	return service.DeclareFixedRoles(viewer, editor, admin)
 | |
| }
 | |
| 
 | |
| func ProvideFolderPermissions(
 | |
| 	cfg *setting.Cfg, features featuremgmt.FeatureToggles, router routing.RouteRegister, sql db.DB, accesscontrol accesscontrol.AccessControl,
 | |
| 	license licensing.Licensing, dashboardStore dashboards.Store, folderService folder.Service, service accesscontrol.Service,
 | |
| 	teamService team.Service, userService user.Service, actionSetService resourcepermissions.ActionSetService,
 | |
| ) (*FolderPermissionsService, error) {
 | |
| 	if err := registerFolderRoles(cfg, features, service); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	options := resourcepermissions.Options{
 | |
| 		Resource:          "folders",
 | |
| 		ResourceAttribute: "uid",
 | |
| 		ResourceValidator: func(ctx context.Context, orgID int64, resourceID string) error {
 | |
| 			query := &dashboards.GetDashboardQuery{UID: resourceID, OrgID: orgID}
 | |
| 			queryResult, err := dashboardStore.GetDashboard(ctx, query)
 | |
| 			if err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 
 | |
| 			if !queryResult.IsFolder {
 | |
| 				return errors.New("not found")
 | |
| 			}
 | |
| 
 | |
| 			return nil
 | |
| 		},
 | |
| 		InheritedScopesSolver: func(ctx context.Context, orgID int64, resourceID string) ([]string, error) {
 | |
| 			return dashboards.GetInheritedScopes(ctx, orgID, resourceID, folderService)
 | |
| 		},
 | |
| 		Assignments: resourcepermissions.Assignments{
 | |
| 			Users:           true,
 | |
| 			Teams:           true,
 | |
| 			BuiltInRoles:    true,
 | |
| 			ServiceAccounts: true,
 | |
| 		},
 | |
| 		PermissionsToActions: map[string][]string{
 | |
| 			"View":  append(getDashboardViewActions(features), FolderViewActions...),
 | |
| 			"Edit":  append(getDashboardEditActions(features), FolderEditActions...),
 | |
| 			"Admin": append(getDashboardAdminActions(features), FolderAdminActions...),
 | |
| 		},
 | |
| 		ReaderRoleName: "Folder permission reader",
 | |
| 		WriterRoleName: "Folder permission writer",
 | |
| 		RoleGroup:      "Folders",
 | |
| 	}
 | |
| 	srv, err := resourcepermissions.New(cfg, options, features, router, license, accesscontrol, service, sql, teamService, userService, actionSetService)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return &FolderPermissionsService{srv}, nil
 | |
| }
 |