Merge pull request #26947 from stephenglass/scaffolder-permission-tasklist1
fix(scaffolder): only show task routes with permission
This commit is contained in:
@@ -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.
|
||||
+7
-1
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user