This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new 7913f981 fix(dlq): guard newline-prefixed CSV formulas (#1462)
7913f981 is described below

commit 7913f9817c4740f9a7a766c8b0dd2a1043345532
Author: 0 <[email protected]>
AuthorDate: Mon Aug 10 21:04:41 2026 +0800

    fix(dlq): guard newline-prefixed CSV formulas (#1462)
---
 web/src/pages/instance/__tests__/DLQPage.test.tsx | 19 +++++++++++++++++++
 web/src/pages/instance/dlq.tsx                    |  2 +-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/web/src/pages/instance/__tests__/DLQPage.test.tsx 
b/web/src/pages/instance/__tests__/DLQPage.test.tsx
index b55778af..5b62299d 100644
--- a/web/src/pages/instance/__tests__/DLQPage.test.tsx
+++ b/web/src/pages/instance/__tests__/DLQPage.test.tsx
@@ -228,6 +228,25 @@ describe('DLQ page', () => {
     expect(revokeObjectURL).toHaveBeenCalledWith('blob:dlq');
   });
 
+  it('neutralizes formulas hidden behind a leading line feed in CSV exports', 
async () => {
+    vi.mocked(messageService.listDLQGroups).mockResolvedValue([
+      {
+        ...dlqGroup,
+        groupName: '\n=1+1',
+        dlqTopic: '%DLQ%formula',
+      },
+    ]);
+    const user = userEvent.setup();
+    renderWithProviders(<DLQPage />);
+
+    const row = (await screen.findByText('%DLQ%formula')).closest('tr');
+    if (!row) throw new Error('DLQ group row not found');
+    await user.click(within(row).getByRole('button', { name: '导出' }));
+
+    const blob = createObjectURL.mock.calls[0][0] as Blob;
+    await expect(blob.text()).resolves.toContain('"\'\n=1+1","%DLQ%formula"');
+  });
+
   it('clears a selected group when refreshed data shows no dead-letter 
messages', async () => {
     vi.mocked(messageService.listDLQGroups)
       .mockResolvedValueOnce([dlqGroup])
diff --git a/web/src/pages/instance/dlq.tsx b/web/src/pages/instance/dlq.tsx
index 3010f58c..353d9c2f 100644
--- a/web/src/pages/instance/dlq.tsx
+++ b/web/src/pages/instance/dlq.tsx
@@ -78,7 +78,7 @@ const formatDateTime = (iso?: string | null): string => {
 };
 
 const escapeCSVValue = (value: string) => {
-  const safeValue = /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
+  const safeValue = /^[=+\-@\t\r\n]/.test(value) ? `'${value}` : value;
   return `"${safeValue.replace(/"/g, '""')}"`;
 };
 

Reply via email to