3
0

Add extra RBAC bits for resource export controll

This commit is contained in:
Tomaž Jerman 2024-10-02 14:24:15 +02:00 committed by Jože Fortun
parent 62e62a9a8a
commit 192e830fa4
10 changed files with 148 additions and 1 deletions

View File

@ -99,6 +99,7 @@ chart: {
"read": {} "read": {}
"update": {} "update": {}
"delete": {} "delete": {}
"export": description: "Access to export charts"
} }
} }

View File

@ -118,6 +118,7 @@ module: {
"read": {} "read": {}
"update": {} "update": {}
"delete": {} "delete": {}
"export": description: "Access to export modules"
"record.create": description: "Create record" "record.create": description: "Create record"
"owned-record.create": description: "Create record with custom owner" "owned-record.create": description: "Create record with custom owner"
"records.search": description: "List, search or filter records" "records.search": description: "List, search or filter records"

View File

@ -77,13 +77,17 @@ namespace: {
"read": {} "read": {}
"update": {} "update": {}
"delete": {} "delete": {}
"export": description: "Access to export the entire namespace"
"manage": description: "Access to namespace admin panel" "manage": description: "Access to namespace admin panel"
"module.create": description: "Create module on namespace" "module.create": description: "Create module on namespace"
"modules.search": description: "List, search or filter module on namespace" "modules.search": description: "List, search or filter module on namespace"
"modules.export": description: "Export modules on namespace"
"chart.create": description: "Create chart on namespace" "chart.create": description: "Create chart on namespace"
"charts.search": description: "List, search or filter chart on namespace" "charts.search": description: "List, search or filter chart on namespace"
"charts.export": description: "Export charts on namespace"
"page.create": description: "Create page on namespace" "page.create": description: "Create page on namespace"
"pages.search": description: "List, search or filter pages on namespace" "pages.search": description: "List, search or filter pages on namespace"
"pages.export": description: "Export pages on namespace"
} }
} }

View File

@ -166,7 +166,7 @@ page: {
"read": {} "read": {}
"update": {} "update": {}
"delete": {} "delete": {}
"export": description: "Access to export pages"
"page-layout.create": description: "Create page layout on namespace" "page-layout.create": description: "Create page layout on namespace"
"page-layouts.search": description: "List, search or filter page layouts on namespace" "page-layouts.search": description: "List, search or filter page layouts on namespace"
} }

View File

@ -16,6 +16,7 @@ type (
CanGrant bool `json:"canGrant"` CanGrant bool `json:"canGrant"`
CanUpdateChart bool `json:"canUpdateChart"` CanUpdateChart bool `json:"canUpdateChart"`
CanExportChart bool `json:"canExportChart"`
CanDeleteChart bool `json:"canDeleteChart"` CanDeleteChart bool `json:"canDeleteChart"`
} }
@ -42,6 +43,7 @@ type (
CanGrant(context.Context) bool CanGrant(context.Context) bool
CanUpdateChart(context.Context, *types.Chart) bool CanUpdateChart(context.Context, *types.Chart) bool
CanExportChart(context.Context, *types.Chart) bool
CanDeleteChart(context.Context, *types.Chart) bool CanDeleteChart(context.Context, *types.Chart) bool
} }
) )
@ -154,6 +156,7 @@ func (ctrl Chart) makePayload(ctx context.Context, c *types.Chart, err error) (*
CanGrant: ctrl.ac.CanGrant(ctx), CanGrant: ctrl.ac.CanGrant(ctx),
CanUpdateChart: ctrl.ac.CanUpdateChart(ctx, c), CanUpdateChart: ctrl.ac.CanUpdateChart(ctx, c),
CanExportChart: ctrl.ac.CanExportChart(ctx, c),
CanDeleteChart: ctrl.ac.CanDeleteChart(ctx, c), CanDeleteChart: ctrl.ac.CanDeleteChart(ctx, c),
}, nil }, nil
} }

View File

