Folder permissions: Remove default creator can Admin permissions for folders (#111984)

* Remove default creator can Admin permissions for folders

* Actually, we only need to set permissions for root level folders

* Put back creator permission

* linting

* use FT for assessing what permissions to set

* fix tests
This commit is contained in:
Ieva
2025-10-14 14:54:19 +01:00
committed by GitHub
parent f27900702c
commit aeb041a9af
4 changed files with 22 additions and 16 deletions
+11 -2
View File
@@ -19,6 +19,7 @@ import (
"github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
"github.com/grafana/grafana/pkg/services/dashboards/dashboardaccess"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/org"
)
@@ -39,6 +40,7 @@ type folderStorage struct {
tableConverter rest.TableConvertor
permissionsOnCreate bool // cfg.RBAC.PermissionsOnCreation("folder")
features featuremgmt.FeatureToggles
folderPermissionsSvc accesscontrol.FolderPermissionsService
acService accesscontrol.Service
}
@@ -152,23 +154,30 @@ func (s *folderStorage) DeleteCollection(ctx context.Context, deleteValidation r
func (s *folderStorage) setDefaultFolderPermissions(ctx context.Context, orgID int64, user identity.Requester, uid, parentUID string) error {
var permissions []accesscontrol.SetResourcePermissionCommand
isNested := parentUID != ""
if s.features.IsEnabledGlobally(featuremgmt.FlagKubernetesDashboards) && isNested {
// No permissions on nested folders when kubernetesDashboards is enabled
return nil
}
// Creator permissions always set with the legacy behaviour and set on root level folders for new behaviour
if user.IsIdentityType(claims.TypeUser, claims.TypeServiceAccount) {
userID, err := user.GetInternalID()
if err != nil {
return err
}
permissions = append(permissions, accesscontrol.SetResourcePermissionCommand{
UserID: userID, Permission: dashboardaccess.PERMISSION_ADMIN.String(),
})
}
isNested := parentUID != ""
if !isNested {
permissions = append(permissions, []accesscontrol.SetResourcePermissionCommand{
{BuiltinRole: string(org.RoleEditor), Permission: dashboardaccess.PERMISSION_EDIT.String()},
{BuiltinRole: string(org.RoleViewer), Permission: dashboardaccess.PERMISSION_VIEW.String()},
}...)
}
_, err := s.folderPermissionsSvc.SetPermissions(ctx, orgID, uid, permissions...)
if err != nil {
return err
@@ -17,6 +17,7 @@ import (
"github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/accesscontrol/actest"
acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting"
)
@@ -54,6 +55,7 @@ func TestSetDefaultPermissionsWhenCreatingFolder(t *testing.T) {
acService: actest.FakeService{},
store: store,
permissionsOnCreate: cfg.RBAC.PermissionsOnCreation("folder"),
features: featuremgmt.WithFeatures(),
}
obj := &folders.Folder{}
+1
View File
@@ -168,6 +168,7 @@ func (b *FolderAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver.API
b.storage = &folderStorage{
tableConverter: resourceInfo.TableConverter(),
folderPermissionsSvc: b.folderPermissionsSvc,
features: b.features,
acService: b.acService,
permissionsOnCreate: b.permissionsOnCreate,
store: dw,
@@ -1179,30 +1179,24 @@ func (dr *DashboardServiceImpl) SetDefaultPermissionsAfterCreate(ctx context.Con
return err
}
permissions := []accesscontrol.SetResourcePermissionCommand{}
isNested := obj.GetFolder() != ""
if dr.features.IsEnabledGlobally(featuremgmt.FlagKubernetesDashboards) && isNested {
// Don't set any permissions for nested dashboards
return nil
}
if user.IsIdentityType(claims.TypeUser, claims.TypeServiceAccount) {
permissions = append(permissions, accesscontrol.SetResourcePermissionCommand{
UserID: uid, Permission: dashboardaccess.PERMISSION_ADMIN.String(),
})
}
isNested := obj.GetFolder() != ""
if !dr.features.IsEnabledGlobally(featuremgmt.FlagKubernetesDashboards) {
// legacy behavior
if !isNested {
permissions = append(permissions, []accesscontrol.SetResourcePermissionCommand{
{BuiltinRole: string(org.RoleEditor), Permission: dashboardaccess.PERMISSION_EDIT.String()},
{BuiltinRole: string(org.RoleViewer), Permission: dashboardaccess.PERMISSION_VIEW.String()},
}...)
}
} else {
// Don't set any permissions for nested dashboards
if isNested {
return nil
}
if !isNested {
permissions = append(permissions, []accesscontrol.SetResourcePermissionCommand{
{BuiltinRole: string(org.RoleEditor), Permission: dashboardaccess.PERMISSION_EDIT.String()},
{BuiltinRole: string(org.RoleViewer), Permission: dashboardaccess.PERMISSION_VIEW.String()},
}...)
}
svc := dr.getPermissionsService(key.Resource == "folders")
if _, err := svc.SetPermissions(ctx, ns.OrgID, obj.GetName(), permissions...); err != nil {
logger.Error("Could not set default permissions", "error", err)