diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 81b51b8..bfb3e7c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,12 +13,14 @@ "@popperjs/core": "^2.9.2", "bootstrap": "^5.0.1", "bootstrap-icons": "^1.5.0", + "dompurify": "^3.4.12", "file-loader": "^6.2.0", "google-protobuf": "^3.17.3", "showdown": "^1.9.1" }, "devDependencies": { "@types/bootstrap": "^5.0.17", + "@types/dompurify": "^3.0.5", "@types/google-protobuf": "^3.15.3", "@types/showdown": "^1.9.4", "css-loader": "^5.2.6", @@ -71,6 +73,16 @@ "@types/jquery": "*" } }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "*" + } + }, "node_modules/@types/eslint": { "version": "7.2.12", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.12.tgz", @@ -147,6 +159,13 @@ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", @@ -1726,6 +1745,15 @@ "buffer-indexof": "^1.0.0" } }, + "node_modules/dompurify": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", + "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6579,6 +6607,15 @@ "@types/jquery": "*" } }, + "@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "dev": true, + "requires": { + "@types/trusted-types": "*" + } + }, "@types/eslint": { "version": "7.2.12", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.12.tgz", @@ -6655,6 +6692,12 @@ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", "dev": true }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "devOptional": true + }, "@webassemblyjs/ast": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", @@ -7927,6 +7970,14 @@ "buffer-indexof": "^1.0.0" } }, + "dompurify": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", + "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", + "requires": { + "@types/trusted-types": "^2.0.7" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 023809a..739c1c1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,6 +22,7 @@ "homepage": "https://github.com/Nv7-Github/gdo_client#readme", "devDependencies": { "@types/bootstrap": "^5.0.17", + "@types/dompurify": "^3.0.5", "@types/google-protobuf": "^3.15.3", "@types/showdown": "^1.9.4", "css-loader": "^5.2.6", @@ -39,6 +40,7 @@ "@popperjs/core": "^2.9.2", "bootstrap": "^5.0.1", "bootstrap-icons": "^1.5.0", + "dompurify": "^3.4.12", "file-loader": "^6.2.0", "google-protobuf": "^3.17.3", "showdown": "^1.9.1" diff --git a/frontend/src/mails.ts b/frontend/src/mails.ts index 4928bb1..a66dc84 100644 --- a/frontend/src/mails.ts +++ b/frontend/src/mails.ts @@ -1,3 +1,4 @@ +import * as DOMPurify from "dompurify"; import { client } from "."; import { Mail, Time } from "../pb/cryptomail_pb"; import { mainPage, mainSection } from "./main"; @@ -59,7 +60,7 @@ function updateMailList() { let body = document.createElement("div"); body.style.textAlign = "left"; - body.innerHTML = mail.getBody(); + body.innerHTML = DOMPurify.sanitize(mail.getBody()); section.appendChild(body); let backBtn = document.createElement("button");