@ -24,6 +24,7 @@ type (
Fields []*moduleFieldPayload `json:"fields"` Fields []*moduleFieldPayload `json:"fields"`
CanGrant bool `json:"canGrant"` CanGrant bool `json:"canGrant"`
CanExport bool `json:"canExport"`
CanUpdateModule bool `json:"canUpdateModule"` CanUpdateModule bool `json:"canUpdateModule"`
CanDeleteModule bool `json:"canDeleteModule"` CanDeleteModule bool `json:"canDeleteModule"`
CanCreateRecord bool `json:"canCreateRecord"` CanCreateRecord bool `json:"canCreateRecord"`
@ -47,6 +48,7 @@ type (
moduleAccessController interface { moduleAccessController interface {
CanGrant(context.Context) bool CanGrant(context.Context) bool
CanExportModule(context.Context, *types.Module) bool
CanUpdateModule(context.Context, *types.Module) bool CanUpdateModule(context.Context, *types.Module) bool
CanDeleteModule(context.Context, *types.Module) bool CanDeleteModule(context.Context, *types.Module) bool
CanCreateRecordOnModule(context.Context, *types.Module) bool CanCreateRecordOnModule(context.Context, *types.Module) bool
@ -189,6 +191,8 @@ func (ctrl Module) makePayload(ctx context.Context, m *types.Module, err error)
CanGrant: ctrl.ac.CanGrant(ctx), CanGrant: ctrl.ac.CanGrant(ctx),
CanExport: ctrl.ac.CanExportModule(ctx, m),
CanUpdateModule: ctrl.ac.CanUpdateModule(ctx, m), CanUpdateModule: ctrl.ac.CanUpdateModule(ctx, m),
CanDeleteModule: ctrl.ac.CanDeleteModule(ctx, m), CanDeleteModule: ctrl.ac.CanDeleteModule(ctx, m),

View File

@ -31,12 +31,16 @@ type (
*types.Namespace *types.Namespace
CanGrant bool `json:"canGrant"` CanGrant bool `json:"canGrant"`
CanExportNamespace bool `json:"canExportNamespace"`
CanUpdateNamespace bool `json:"canUpdateNamespace"` CanUpdateNamespace bool `json:"canUpdateNamespace"`
CanDeleteNamespace bool `json:"canDeleteNamespace"` CanDeleteNamespace bool `json:"canDeleteNamespace"`
CanManageNamespace bool `json:"canManageNamespace"` CanManageNamespace bool `json:"canManageNamespace"`
CanCreateModule bool `json:"canCreateModule"` CanCreateModule bool `json:"canCreateModule"`
CanExportModule bool `json:"canExportModule"`
CanCreateChart bool `json:"canCreateChart"` CanCreateChart bool `json:"canCreateChart"`
CanExportChart bool `json:"canExportChart"`
CanCreatePage bool `json:"canCreatePage"` CanCreatePage bool `json:"canCreatePage"`
CanExportPage bool `json:"canExportPage"`
} }
namespaceSetPayload struct { namespaceSetPayload struct {
@ -71,13 +75,17 @@ type (
namespaceAccessController interface { namespaceAccessController interface {
CanGrant(context.Context) bool CanGrant(context.Context) bool
CanExportNamespace(context.Context, *types.Namespace) bool
CanUpdateNamespace(context.Context, *types.Namespace) bool CanUpdateNamespace(context.Context, *types.Namespace) bool
CanDeleteNamespace(context.Context, *types.Namespace) bool CanDeleteNamespace(context.Context, *types.Namespace) bool
CanManageNamespace(context.Context, *types.Namespace) bool CanManageNamespace(context.Context, *types.Namespace) bool
CanCreateModuleOnNamespace(context.Context, *types.Namespace) bool CanCreateModuleOnNamespace(context.Context, *types.Namespace) bool
CanExportModulesOnNamespace(context.Context, *types.Namespace) bool
CanCreateChartOnNamespace(context.Context, *types.Namespace) bool CanCreateChartOnNamespace(context.Context, *types.Namespace) bool
CanExportChartsOnNamespace(context.Context, *types.Namespace) bool
CanCreatePageOnNamespace(context.Context, *types.Namespace) bool CanCreatePageOnNamespace(context.Context, *types.Namespace) bool
CanExportPagesOnNamespace(context.Context, *types.Namespace) bool
} }
) )
@ -351,13 +359,17 @@ func (ctrl Namespace) makePayload(ctx context.Context, ns *types.Namespace, err
Namespace: ns, Namespace: ns,
CanGrant: ctrl.ac.CanGrant(ctx), CanGrant: ctrl.ac.CanGrant(ctx),
CanExportNamespace: ctrl.ac.CanExportNamespace(ctx, ns),
CanUpdateNamespace: ctrl.ac.CanUpdateNamespace(ctx, ns), CanUpdateNamespace: ctrl.ac.CanUpdateNamespace(ctx, ns),
CanDeleteNamespace: ctrl.ac.CanDeleteNamespace(ctx, ns), CanDeleteNamespace: ctrl.ac.CanDeleteNamespace(ctx, ns),
CanManageNamespace: ctrl.ac.CanManageNamespace(ctx, ns), CanManageNamespace: ctrl.ac.CanManageNamespace(ctx, ns),
CanCreateModule: ctrl.ac.CanCreateModuleOnNamespace(ctx, ns), CanCreateModule: ctrl.ac.CanCreateModuleOnNamespace(ctx, ns),
CanExportModule: ctrl.ac.CanExportModulesOnNamespace(ctx, ns),
CanCreateChart: ctrl.ac.CanCreateChartOnNamespace(ctx, ns), CanCreateChart: ctrl.ac.CanCreateChartOnNamespace(ctx, ns),
CanExportChart: ctrl.ac.CanExportChartsOnNamespace(ctx, ns),
CanCreatePage: ctrl.ac.CanCreatePageOnNamespace(ctx, ns), CanCreatePage: ctrl.ac.CanCreatePageOnNamespace(ctx, ns),
CanExportPage: ctrl.ac.CanExportPagesOnNamespace(ctx, ns),
}, nil }, nil
} }
@ -421,6 +433,13 @@ func (ctrl Namespace) exportCompose(ctx context.Context, namespaceID uint64) (re
if err != nil { if err != nil {
return return
} }
// @todo this isn't ok, will do for now
if !ctrl.ac.CanExportNamespace(ctx, n) {
err = fmt.Errorf("not allowed to export namespace %s", n.Name)
return
}
nsNode, err := composeEnvoy.NamespaceToEnvoyNode(n) nsNode, err := composeEnvoy.NamespaceToEnvoyNode(n)
if err != nil { if err != nil {
return return

View File

@ -20,6 +20,7 @@ type (
Children []*pagePayload `json:"children,omitempty"` Children []*pagePayload `json:"children,omitempty"`
CanGrant bool `json:"canGrant"` CanGrant bool `json:"canGrant"`
CanExportPage bool `json:"canExportPage"`
CanUpdatePage bool `json:"canUpdatePage"` CanUpdatePage bool `json:"canUpdatePage"`
CanDeletePage bool `json:"canDeletePage"` CanDeletePage bool `json:"canDeletePage"`
} }
@ -60,6 +61,7 @@ type (
CanGrant(context.Context) bool CanGrant(context.Context) bool
CanUpdatePage(context.Context, *types.Page) bool CanUpdatePage(context.Context, *types.Page) bool
CanExportPage(context.Context, *types.Page) bool
CanDeletePage(context.Context, *types.Page) bool CanDeletePage(context.Context, *types.Page) bool
} }
) )
@ -273,6 +275,7 @@ func (ctrl Page) makePayload(ctx context.Context, c *types.Page, err error) (*pa
CanGrant: ctrl.ac.CanGrant(ctx), CanGrant: ctrl.ac.CanGrant(ctx),
CanUpdatePage: ctrl.ac.CanUpdatePage(ctx, c), CanUpdatePage: ctrl.ac.CanUpdatePage(ctx, c),
CanExportPage: ctrl.ac.CanExportPage(ctx, c),
CanDeletePage: ctrl.ac.CanDeletePage(ctx, c), CanDeletePage: ctrl.ac.CanDeletePage(ctx, c),
}, nil }, nil
} }

