Merge pull request #26947 from stephenglass/scaffolder-permission-tasklist1

fix(scaffolder): only show task routes with permission
This commit is contained in:
Ben Lambert
2024-10-15 11:07:43 +02:00
committed by GitHub
5 changed files with 37 additions and 6 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder-react': patch
'@backstage/plugin-scaffolder': patch
---
Scaffolder task routes require read permission to access. The tasks list option in the scaffolder page context menu only shows with permission.
@@ -27,6 +27,8 @@ import Edit from '@material-ui/icons/Edit';
import List from '@material-ui/icons/List';
import MoreVert from '@material-ui/icons/MoreVert';
import React, { useState } from 'react';
import { usePermission } from '@backstage/plugin-permission-react';
import { taskReadPermission } from '@backstage/plugin-scaffolder-common/alpha';
const useStyles = makeStyles(theme => ({
button: {
@@ -55,6 +57,10 @@ export function ScaffolderPageContextMenu(
const classes = useStyles();
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();
const { allowed: canReadTasks } = usePermission({
permission: taskReadPermission,
});
if (!onEditorClicked && !onActionsClicked) {
return null;
}
@@ -116,7 +122,7 @@ export function ScaffolderPageContextMenu(
<ListItemText primary="Installed Actions" />
</MenuItem>
)}
{onTasksClicked && (
{onTasksClicked && canReadTasks && (
<MenuItem onClick={onTasksClicked}>
<ListItemIcon>
<List fontSize="small" />
@@ -23,6 +23,7 @@ import { renderInTestApp, TestApiRegistry } from '@backstage/test-utils';
import { ApiProvider } from '@backstage/core-app-api';
import { rootRouteRef } from '../../routes';
import { userEvent } from '@testing-library/user-event';
import { permissionApiRef } from '@backstage/plugin-permission-react';
const scaffolderApiMock: jest.Mocked<ScaffolderApi> = {
scaffold: jest.fn(),
@@ -36,7 +37,11 @@ const scaffolderApiMock: jest.Mocked<ScaffolderApi> = {
autocomplete: jest.fn(),
};
const apis = TestApiRegistry.from([scaffolderApiRef, scaffolderApiMock]);
const mockPermissionApi = { authorize: jest.fn() };
const apis = TestApiRegistry.from(
[scaffolderApiRef, scaffolderApiMock],
[permissionApiRef, mockPermissionApi],
);
describe('TemplatePage', () => {
beforeEach(() => jest.resetAllMocks());
@@ -31,6 +31,7 @@ import {
} from '@backstage/plugin-scaffolder-react';
import { act, fireEvent } from '@testing-library/react';
import { rootRouteRef } from '../../routes';
import { permissionApiRef } from '@backstage/plugin-permission-react';
describe('<ListTasksPage />', () => {
const catalogApi = catalogApiMock.mock();
@@ -43,6 +44,8 @@ describe('<ListTasksPage />', () => {
listTasks: jest.fn(),
} as any;
const mockPermissionApi = { authorize: jest.fn() };
it('should render the page', async () => {
const entity: Entity = {
apiVersion: 'v1',
@@ -66,6 +69,7 @@ describe('<ListTasksPage />', () => {
[catalogApiRef, catalogApi],
[identityApiRef, identityApi],
[scaffolderApiRef, scaffolderApiMock],
[permissionApiRef, mockPermissionApi],
]}
>
<ListTasksPage />
@@ -126,6 +130,7 @@ describe('<ListTasksPage />', () => {
[catalogApiRef, catalogApi],
[identityApiRef, identityApi],
[scaffolderApiRef, scaffolderApiMock],
[permissionApiRef, mockPermissionApi],
]}
>
<ListTasksPage />
@@ -224,6 +229,7 @@ describe('<ListTasksPage />', () => {
[catalogApiRef, catalogApi],
[identityApiRef, identityApi],
[scaffolderApiRef, scaffolderApiMock],
[permissionApiRef, mockPermissionApi],
]}
>
<ListTasksPage />
@@ -59,6 +59,8 @@ import {
TemplateEditorPage,
CustomFieldsPage,
} from '../../alpha/components/TemplateEditorPage';
import { RequirePermission } from '@backstage/plugin-permission-react';
import { taskReadPermission } from '@backstage/plugin-scaffolder-common/alpha';
/**
* The Props for the Scaffolder Router
@@ -162,9 +164,11 @@ export const Router = (props: PropsWithChildren<RouterProps>) => {
<Route
path={scaffolderTaskRouteRef.path}
element={
<TaskPageComponent
TemplateOutputsComponent={TemplateOutputsComponent}
/>
<RequirePermission permission={taskReadPermission}>
<TaskPageComponent
TemplateOutputsComponent={TemplateOutputsComponent}
/>
</RequirePermission>
}
/>
<Route
@@ -199,7 +203,11 @@ export const Router = (props: PropsWithChildren<RouterProps>) => {
<Route path={actionsRouteRef.path} element={<ActionsPage />} />
<Route
path={scaffolderListTaskRouteRef.path}
element={<ListTasksPage />}
element={
<RequirePermission permission={taskReadPermission}>
<ListTasksPage />
</RequirePermission>
}
/>
<Route
path={editorRouteRef.path}