Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
subscribeOpenModal,
} from '../../../../../shared/hooks/modalControls/modalsSubjects';
import { ModalName } from '../../../../../shared/hooks/modalControls/modalTypes';
import { processCertificateFile } from '../../../../../shared/utils/processCertificateFile';

const modalNameValue = ModalName.AddLogStreaming;

Expand Down Expand Up @@ -134,9 +135,9 @@ const FormStep = ({ destination, setOpen }: FormStepProps) => {
z.object({
name: z.string().trim().min(1, m.form_error_required()),
url: z.string().trim().min(1, m.form_error_required()),
username: z.string().optional(),
password: z.string().optional(),
certificate: z.string().optional(),
username: z.string().nullable(),
password: z.string().nullable(),
certificate: z.file().nullable(),
}),
[],
);
Expand All @@ -149,7 +150,7 @@ const FormStep = ({ destination, setOpen }: FormStepProps) => {
url: '',
username: '',
password: '',
certificate: '',
certificate: null,
}),
[],
);
Expand All @@ -162,6 +163,8 @@ const FormStep = ({ destination, setOpen }: FormStepProps) => {
onChange: formSchema,
},
onSubmit: async ({ value }) => {
const certificateContent = await processCertificateFile(value.certificate);

const requestData: CreateActivityLogStreamRequest = {
name: value.name,
stream_type:
Expand All @@ -170,9 +173,9 @@ const FormStep = ({ destination, setOpen }: FormStepProps) => {
: ActivityLogStreamType.VectorHttp,
stream_config: {
url: value.url,
username: value.username || undefined,
password: value.password || undefined,
cert: value.certificate || undefined,
username: value.username,
password: value.password,
cert: certificateContent,
},
};

Expand Down Expand Up @@ -216,7 +219,7 @@ const FormStep = ({ destination, setOpen }: FormStepProps) => {
<SizedBox height={ThemeSpacing.Xl} />

<form.AppField name="certificate">
{(field) => <field.FormInput label="Certificate" />}
{(field) => <field.FormUploadField title="Upload certificate file" />}
</form.AppField>
</form.AppForm>
</form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
subscribeOpenModal,
} from '../../../../../shared/hooks/modalControls/modalsSubjects';
import { ModalName } from '../../../../../shared/hooks/modalControls/modalTypes';
import { processCertificateFile } from '../../../../../shared/utils/processCertificateFile';

const modalNameValue = ModalName.EditLogStreaming;

Expand All @@ -40,7 +41,7 @@ export const EditLogStreamingModal = () => {
}, [modalData]);

useEffect(() => {
const openSub = subscribeOpenModal(modalNameValue, (data) => {
const openSub = subscribeOpenModal(modalNameValue, (data: ModalData) => {
setModalData(data);
setOpen(true);
});
Expand All @@ -58,7 +59,9 @@ export const EditLogStreamingModal = () => {
onClose={() => setOpen(false)}
afterClose={() => setModalData(null)}
>
{isPresent(modalData) && <ModalContent modalData={modalData} setOpen={setOpen} />}
{isPresent(modalData) && (
<ModalContent key={modalData.id} modalData={modalData} setOpen={setOpen} />
)}
</Modal>
);
};
Expand All @@ -82,9 +85,9 @@ const ModalContent = ({ modalData, setOpen }: ModalContentProps) => {
z.object({
name: z.string().trim().min(1, m.form_error_required()),
url: z.string().trim().min(1, m.form_error_required()),
username: z.string().optional(),
password: z.string().optional(),
certificate: z.string().optional(),
username: z.string().nullable(),
password: z.string().nullable(),
certificate: z.file().nullable(),
}),
[],
);
Expand All @@ -95,9 +98,11 @@ const ModalContent = ({ modalData, setOpen }: ModalContentProps) => {
(): FormFields => ({
name: modalData.name,
url: modalData.config.url,
username: modalData.config.username || '',
password: modalData.config.password || '',
certificate: modalData.config.cert || '',
username: modalData.config.username,
password: modalData.config.password,
certificate: modalData.config.cert
? new File([modalData.config.cert], 'certificate.pem')
: null,
}),
[modalData],
);
Expand All @@ -110,14 +115,16 @@ const ModalContent = ({ modalData, setOpen }: ModalContentProps) => {
onChange: formSchema,
},
onSubmit: async ({ value }) => {
const certificateContent = await processCertificateFile(value.certificate);

const requestData: CreateActivityLogStreamRequest = {
name: value.name,
stream_type: modalData.stream_type,
stream_config: {
url: value.url,
username: value.username || undefined,
password: value.password || undefined,
cert: value.certificate || undefined,
username: value.username,
password: value.password,
cert: certificateContent,
},
};

Expand Down Expand Up @@ -161,7 +168,7 @@ const ModalContent = ({ modalData, setOpen }: ModalContentProps) => {
<SizedBox height={ThemeSpacing.Xl} />

<form.AppField name="certificate">
{(field) => <field.FormInput label="Certificate" />}
{(field) => <field.FormUploadField title="Upload certificate file" />}
</form.AppField>
</form.AppForm>
</form>
Expand Down
6 changes: 3 additions & 3 deletions web/src/shared/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -894,9 +894,9 @@ export interface CreateActivityLogStreamRequest {

export interface ActivityLogStreamConfig {
url: string;
username?: string;
password?: string;
cert?: string;
username: string | null;
password: string | null;
cert: string | null;
}

export type ActivityLogSortKey =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,12 @@ export const FormUploadField = (
const field = useFieldContext<File | null>();
const error = useFormFieldError();

return <UploadField error={error} value={field.state.value} {...props} />;
return (
<UploadField
error={error}
value={field.state.value}
onChange={field.handleChange}
{...props}
/>
);
};
3 changes: 2 additions & 1 deletion web/src/shared/components/UploadField/UploadField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export const UploadField = ({
loading,
disabled,
testId,
title,
onChange,
}: UploadFieldProps) => {
const valuePresent = isPresent(value);
Expand Down Expand Up @@ -51,7 +52,7 @@ export const UploadField = ({
<Button
iconLeft="upload"
variant="outlined"
text={m.cmp_file_upload_button()}
text={title ?? m.cmp_file_upload_button()}
loading={loading || isPending}
disabled={disabled}
onClick={() => {
Expand Down
3 changes: 2 additions & 1 deletion web/src/shared/components/UploadField/style.scss
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.upload-field {
& > .inner-track {
display: flex;
flex-flow: column;
flex-flow: row nowrap;
align-items: flex-start;
justify-content: flex-start;
padding: 1px;
Expand All @@ -11,6 +11,7 @@
}

.file-row {
flex: 1;
box-sizing: border-box;
padding: var(--spacing-sm);
display: grid;
Expand Down
1 change: 1 addition & 0 deletions web/src/shared/components/UploadField/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ export interface UploadFieldProps {
disabled?: boolean;
acceptedExtensions?: string[];
testId?: string;
title?: string;
onChange?: (value: File | null) => void;
}
14 changes: 14 additions & 0 deletions web/src/shared/utils/processCertificateFile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Snackbar } from '../defguard-ui/providers/snackbar/snackbar';
export const processCertificateFile = async (
file: File | null,
): Promise<string | null> => {
if (!file) return null;
try {
const content = await file.text();
return content.replace(/\r\n/g, '\n').trim();
} catch (error) {
Snackbar.error('Failed to read certificate file');
console.error('Failed to read certificate file:', error);
return null;
}
};
Loading