Code Diff
diff --git a/pkg/services/authz/zanzana/common/translations.go b/pkg/services/authz/zanzana/common/translations.go
index 8094231d6483c..25175852d25c4 100644
--- a/pkg/services/authz/zanzana/common/translations.go
+++ b/pkg/services/authz/zanzana/common/translations.go
@@ -78,6 +78,11 @@ var resourceTranslations = map[string]resourceTranslation{
"dashboards:write": newScopedMapping(RelationUpdate, dashboardGroup, dashboardResource, ""),
"dashboards:create": newScopedMapping(RelationCreate, dashboardGroup, dashboardResource, ""),
"dashboards:delete": newScopedMapping(RelationDelete, dashboardGroup, dashboardResource, ""),
+ // Permission management
+ "folders.permissions:read": newMapping(RelationGetPermissions, ""),
+ "folders.permissions:write": newMapping(RelationSetPermissions, ""),
+ "dashboards.permissions:read": newScopedMapping(RelationGetPermissions, dashboardGroup, dashboardResource, ""),
+ "dashboards.permissions:write": newScopedMapping(RelationSetPermissions, dashboardGroup, dashboardResource, ""),
// Action sets
"folders:view": newMapping(RelationSetView, ""),
"folders:edit": newMapping(RelationSetEdit, ""),
@@ -96,6 +101,9 @@ var resourceTranslations = map[string]resourceTranslation{
"dashboards:write": newMapping(RelationUpdate, ""),
"dashboards:create": newMapping(RelationCreate, ""),
"dashboards:delete": newMapping(RelationDelete, ""),
+ // Permission management
+ "dashboards.permissions:read": newMapping(RelationGetPermissions, ""),
+ "dashboards.permissions:write": newMapping(RelationSetPermissions, ""),
// Action sets
"dashboards:view": newMapping(RelationSetView, ""),
"dashboards:edit": newMapping(RelationSetEdit, ""),
diff --git a/pkg/services/authz/zanzana/common/tuple_test.go b/pkg/services/authz/zanzana/common/tuple_test.go
index ecb4d6e9dd1af..722694e8e8578 100644
--- a/pkg/services/authz/zanzana/common/tuple_test.go
+++ b/pkg/services/authz/zanzana/common/tuple_test.go
@@ -77,6 +77,84 @@ func TestTranslateToResourceTuple(t *testing.T) {
Object: "group_resource:folder.grafana.app/folders",
},
},
+ {
+ testName: "folders.permissions:write for all folders",
+ subject: "user:1",
+ action: "folders.permissions:write",
+ kind: "folders",
+ name: "*",
+ expected: &openfgav1.TupleKey{
+ User: "user:1",
+ Relation: "set_permissions",
+ Object: "group_resource:folder.grafana.app/folders",
+ },
+ },
+ {
+ testName: "folders.permissions:read for a specific folder",
+ subject: "user:1",
+ action: "folders.permissions:read",
+ kind: "folders",
+ name: "fold1",
+ expected: &openfgav1.TupleKey{
+ User: "user:1",
+ Relation: "get_permissions",
+ Object: "folder:fold1",
+ },
+ },
+ {
+ testName: "dashboards.permissions:write for all dashboards in a folder",
+ subject: "user:1",
+ action: "dashboards.permissions:write",
+ kind: "folders",
+ name: "fold1",
+ expected: &openfgav1.TupleKey{
+ User: "user:1",
+ Relation: "resource_set_permissions",
+ Object: "folder:fold1",
+ Condition: &openfgav1.RelationshipCondition{
+ Name: "subresource_filter",
+ Context: &structpb.Struct{
+ Fields: map[string]*structpb.Value{
+ "subresources": structpb.NewListValue(&structpb.ListValue{
+ Values: []*structpb.Value{structpb.NewStringValue("dashboard.grafana.app/dashboards")},
+ }),
+ },
+ },
+ },
+ },
+ },
+ {
+ testName: "dashboards.permissions:write for all dashboards in folders kind",
+ subject: "user:1",
+ action: "dashboards.permissions:write",
+ kind: "folders",
+ name: "*",
+ expected: &openfgav1.TupleKey{
+ User: "user:1",
+ Relation: "set_permissions",
+ Object: "group_resource:dashboard.grafana.app/dashboards",
+ },
+ },
+ {
+ testName: "dashboards.permissions:read for a specific dashboard",
+ subject: "user:1",
+ action: "dashboards.permissions:read",
+ kind: "dashboards",
+ name: "dash1",
+ expected: &openfgav1.TupleKey{
+ User: "user:1",
+ Relation: "get_permissions",
+ Object: "resource:dashboard.grafana.app/dashboards/dash1",
+ Condition: &openfgav1.RelationshipCondition{
+ Name: "group_filter",
+ Context: &structpb.Struct{
+ Fields: map[string]*structpb.Value{
+ "group_resource": structpb.NewStringValue("dashboard.grafana.app/dashboards"),
+ },
+ },
+ },
+ },
+ },
}
for _, test := range tests {