diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike.ts b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike.ts index 2b5550b157239..2a928ed7d64de 100644 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike.ts +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike.ts @@ -60,8 +60,6 @@ export function getConnectorType(): ConnectorTypeModel< return { errors }; }, actionConnectorFields: lazy(() => import('./crowdstrike_connector')), - actionParamsFields: lazy(() => import('./crowdstrike_params_empty')), - // TODO: Enable once we add support for automated response actions - // actionParamsFields: lazy(() => import('./crowdstrike_params')), + actionParamsFields: lazy(() => import('./crowdstrike_params')), }; } diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.test.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.test.tsx new file mode 100644 index 0000000000000..11e474e6a7ac9 --- /dev/null +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.test.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { SUB_ACTION } from '../../../common/crowdstrike/constants'; +import type { CrowdstrikeActionParams } from '../../../common/crowdstrike/types'; +import CrowdstrikeParamsFields from './crowdstrike_params'; + +const actionParams = { + subAction: SUB_ACTION.GET_AGENT_DETAILS, + subActionParams: { + ids: ['test'], + }, +} as unknown as CrowdstrikeActionParams; + +describe('CrowdstrikeParamsFields renders', () => { + test('all params fields are rendered', () => { + const wrapper = mountWithIntl( + + ); + expect(wrapper.find('[data-test-subj="actionTypeSelect"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="actionTypeSelect"]').first().prop('readOnly')).toEqual( + true + ); + expect(wrapper.find('[data-test-subj="agentIdSelect"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.tsx new file mode 100644 index 0000000000000..a53843f683567 --- /dev/null +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useCallback, useState, useEffect } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSuperSelect, EuiComboBox } from '@elastic/eui'; +import { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { SUB_ACTION } from '../../../common/crowdstrike/constants'; +import type { CrowdstrikeActionParams } from '../../../common/crowdstrike/types'; +import * as i18n from './translations'; + +const actionTypeOptions = [ + { + value: SUB_ACTION.GET_AGENT_DETAILS, + inputDisplay: i18n.GET_AGENT_DETAILS_ACTION_LABEL, + }, +]; + +const CrowdstrikeParamsFields: React.FunctionComponent< + ActionParamsProps +> = ({ actionParams, editAction, index, errors }) => { + const [subActionValue] = useState(SUB_ACTION.GET_AGENT_DETAILS); + + const { ids } = useMemo( + () => + actionParams.subActionParams ?? + ({ + ids: [], + } as unknown as CrowdstrikeActionParams['subActionParams']), + [actionParams.subActionParams] + ); + + const labelOptions = useMemo(() => (ids ? ids.map((label: string) => ({ label })) : []), [ids]); + + const editSubActionParams = useCallback( + (value: any) => { + return editAction( + 'subActionParams', + { + ids: value, + }, + index + ); + }, + [editAction, index] + ); + + useEffect(() => { + if (!actionParams.subAction) { + editAction('subAction', SUB_ACTION.GET_AGENT_DETAILS, index); + } + if (!actionParams.subActionParams) { + editAction( + 'subActionParams', + { + ids: [], + }, + index + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [actionParams]); + + return ( + + + + + + + + + { + const newOptions = [...labelOptions, { label: searchValue }]; + editSubActionParams(newOptions.map((newOption) => newOption.label)); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editSubActionParams(selectedOptions.map((selectedOption) => selectedOption.label)); + }} + onBlur={() => { + if (!ids) { + editSubActionParams([]); + } + }} + isClearable={true} + data-test-subj="agentIdSelect" + /> + + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { CrowdstrikeParamsFields as default }; diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params_empty.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params_empty.tsx deleted file mode 100644 index 9b99e68368405..0000000000000 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/crowdstrike_params_empty.tsx +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -const CrowdstrikeParamsFields = () => <>; - -// eslint-disable-next-line import/no-default-export -export { CrowdstrikeParamsFields as default }; diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/translations.ts b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/translations.ts index e10226f532914..8d1a3ad0bbe12 100644 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/translations.ts +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/crowdstrike/translations.ts @@ -43,3 +43,24 @@ export const INVALID_ACTION = i18n.translate( defaultMessage: 'Invalid action name.', } ); + +export const ACTION_TYPE_LABEL = i18n.translate( + 'xpack.stackConnectors.security.crowdstrike.params.actionTypeFieldLabel', + { + defaultMessage: 'Action type', + } +); + +export const GET_AGENT_DETAILS_ACTION_LABEL = i18n.translate( + 'xpack.stackConnectors.security.crowdstrike.params.getAgentDetailsActionLabel', + { + defaultMessage: 'Get agent details', + } +); + +export const AGENT_IDS_LABEL = i18n.translate( + 'xpack.stackConnectors.security.crowdstrike.params.agentIdsLabel', + { + defaultMessage: 'Agent IDs', + } +); diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone.ts b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone.ts index 2344833ceb0c7..a65fc6a4f011c 100644 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone.ts +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone.ts @@ -60,6 +60,6 @@ export function getConnectorType(): ConnectorTypeModel< return { errors }; }, actionConnectorFields: lazy(() => import('./sentinelone_connector')), - actionParamsFields: lazy(() => import('./sentinelone_params_empty')), + actionParamsFields: lazy(() => import('./sentinelone_params')), }; } diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.test.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.test.tsx new file mode 100644 index 0000000000000..dcac22ada7809 --- /dev/null +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.test.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { SUB_ACTION } from '../../../common/sentinelone/constants'; +import type { SentinelOneActionParams } from '../../../common/sentinelone/types'; +import SentinelOneParamsFields from './sentinelone_params'; + +const actionParams = { + subAction: SUB_ACTION.GET_AGENTS, + subActionParams: {}, +} as unknown as SentinelOneActionParams; + +describe('SentinelOneParamsFields renders', () => { + test('all params fields are rendered', () => { + const wrapper = mountWithIntl( + + ); + expect(wrapper.find('[data-test-subj="actionTypeSelect"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="actionTypeSelect"]').first().prop('readOnly')).toEqual( + true + ); + }); +}); diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.tsx new file mode 100644 index 0000000000000..00ba91c83e25f --- /dev/null +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSuperSelect } from '@elastic/eui'; +import { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { SUB_ACTION } from '../../../common/sentinelone/constants'; +import type { SentinelOneActionParams } from '../../../common/sentinelone/types'; +import * as i18n from './translations'; + +const actionTypeOptions = [ + { + value: SUB_ACTION.GET_AGENTS, + inputDisplay: i18n.GET_AGENT_ACTION_LABEL, + }, +]; + +const SentinelOneParamsFields: React.FunctionComponent< + ActionParamsProps +> = ({ editAction, index }) => { + const [subAction] = useState(SUB_ACTION.GET_AGENTS); + + useEffect(() => { + editAction('subActionParams', {}, index); + editAction('subAction', subAction, index); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + + + + + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { SentinelOneParamsFields as default }; diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params_empty.tsx b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params_empty.tsx deleted file mode 100644 index 35895d35bcebf..0000000000000 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/sentinelone_params_empty.tsx +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -const SentinelOneParamsFields = () => <>; - -// eslint-disable-next-line import/no-default-export -export { SentinelOneParamsFields as default }; diff --git a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/translations.ts b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/translations.ts index a5b9a274857c3..f2b44172850d6 100644 --- a/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/translations.ts +++ b/x-pack/platform/plugins/shared/stack_connectors/public/connector_types/sentinelone/translations.ts @@ -73,6 +73,13 @@ export const RELEASE_AGENT_ACTION_LABEL = i18n.translate( } ); +export const GET_AGENT_ACTION_LABEL = i18n.translate( + 'xpack.stackConnectors.security.sentinelone.params.getAgentActionLabel', + { + defaultMessage: 'Get agent details', + } +); + export const AGENTS_FIELD_LABEL = i18n.translate( 'xpack.stackConnectors.security.sentinelone.params.agentsFieldLabel', { @@ -90,7 +97,7 @@ export const AGENTS_FIELD_PLACEHOLDER = i18n.translate( export const ACTION_TYPE_LABEL = i18n.translate( 'xpack.stackConnectors.security.sentinelone.params.actionTypeFieldLabel', { - defaultMessage: 'Action Type', + defaultMessage: 'Action type', } );