From 607d19a7591533fe3daef3c0ed8a6dbff04094e3 Mon Sep 17 00:00:00 2001 From: Matt Gros <3311227+mpge@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:23:41 -0500 Subject: [PATCH 1/5] fix: sanitize HTML with DOMPurify to prevent stored XSS - Add DOMPurify sanitization to ReplyThread.vue and PinnedNotes.vue - All v-html rendered content is now sanitized before rendering - Closes stored XSS vector from inbound email bodies and user-submitted HTML --- package.json | 14 ++++++++++---- src/components/PinnedNotes.vue | 14 +++++++++++--- src/components/ReplyThread.vue | 20 ++++++++++++++------ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index e831891..8a6b21f 100644 --- a/package.json +++ b/package.json @@ -21,24 +21,30 @@ "exports": { "./components/*": "./src/components/*", "./pages/*": "./src/pages/*", + "./locales": "./src/locales/index.js", + "./locales/*": "./src/locales/*", ".": "./src/index.js" }, "files": [ "src" ], "peerDependencies": { - "vue": "^3.3.0", - "@inertiajs/vue3": "^1.0.0 || ^2.0.0" + "@inertiajs/vue3": "^1.0.0 || ^2.0.0", + "vue": "^3.3.0" }, "scripts": { "test": "vitest run" }, "devDependencies": { - "vue": "^3.5.0", "@inertiajs/vue3": "^2.0.0", + "@types/dompurify": "^3.0.5", "@vitejs/plugin-vue": "^5.0.0", "@vue/test-utils": "^2.4.0", "happy-dom": "^15.0.0", - "vitest": "^2.0.0" + "vitest": "^2.0.0", + "vue": "^3.5.0" + }, + "dependencies": { + "dompurify": "^3.3.1" } } diff --git a/src/components/PinnedNotes.vue b/src/components/PinnedNotes.vue index 1bcaf6a..fdb19d2 100644 --- a/src/components/PinnedNotes.vue +++ b/src/components/PinnedNotes.vue @@ -1,6 +1,13 @@