diff --git a/.changeset/rich-maps-invite.md b/.changeset/rich-maps-invite.md new file mode 100644 index 0000000000..927d8e9382 --- /dev/null +++ b/.changeset/rich-maps-invite.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-node': patch +--- + +The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. diff --git a/.changeset/twenty-monkeys-applaud.md b/.changeset/twenty-monkeys-applaud.md new file mode 100644 index 0000000000..a1b0c1d338 --- /dev/null +++ b/.changeset/twenty-monkeys-applaud.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Resolved an issue where the `templateManagementPermission` was not being exposed through the `/permissions/metadata` endpoint. diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts index 24e1b91065..a38059e547 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts @@ -904,7 +904,7 @@ describe('createPermissionIntegrationRouter', () => { const response = await request( express().use( createPermissionIntegrationRouter({ - permissions: [aPermission], + permissions: [aPermission, testPermission], resources: [ { resourceType: 'test-resource', diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 40d215d515..5210e6fb1c 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -328,11 +328,16 @@ export function createPermissionIntegrationRouter< > ).rules || [], ); - const allPermissions = [ - ...((options as { permissions: Permission[] }).permissions || []), - ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || - []), - ]; + + const allPermissions = Array.from( + new Map( + [ + ...((options as { permissions: Permission[] }).permissions || []), + ...(optionsWithResources.resources?.flatMap(o => o.permissions || []) || + []), + ].map(i => [i.name, i]), + ).values(), + ); const allResourceTypes = allOptions.reduce((acc, option) => { if ( diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index d8888058e8..1758eb3fba 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -41,7 +41,7 @@ import { RESOURCE_TYPE_SCAFFOLDER_ACTION, RESOURCE_TYPE_SCAFFOLDER_TEMPLATE, scaffolderActionPermissions, - scaffolderTaskPermissions, + scaffolderPermissions, scaffolderTemplatePermissions, taskCancelPermission, taskCreatePermission, @@ -445,7 +445,7 @@ export async function createRouter( rules: actionRules, }, ], - permissions: scaffolderTaskPermissions, + permissions: scaffolderPermissions, }); router.use(permissionIntegrationRouter);