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, '""')}"`;
};