diff --git a/openbas-front/src/admin/components/agents/Agents.tsx b/openbas-front/src/admin/components/agents/Agents.tsx index af73e52a92..ecd60d7b73 100644 --- a/openbas-front/src/admin/components/agents/Agents.tsx +++ b/openbas-front/src/admin/components/agents/Agents.tsx @@ -20,6 +20,8 @@ import PlatformSelector from './PlatformSelector'; const OPENBAS_CALDERA = 'openbas_caldera'; const OPENBAS_AGENT = 'openbas_agent'; +const OPENBAS_CROWDSTRIKE = 'openbas_crowdstrike'; +const OPENBAS_TANIUM = 'openbas_tanium'; const Executors = () => { // Standard hooks @@ -47,13 +49,9 @@ const Executors = () => { openbas_tanium: 2, openbas_crowdstrike: 3, }; - const sortedExecutors = executors - .map((executor: Executor) => ({ - ...executor, - order: order[executor.executor_type as keyof typeof order], - })) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .sort((a: any, b: any) => a.order - b.order); + + const sortedExecutors = executors.sort((a: Executor, b: Executor) => order[a.executor_type as keyof typeof order] - order[b.executor_type as keyof typeof order]); + const needInformationStepper = (selectedExecutor?.executor_type === OPENBAS_AGENT || selectedExecutor?.executor_type === OPENBAS_CALDERA); // -- Manage Dialogs const steps = [t('Choose your platform'), t('Installation Instructions')]; @@ -84,6 +82,7 @@ const Executors = () => { ))} @@ -93,16 +92,16 @@ const Executors = () => { slots={{ transition: Transition }} onClose={closeInstall} slotProps={{ paper: { elevation: 1 } }} - maxWidth="md" + maxWidth={needInformationStepper ? 'md' : 'sm'} > - + {`${selectedExecutor?.executor_name} `} - {(selectedExecutor?.executor_type === OPENBAS_AGENT || selectedExecutor?.executor_type === OPENBAS_CALDERA) + {needInformationStepper && ( <> - + {steps.map((label, index) => ( setActiveStep(index)}>{label} @@ -117,7 +116,7 @@ const Executors = () => { )} )} - {selectedExecutor?.executor_type !== OPENBAS_AGENT && selectedExecutor?.executor_type !== OPENBAS_CALDERA && selectedExecutor && ( + {!needInformationStepper && selectedExecutor && ( )} diff --git a/openbas-front/src/admin/components/agents/ExecutorDocumentationLink.tsx b/openbas-front/src/admin/components/agents/ExecutorDocumentationLink.tsx index f4b5e7d589..4242e73de0 100644 --- a/openbas-front/src/admin/components/agents/ExecutorDocumentationLink.tsx +++ b/openbas-front/src/admin/components/agents/ExecutorDocumentationLink.tsx @@ -1,9 +1,11 @@ -import { Typography } from '@mui/material'; +import { Alert, Typography } from '@mui/material'; import { useTheme } from '@mui/material/styles'; -import { type FunctionComponent } from 'react'; +import { type FunctionComponent, useEffect } from 'react'; import { useFormatter } from '../../../components/i18n'; import { type Executor } from '../../../utils/api-types'; +import useEnterpriseEdition from '../../../utils/hooks/useEnterpriseEdition'; +import EEChip from '../common/entreprise_edition/EEChip'; interface Props { executor: Executor } @@ -11,9 +13,23 @@ const ExecutorDocumentationLink: FunctionComponent = ({ executor }) => { // Standard hooks const { t } = useFormatter(); const theme = useTheme(); + const { openDialog, setFeatureDetectedInfo } = useEnterpriseEdition(); + useEffect(() => { + }, []); + const onAlertClick = () => { + setFeatureDetectedInfo(executor.executor_name); + openDialog(); + }; return ( -
+
+ } severity="success" onClick={onAlertClick}> + {`${executor.executor_name} ${t('executor is an enterprise edition feature. You can start the set up but you will need a license key to execute your injects. We provide a 3 month trial to let you test the platform at full capacity.')} `} + {executor.executor_doc && ( {t('To install the agent please follow the ')} diff --git a/openbas-front/src/admin/components/agents/ExecutorSelector.tsx b/openbas-front/src/admin/components/agents/ExecutorSelector.tsx index 12ca968a1d..ad69cf1fff 100644 --- a/openbas-front/src/admin/components/agents/ExecutorSelector.tsx +++ b/openbas-front/src/admin/components/agents/ExecutorSelector.tsx @@ -5,6 +5,7 @@ import { makeStyles } from 'tss-react/mui'; import { useFormatter } from '../../../components/i18n'; import PlatformIcon from '../../../components/PlatformIcon'; import { type Executor } from '../../../utils/api-types'; +import EEChip from '../common/entreprise_edition/EEChip'; import ExecutorBanner from './ExecutorBanner'; const useStyles = makeStyles()(theme => ({ @@ -27,9 +28,10 @@ const useStyles = makeStyles()(theme => ({ interface ExecutorSelectorProps { executor: Executor; setSelectedExecutor: (executor: Executor) => void; + isEEExecutor?: boolean; } -const ExecutorSelector: React.FC = ({ executor, setSelectedExecutor }) => { +const ExecutorSelector: React.FC = ({ executor, setSelectedExecutor, isEEExecutor = false }) => { const theme = useTheme(); const { classes } = useStyles(); const { t } = useFormatter(); @@ -55,12 +57,13 @@ const ExecutorSelector: React.FC = ({ executor, setSelect fontSize: 15, padding: theme.spacing(2, 0, 1), display: 'flex', - alignItems: 'center', justifyContent: 'center', + alignItems: 'center', color: platforms.length === 0 ? theme.palette.text?.disabled : theme.palette.text?.primary, }} > {`${t('Install')} ${executor.executor_name}`} + {isEEExecutor && } = ({ agents }) => { const { classes } = useStyles(); + const theme = useTheme(); const bodyItemsStyles = useBodyItemsStyles(); const dispatch = useAppDispatch(); const { t, fldt } = useFormatter(); @@ -81,7 +84,9 @@ const AgentList: FunctionComponent = ({ agents }) => { }} /> )} - {executor?.executor_name ?? t('Unknown')} + {executor.executor_name ?? t('Unknown')} + {(executor.executor_type == 'openbas_tanium' || executor.executor_type == 'openbas_crowdstrike') + && } ); }, diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx index fb864b683a..9e771256f1 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EEChip.tsx @@ -1,4 +1,5 @@ import { Tooltip } from '@mui/material'; +import { type CSSProperties } from 'react'; import { makeStyles } from 'tss-react/mui'; import { useFormatter } from '../../../../components/i18n'; @@ -20,21 +21,25 @@ const useStyles = makeStyles<{ isClickable: boolean }>()((theme, { isClickable } }, })); -const EEChip = ({ clickable = false, featureDetectedInfo = '' }: { +const EEChip = ({ clickable = false, featureDetectedInfo = null, style = {} }: { clickable?: boolean; - featureDetectedInfo?: string; + featureDetectedInfo?: string | null; + style?: CSSProperties; }) => { const { classes } = useStyles({ isClickable: clickable }); const { t } = useFormatter(); const { openDialog, setFeatureDetectedInfo } = useEnterpriseEdition(); const { isValidated: isEnterpriseEdition } = useEnterpriseEdition(); - setFeatureDetectedInfo(featureDetectedInfo); + if (featureDetectedInfo) { + setFeatureDetectedInfo(featureDetectedInfo); + } return ( clickable && !isEnterpriseEdition && openDialog()} + style={style} > EE diff --git a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreementDialog.tsx b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreementDialog.tsx index 0f8440624c..db1194ad8d 100644 --- a/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreementDialog.tsx +++ b/openbas-front/src/admin/components/common/entreprise_edition/EnterpriseEditionAgreementDialog.tsx @@ -32,24 +32,31 @@ const useStyles = makeStyles()(theme => ({ const EnterpriseEditionAgreementDialog = () => { const { t } = useFormatter(); - const { open, closeDialog, featureDetectedInfo } = useEnterpriseEdition(); + const { open, closeDialog, featureDetectedInfo, setFeatureDetectedInfo } = useEnterpriseEdition(); const { classes } = useStyles(); const dispatch = useAppDispatch(); const [enterpriseLicense, setEnterpriseLicense] = useState(''); + const onCloseEnterpriseEditionDialog = () => { + closeDialog(); + setFeatureDetectedInfo(''); + }; + const updateEnterpriseEdition = (data: SettingsEnterpriseEditionUpdateInput) => { dispatch(updatePlatformEnterpriseEditionParameters(data)); - closeDialog(); + onCloseEnterpriseEditionDialog(); }; + const enableEnterpriseEdition = () => updateEnterpriseEdition({ platform_enterprise_license: enterpriseLicense }); + return ( - +