From 06c8d219ed2fa3e8b79c03f159227133fc84c37f Mon Sep 17 00:00:00 2001 From: Alex Lee <3076438032@qq.com> Date: Mon, 10 Aug 2026 10:48:04 +0800 Subject: [PATCH] fix(dbprovider): validate backup remarks (#7190) --- .../dbprovider/src/pages/api/backup/create.ts | 10 ++++++++ .../db/detail/components/BackupModal.tsx | 23 +++++++++++++++---- .../dbprovider/src/utils/backupRemark.ts | 6 +++++ 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 frontend/providers/dbprovider/src/utils/backupRemark.ts diff --git a/frontend/providers/dbprovider/src/pages/api/backup/create.ts b/frontend/providers/dbprovider/src/pages/api/backup/create.ts index 5d01545f5..b294e8404 100644 --- a/frontend/providers/dbprovider/src/pages/api/backup/create.ts +++ b/frontend/providers/dbprovider/src/pages/api/backup/create.ts @@ -5,6 +5,8 @@ import { getK8s } from '@/services/backend/kubernetes'; import { jsonRes } from '@/services/backend/response'; import { json2ManualBackup } from '@/utils/json2Yaml'; import { DBBackupMethodNameMap, DBBackupPolicyNameMap, DBTypeEnum } from '@/constants/db'; +import { ResponseCode } from '@/types/response'; +import { isValidBackupRemark } from '@/utils/backupRemark'; export type Props = { backupName: string; @@ -24,6 +26,14 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< return; } + if (!isValidBackupRemark(remark)) { + jsonRes(res, { + code: ResponseCode.BAD_REQUEST, + message: 'remark_tip' + }); + return; + } + const group = 'dataprotection.kubeblocks.io'; const version = 'v1alpha1'; const plural = 'backuppolicies'; diff --git a/frontend/providers/dbprovider/src/pages/db/detail/components/BackupModal.tsx b/frontend/providers/dbprovider/src/pages/db/detail/components/BackupModal.tsx index 16241b13f..0ba310790 100644 --- a/frontend/providers/dbprovider/src/pages/db/detail/components/BackupModal.tsx +++ b/frontend/providers/dbprovider/src/pages/db/detail/components/BackupModal.tsx @@ -11,6 +11,8 @@ import { Button, Checkbox, Flex, + FormControl, + FormErrorMessage, Input, Modal, ModalBody, @@ -25,6 +27,7 @@ import { customAlphabet } from 'nanoid'; import { useTranslation } from 'next-i18next'; import { useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; +import { isValidBackupRemark } from '@/utils/backupRemark'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6); enum NavEnum { @@ -78,7 +81,8 @@ const BackupModal = ({ const { register: manualRegister, handleSubmit: handleSubmitManual, - getValues: getManualValues + getValues: getManualValues, + formState: { errors: manualErrors } } = useForm({ defaultValues: { backupName: `${dbName}-${nanoid()}`, @@ -286,9 +290,20 @@ const BackupModal = ({ })} /> - - {t('remark')} - + + + {t('remark')} + + + isValidBackupRemark(value) || t('remark_tip') + })} + /> + + {manualErrors.remark && String(manualErrors.remark.message)} + + } diff --git a/frontend/providers/dbprovider/src/utils/backupRemark.ts b/frontend/providers/dbprovider/src/utils/backupRemark.ts new file mode 100644 index 000000000..4b8317a94 --- /dev/null +++ b/frontend/providers/dbprovider/src/utils/backupRemark.ts @@ -0,0 +1,6 @@ +export const BACKUP_REMARK_MAX_UTF8_BYTES = 30; + +export const getBackupRemarkByteLength = (remark = '') => new TextEncoder().encode(remark).length; + +export const isValidBackupRemark = (remark = '') => + getBackupRemarkByteLength(remark) <= BACKUP_REMARK_MAX_UTF8_BYTES;