Skip to content

Commit 4672fb4

Browse files
authored
[frontend] fix: handle payload arguments correctly in updates (#4824)
1 parent e2f556c commit 4672fb4

2 files changed

Lines changed: 23 additions & 20 deletions

File tree

openaev-front/src/admin/components/threat_arsenal/ThreatArsenalActionForm.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
22
import { Box, Button } from '@mui/material';
33
import { useTheme } from '@mui/material/styles';
44
import { type SyntheticEvent, useEffect } from 'react';
5-
import { type FieldValues, FormProvider, type SubmitHandler, useForm, useWatch } from 'react-hook-form';
5+
import { type FieldValues, FormProvider, type Resolver, type SubmitHandler, useForm, useWatch } from 'react-hook-form';
66
import { z, type ZodTypeAny } from 'zod';
77

88
import Tabs, { type TabsEntry } from '../../../components/common/tabs/Tabs';
@@ -101,8 +101,8 @@ const ThreatArsenalActionForm = ({
101101
key: z.string().nonempty(t('Should not be empty')),
102102
type: z.enum(['text', 'number', 'port', 'portscan', 'ipv4', 'ipv6', 'credentials', 'cve', 'document', 'targeted-asset', 'kerberoastable_account', 'asreproastable_account', 'account_with_password_not_required', 'vulnerability', 'sid', 'delegation', 'password_policy', 'computer', 'group', 'admin_username', 'share', 'username'], { error: t('Should not be empty') }),
103103
subtype: z.enum(['host', 'port', 'service', 'username', 'password', 'severity', 'domain']).optional(),
104-
description: z.string().optional().nullable(),
105-
separator: z.string().optional().nullable(),
104+
description: z.string().optional(),
105+
separator: z.string().optional(),
106106
}).refine(
107107
data => data.type !== 'targeted-asset' || !!data.separator,
108108
{
@@ -159,7 +159,7 @@ const ThreatArsenalActionForm = ({
159159

160160
const methods = useForm<ThreatArsenalActionCreateCustomInput>({
161161
mode: 'onTouched',
162-
resolver: zodResolver(schema),
162+
resolver: zodResolver(schema) as Resolver<ThreatArsenalActionCreateCustomInput>,
163163
defaultValues: initialValues,
164164
});
165165
const {
@@ -227,7 +227,7 @@ const ThreatArsenalActionForm = ({
227227
focusFirstErrorTab();
228228
return;
229229
}
230-
await handleSubmit(onSubmit)(e);
230+
await handleSubmit(onSubmit as SubmitHandler<FieldValues>)(e);
231231
};
232232

233233
const trackedUseWatch = useWatch({

openaev-front/src/admin/components/threat_arsenal/ThreatArsenalActionPopover.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ const buildInitialValues = (action: ThreatArsenalActionFullOutput, actionName: s
6565
command_executor: action.command_executor as string | undefined,
6666
command_content: action.command_content as string | undefined,
6767
dns_resolution_hostname: action.dns_resolution_hostname as string | undefined,
68-
action_arguments: action.action_arguments,
68+
action_arguments: action.action_arguments?.map(arg => ({
69+
...arg,
70+
subtype: arg.subtype ?? undefined,
71+
description: arg.description ?? undefined,
72+
separator: arg.separator ?? undefined,
73+
})),
6974
action_prerequisites: action.action_prerequisites,
7075
file_drop_file: action.file_drop_file as string | undefined,
7176
action_attack_patterns: action.action_attack_patterns,
@@ -129,7 +134,7 @@ const ThreatArsenalActionPopover = ({
129134
setFetchedAction(null);
130135
};
131136

132-
const onSubmitEdit = (data: ThreatArsenalActionCreateCustomInput) => {
137+
const onSubmitEdit = async (data: ThreatArsenalActionCreateCustomInput) => {
133138
const inputValues: ThreatArsenalActionCreateInput = {
134139
...data,
135140
action_cleanup_executor: handleCleanupExecutorValue(
@@ -150,12 +155,11 @@ const ThreatArsenalActionPopover = ({
150155
}),
151156
} as ThreatArsenalActionCreateInput;
152157

153-
return dispatch(updateThreatArsenalAction(actionId, inputValues).then(({ data }: { data: ThreatArsenalAction }) => {
154-
if (data && onUpdate) {
155-
onUpdate(data);
156-
}
157-
handleCloseEdit();
158-
}));
158+
const response = await updateThreatArsenalAction(actionId, inputValues);
159+
if (response.data && onUpdate) {
160+
onUpdate(response.data as ThreatArsenalAction);
161+
}
162+
handleCloseEdit();
159163
};
160164

161165
// -- Delete --
@@ -176,13 +180,12 @@ const ThreatArsenalActionPopover = ({
176180
};
177181
const handleCloseDuplicate = () => setOpenDuplicate(false);
178182

179-
const submitDuplicate = () => {
180-
return dispatch(duplicateThreatArsenalAction(actionId).then(({ data }: { data: ThreatArsenalAction }) => {
181-
if (data && onDuplicate) {
182-
onDuplicate(data);
183-
}
184-
handleCloseDuplicate();
185-
}));
183+
const submitDuplicate = async () => {
184+
const response = await duplicateThreatArsenalAction(actionId);
185+
if (response.data && onDuplicate) {
186+
onDuplicate(response.data as ThreatArsenalAction);
187+
}
188+
handleCloseDuplicate();
186189
};
187190

188191
const hasUpdateCapability = ability.can(ACTIONS.MANAGE, SUBJECTS.PAYLOADS) || ability.can(ACTIONS.MANAGE, SUBJECTS.RESOURCE, payloadId);

0 commit comments

Comments
 (0)