From: Peter Amstutz Date: Tue, 24 May 2022 15:31:00 +0000 (-0400) Subject: 19143: Checks that project is writable when selecting workflow X-Git-Tag: 2.4.1~1^2~1^2~4 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/46c5d0d6ab1e39af6a8c12a7d620e0b03cde8a53 19143: Checks that project is writable when selecting workflow Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- diff --git a/src/store/run-process-panel/run-process-panel-actions.ts b/src/store/run-process-panel/run-process-panel-actions.ts index 95bac0c2..e0dada5c 100644 --- a/src/store/run-process-panel/run-process-panel-actions.ts +++ b/src/store/run-process-panel/run-process-panel-actions.ts @@ -102,7 +102,11 @@ export const setWorkflow = (workflow: WorkflowResource, isWorkflowChanged = true const advancedFormValues = getWorkflowRunnerSettings(workflow); - const owner = getResource(getState().runProcessPanel.processOwnerUuid)(getState().resources); + let owner = getResource(getState().runProcessPanel.processOwnerUuid)(getState().resources); + const userUuid = getUserUuid(getState()); + if (!owner || !userUuid || owner.writableBy.indexOf(userUuid) === -1) { + owner = undefined; + } if (isStepChanged && isWorkflowChanged) { dispatch(runProcessPanelActions.SET_STEP_CHANGED(false)); diff --git a/src/store/workflow-panel/workflow-panel-actions.ts b/src/store/workflow-panel/workflow-panel-actions.ts index 85f0b9bc..7c90fa6b 100644 --- a/src/store/workflow-panel/workflow-panel-actions.ts +++ b/src/store/workflow-panel/workflow-panel-actions.ts @@ -18,6 +18,7 @@ import { RUN_PROCESS_ADVANCED_FORM } from 'views/run-process-panel/run-process-a import { getResource, ResourcesState } from 'store/resources/resources'; import { ProjectResource } from 'models/project'; import { UserResource } from 'models/user'; +import { getUserUuid } from "common/getuser"; export const WORKFLOW_PANEL_ID = "workflowPanel"; const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix'; @@ -55,8 +56,15 @@ export const openRunProcess = (workflowUuid: string, ownerUuid?: string, name?: dispatch(initialize(RUN_PROCESS_ADVANCED_FORM, getWorkflowRunnerSettings(workflow))); let owner; if (ownerUuid) { - dispatch(runProcessPanelActions.SET_PROCESS_OWNER_UUID(ownerUuid)); + // Must be writable. + const userUuid = getUserUuid(getState()); owner = getResource(ownerUuid)(getState().resources); + if (!owner || !userUuid || owner.writableBy.indexOf(userUuid) === -1) { + owner = undefined; + } + } + if (owner) { + dispatch(runProcessPanelActions.SET_PROCESS_OWNER_UUID(owner.uuid)); } dispatch(initialize(RUN_PROCESS_BASIC_FORM, { name, owner })); diff --git a/src/views/run-process-panel/inputs/project-input.tsx b/src/views/run-process-panel/inputs/project-input.tsx index 95f3ad89..7b45a6d1 100644 --- a/src/views/run-process-panel/inputs/project-input.tsx +++ b/src/views/run-process-panel/inputs/project-input.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { connect, DispatchProp } from 'react-redux'; -import { Field, WrappedFieldProps } from 'redux-form'; +import { Field } from 'redux-form'; import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core'; import { GenericCommandInputParameter @@ -16,9 +16,13 @@ import { TreeItem } from 'components/tree/tree'; import { ProjectsTreePickerItem } from 'views-components/projects-tree-picker/generic-projects-tree-picker'; import { ProjectResource } from 'models/project'; import { ResourceKind } from 'models/resource'; +import { RootState } from 'store/store'; +import { getUserUuid } from 'common/getuser'; export type ProjectCommandInputParameter = GenericCommandInputParameter; +const require: any = (value?: ProjectResource) => (value === undefined); + export interface ProjectInputProps { input: ProjectCommandInputParameter; options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; @@ -29,6 +33,7 @@ export const ProjectInput = ({ input, options }: ProjectInputProps) => commandInput={input} component={ProjectInputComponent as any} format={format} + validate={require} {...{ options }} />; @@ -40,8 +45,14 @@ interface ProjectInputComponentState { project?: ProjectResource; } -export const ProjectInputComponent = connect()( - class ProjectInputComponent extends React.Component ({ userUuid: getUserUuid(state) }); + +export const ProjectInputComponent = connect(mapStateToProps)( + class ProjectInputComponent extends React.Component { state: ProjectInputComponentState = { @@ -81,6 +92,8 @@ export const ProjectInputComponent = connect()( } } + invalid = () => (!this.state.project || this.state.project.writableBy.indexOf(this.props.userUuid) === -1); + renderInput() { return @@ -112,7 +125,7 @@ export const ProjectInputComponent = connect()( diff --git a/src/views/run-process-panel/run-process-basic-form.tsx b/src/views/run-process-panel/run-process-basic-form.tsx index a8005ad2..32a126a4 100644 --- a/src/views/run-process-panel/run-process-basic-form.tsx +++ b/src/views/run-process-panel/run-process-basic-form.tsx @@ -29,7 +29,7 @@ export const RunProcessBasicForm = @@ -37,7 +37,7 @@ export const RunProcessBasicForm = + label="Optional description of this workflow run" />