From 9e743e4aa1ecc556e77efc0d39592c24b3696aeb Mon Sep 17 00:00:00 2001 From: Ong Chung Yau <33013947+chungyau97@users.noreply.github.com> Date: Thu, 7 Aug 2025 18:11:53 +0800 Subject: [PATCH] Fix import null bytes error (#5036) fix: sanitize null bytes in import data from SQLite --- .../src/services/export-import/index.ts | 3 ++ packages/server/src/utils/sanitize.util.ts | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 packages/server/src/utils/sanitize.util.ts diff --git a/packages/server/src/services/export-import/index.ts b/packages/server/src/services/export-import/index.ts index 0fb86e00d..8873f9824 100644 --- a/packages/server/src/services/export-import/index.ts +++ b/packages/server/src/services/export-import/index.ts @@ -26,6 +26,7 @@ import marketplacesService from '../marketplaces' import toolsService from '../tools' import variableService from '../variables' import { Platform } from '../../Interface' +import { sanitizeNullBytes } from '../../utils/sanitize.util' type ExportInput = { agentflow: boolean @@ -753,6 +754,8 @@ const importData = async (importData: ExportData, orgId: string, activeWorkspace importData = await replaceDuplicateIdsForVariable(queryRunner, importData, importData.Variable) } + importData = sanitizeNullBytes(importData) + await queryRunner.startTransaction() if (importData.AgentFlow.length > 0) await queryRunner.manager.save(ChatFlow, importData.AgentFlow) diff --git a/packages/server/src/utils/sanitize.util.ts b/packages/server/src/utils/sanitize.util.ts new file mode 100644 index 000000000..410bc4c05 --- /dev/null +++ b/packages/server/src/utils/sanitize.util.ts @@ -0,0 +1,32 @@ +export function sanitizeNullBytes(obj: any): any { + const stack = [obj] + + while (stack.length) { + const current = stack.pop() + + if (Array.isArray(current)) { + for (let i = 0; i < current.length; i++) { + const val = current[i] + if (typeof val === 'string') { + // eslint-disable-next-line no-control-regex + current[i] = val.replace(/\u0000/g, '') + } else if (val && typeof val === 'object') { + stack.push(val) + } + } + } else if (current && typeof current === 'object') { + for (const key in current) { + if (!Object.hasOwnProperty.call(current, key)) continue + const val = current[key] + if (typeof val === 'string') { + // eslint-disable-next-line no-control-regex + current[key] = val.replace(/\u0000/g, '') + } else if (val && typeof val === 'object') { + stack.push(val) + } + } + } + } + + return obj +}