View File

@ -167,6 +167,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.ChartRbacResource(0, 0), "any": types.ChartRbacResource(0, 0),
"op": "delete", "op": "delete",
}, },
{
"type": types.ChartResourceType,
"any": types.ChartRbacResource(0, 0),
"op": "export",
},
{ {
"type": types.ModuleResourceType, "type": types.ModuleResourceType,
"any": types.ModuleRbacResource(0, 0), "any": types.ModuleRbacResource(0, 0),
@ -182,6 +187,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.ModuleRbacResource(0, 0), "any": types.ModuleRbacResource(0, 0),
"op": "delete", "op": "delete",
}, },
{
"type": types.ModuleResourceType,
"any": types.ModuleRbacResource(0, 0),
"op": "export",
},
{ {
"type": types.ModuleResourceType, "type": types.ModuleResourceType,
"any": types.ModuleRbacResource(0, 0), "any": types.ModuleRbacResource(0, 0),
@ -222,6 +232,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
"op": "delete", "op": "delete",
}, },
{
"type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0),
"op": "export",
},
{ {
"type": types.NamespaceResourceType, "type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
@ -237,6 +252,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
"op": "modules.search", "op": "modules.search",
}, },
{
"type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0),
"op": "modules.export",
},
{ {
"type": types.NamespaceResourceType, "type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
@ -247,6 +267,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
"op": "charts.search", "op": "charts.search",
}, },
{
"type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0),
"op": "charts.export",
},
{ {
"type": types.NamespaceResourceType, "type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
@ -257,6 +282,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.NamespaceRbacResource(0), "any": types.NamespaceRbacResource(0),
"op": "pages.search", "op": "pages.search",
}, },
{
"type": types.NamespaceResourceType,
"any": types.NamespaceRbacResource(0),
"op": "pages.export",
},
{ {
"type": types.PageResourceType, "type": types.PageResourceType,
"any": types.PageRbacResource(0, 0), "any": types.PageRbacResource(0, 0),
@ -272,6 +302,11 @@ func (svc accessControl) List() (out []map[string]string) {
"any": types.PageRbacResource(0, 0), "any": types.PageRbacResource(0, 0),
"op": "delete", "op": "delete",
}, },
{
"type": types.PageResourceType,
"any": types.PageRbacResource(0, 0),
"op": "export",
},
{ {
"type": types.PageResourceType, "type": types.PageResourceType,
"any": types.PageRbacResource(0, 0), "any": types.PageRbacResource(0, 0),
@ -470,6 +505,13 @@ func (svc accessControl) CanDeleteChart(ctx context.Context, r *types.Chart) boo
return svc.can(ctx, "delete", r) return svc.can(ctx, "delete", r)
} }
// CanExportChart checks if current user can access to export charts
//
// This function is auto-generated
func (svc accessControl) CanExportChart(ctx context.Context, r *types.Chart) bool {
return svc.can(ctx, "export", r)
}
// CanReadModule checks if current user can read // CanReadModule checks if current user can read
// //
// This function is auto-generated // This function is auto-generated
@ -491,6 +533,13 @@ func (svc accessControl) CanDeleteModule(ctx context.Context, r *types.Module) b
return svc.can(ctx, "delete", r) return svc.can(ctx, "delete", r)
} }
// CanExportModule checks if current user can access to export modules
//
// This function is auto-generated
func (svc accessControl) CanExportModule(ctx context.Context, r *types.Module) bool {
return svc.can(ctx, "export", r)
}
// CanCreateRecordOnModule checks if current user can create record // CanCreateRecordOnModule checks if current user can create record
// //
// This function is auto-generated // This function is auto-generated
@ -547,6 +596,13 @@ func (svc accessControl) CanDeleteNamespace(ctx context.Context, r *types.Namesp
return svc.can(ctx, "delete", r) return svc.can(ctx, "delete", r)
} }
// CanExportNamespace checks if current user can access to export the entire namespace
//
// This function is auto-generated
func (svc accessControl) CanExportNamespace(ctx context.Context, r *types.Namespace) bool {
return svc.can(ctx, "export", r)
}
// CanManageNamespace checks if current user can access to namespace admin panel // CanManageNamespace checks if current user can access to namespace admin panel
// //
// This function is auto-generated // This function is auto-generated
@ -568,6 +624,13 @@ func (svc accessControl) CanSearchModulesOnNamespace(ctx context.Context, r *typ
return svc.can(ctx, "modules.search", r) return svc.can(ctx, "modules.search", r)
} }
// CanExportModulesOnNamespace checks if current user can export modules on namespace
//
// This function is auto-generated
func (svc accessControl) CanExportModulesOnNamespace(ctx context.Context, r *types.Namespace) bool {
return svc.can(ctx, "modules.export", r)
}
// CanCreateChartOnNamespace checks if current user can create chart on namespace // CanCreateChartOnNamespace checks if current user can create chart on namespace
// //
// This function is auto-generated // This function is auto-generated
@ -582,6 +645,13 @@ func (svc accessControl) CanSearchChartsOnNamespace(ctx context.Context, r *type
return svc.can(ctx, "charts.search", r) return svc.can(ctx, "charts.search", r)
} }
// CanExportChartsOnNamespace checks if current user can export charts on namespace
//
// This function is auto-generated
func (svc accessControl) CanExportChartsOnNamespace(ctx context.Context, r *types.Namespace) bool {
return svc.can(ctx, "charts.export", r)
}
// CanCreatePageOnNamespace checks if current user can create page on namespace // CanCreatePageOnNamespace checks if current user can create page on namespace
// //
// This function is auto-generated // This function is auto-generated
@ -596,6 +666,13 @@ func (svc accessControl) CanSearchPagesOnNamespace(ctx context.Context, r *types
return svc.can(ctx, "pages.search", r) return svc.can(ctx, "pages.search", r)
} }
// CanExportPagesOnNamespace checks if current user can export pages on namespace
//
// This function is auto-generated
func (svc accessControl) CanExportPagesOnNamespace(ctx context.Context, r *types.Namespace) bool {
return svc.can(ctx, "pages.export", r)
}
// CanReadPage checks if current user can read // CanReadPage checks if current user can read
// //
// This function is auto-generated // This function is auto-generated
@ -617,6 +694,13 @@ func (svc accessControl) CanDeletePage(ctx context.Context, r *types.Page) bool
return svc.can(ctx, "delete", r) return svc.can(ctx, "delete", r)
} }
// CanExportPage checks if current user can access to export pages
//
// This function is auto-generated
func (svc accessControl) CanExportPage(ctx context.Context, r *types.Page) bool {
return svc.can(ctx, "export", r)
}
// CanCreatePageLayoutOnPage checks if current user can create page layout on namespace // CanCreatePageLayoutOnPage checks if current user can create page layout on namespace
// //
// This function is auto-generated // This function is auto-generated
@ -848,12 +932,14 @@ func rbacResourceOperations(r string) map[string]bool {
"read": true, "read": true,
"update": true, "update": true,
"delete": true, "delete": true,
"export": true,
} }
case types.ModuleResourceType: case types.ModuleResourceType:
return map[string]bool{ return map[string]bool{
"read": true, "read": true,
"update": true, "update": true,
"delete": true, "delete": true,
"export": true,
"record.create": true, "record.create": true,
"owned-record.create": true, "owned-record.create": true,
"records.search": true, "records.search": true,
@ -868,19 +954,24 @@ func rbacResourceOperations(r string) map[string]bool {
"read": true, "read": true,
"update": true, "update": true,
"delete": true, "delete": true,
"export": true,
"manage": true, "manage": true,
"module.create": true, "module.create": true,
"modules.search": true, "modules.search": true,
"modules.export": true,
"chart.create": true, "chart.create": true,
"charts.search": true, "charts.search": true,
"charts.export": true,
"page.create": true, "page.create": true,
"pages.search": true, "pages.search": true,
"pages.export": true,
} }
case types.PageResourceType: case types.PageResourceType:
return map[string]bool{ return map[string]bool{
"read": true, "read": true,
"update": true, "update": true,
"delete": true, "delete": true,
"export": true,
"page-layout.create": true, "page-layout.create": true,
"page-layouts.search": true, "page-layouts.search": true,
} }

View File

@ -5,12 +5,17 @@ allow:
corteza::compose:namespace/*: corteza::compose:namespace/*:
- read - read
- export
- modules.export
- charts.export
- pages.export
- pages.search - pages.search
- modules.search - modules.search
- charts.search - charts.search
corteza::compose:module/*/*: corteza::compose:module/*/*:
- read - read
- export
- records.search - records.search
corteza::compose:module-field/*/*/*: corteza::compose:module-field/*/*/*:
@ -18,12 +23,14 @@ allow:
corteza::compose:page/*/*: corteza::compose:page/*/*:
- read - read
- export
corteza::compose:page-layout/*/*/*: corteza::compose:page-layout/*/*/*:
- read - read
corteza::compose:chart/*/*: corteza::compose:chart/*/*:
- read - read
- export
corteza::compose:record/*/*/*: corteza::compose:record/*/*/*:
- read - read
@ -41,6 +48,10 @@ allow:
- update - update
- delete - delete
- manage - manage
- export
- modules.export
- charts.export
- pages.export
- page.create - page.create
- pages.search - pages.search
- module.create - module.create
@ -52,6 +63,7 @@ allow:
- read - read
- update - update
- delete - delete
- export
- record.create - record.create
- records.search - records.search
@ -69,11 +81,13 @@ allow:
- read - read
- update - update
- delete - delete
- export
corteza::compose:page/*/*: corteza::compose:page/*/*:
- read - read
- update - update
- delete - delete
- export
corteza::compose:page-layout/*/*/*: corteza::compose:page-layout/*/*/*:
- read - read
@ -93,6 +107,10 @@ allow:
- update - update
- delete - delete
- manage - manage
- export
- modules.export
- charts.export
- pages.export
- page.create - page.create
- pages.search - pages.search
- module.create - module.create
@ -104,6 +122,7 @@ allow:
- read - read
- update - update
- delete - delete
- export
- record.create - record.create
- records.search - records.search
@ -120,8 +139,10 @@ allow:
- read - read
- update - update
- delete - delete
- export
corteza::compose:page/*/*: corteza::compose:page/*/*:
- read - read
- update - update
- delete - delete
- export