From 8ea7e5f214bb04db3c7741d5917c976c60b1c853 Mon Sep 17 00:00:00 2001 From: Ioan Moldovan Date: Mon, 27 Oct 2025 22:17:42 -0400 Subject: [PATCH] feat: replace 'iso-8859-2' with plain JS --- extension/chrome/dev/ci_unit_test.htm | 1 - extension/chrome/elements/compose.htm | 1 - extension/chrome/settings/inbox/inbox.htm | 1 - extension/js/common/core/mime.ts | 12 +++-- extension/js/common/platform/require.ts | 11 ---- extension/manifest.json | 1 - package-lock.json | 61 ++++++++++++++++++++--- package.json | 1 - scripts/build.js | 1 - test/source/platform/require.ts | 4 -- tsconfig.json | 1 - 11 files changed, 61 insertions(+), 34 deletions(-) diff --git a/extension/chrome/dev/ci_unit_test.htm b/extension/chrome/dev/ci_unit_test.htm index 99d922bf1eb..f2fb005f2dc 100644 --- a/extension/chrome/dev/ci_unit_test.htm +++ b/extension/chrome/dev/ci_unit_test.htm @@ -27,7 +27,6 @@

loading..

- diff --git a/extension/chrome/elements/compose.htm b/extension/chrome/elements/compose.htm index 33a6b6deb99..7742c16341a 100644 --- a/extension/chrome/elements/compose.htm +++ b/extension/chrome/elements/compose.htm @@ -255,7 +255,6 @@

New Secure Message

- diff --git a/extension/chrome/settings/inbox/inbox.htm b/extension/chrome/settings/inbox/inbox.htm index f11593a770b..c31af686e79 100644 --- a/extension/chrome/settings/inbox/inbox.htm +++ b/extension/chrome/settings/inbox/inbox.htm @@ -51,7 +51,6 @@

- diff --git a/extension/js/common/core/mime.ts b/extension/js/common/core/mime.ts index 94f1d6b3219..9516aa67c34 100644 --- a/extension/js/common/core/mime.ts +++ b/extension/js/common/core/mime.ts @@ -4,7 +4,7 @@ 'use strict'; import { Dict, Str } from './common.js'; -import { requireIso88592, requireMimeBuilder, requireMimeParser } from '../platform/require.js'; +import { requireMimeBuilder, requireMimeParser } from '../platform/require.js'; import { Attachment } from './attachment.js'; import { Buf } from './buf.js'; @@ -18,7 +18,6 @@ import { iso2022jpToUtf } from '../platform/util.js'; /* eslint-disable @typescript-eslint/naming-convention */ const MimeParser = requireMimeParser(); const MimeBuilder = requireMimeBuilder(); -const Iso88592 = requireIso88592(); /* eslint-enable @typescript-eslint/naming-convention */ type AddressHeader = { address: string; name: string }; @@ -480,9 +479,12 @@ export class Mime { } private static getNodeContentAsUtfStr(node: MimeParserNode): string { - if (node.charset && Iso88592.labels.includes(node.charset)) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return Iso88592.decode(node.rawContent!); + // List of charset labels that map to ISO-8859-2 + const iso88592Labels = ['csisolatin2', 'iso-8859-2', 'iso-ir-101', 'iso8859-2', 'iso88592', 'iso_8859-2', 'iso_8859-2:1987', 'l2', 'latin2']; + + if (node.charset && node.rawContent && iso88592Labels.includes(node.charset.toLowerCase())) { + const decoder = new TextDecoder('iso-8859-2'); + return decoder.decode(Buf.fromRawBytesStr(node.rawContent)); } let resultBuf: Buf; if (node.charset === 'utf-8' && node.contentTransferEncoding.value === 'base64') { diff --git a/extension/js/common/platform/require.ts b/extension/js/common/platform/require.ts index 0143ef7d6f1..8a408006499 100644 --- a/extension/js/common/platform/require.ts +++ b/extension/js/common/platform/require.ts @@ -25,12 +25,6 @@ import { MimeParser } from '../core/types/emailjs.js'; import * as openpgp from 'openpgp'; import { Catch } from './catch.js'; -type Codec = { - encode: (text: string, mode: 'fatal' | 'html') => string; - decode: (text: string) => string; - labels: string[]; - version: string; -}; export const requireOpenpgp = () => { if (typeof window !== 'undefined' && typeof globalThis !== 'undefined' && window !== globalThis && Catch.browser().name === 'firefox') { @@ -52,8 +46,3 @@ export const requireMimeParser = (): typeof MimeParser => { export const requireMimeBuilder = () => { return (globalThis as any)['emailjs-mime-builder']; // eslint-disable-line }; - -export const requireIso88592 = (): Codec => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access - return (globalThis as any).iso88592 as Codec; -}; diff --git a/extension/manifest.json b/extension/manifest.json index 176223d2b23..6f547d78b44 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -48,7 +48,6 @@ "/lib/sweetalert2.js", "/lib/streams_web.js", "/lib/emailjs/punycode.js", - "/lib/iso-8859-2.js", "/lib/trusted-types.js", "/lib/emailjs/emailjs-stringencoding.js", "/lib/emailjs/emailjs-mime-codec.js", diff --git a/package-lock.json b/package-lock.json index ba36366ee40..eaf5dcb9be7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "filesize": "11.0.13", "fs-extra": "^11.3.2", "globby": "^15.0.0", - "iso-8859-2": "1.0.0", "jquery": "3.7.1", "linkify-html": "4.3.2", "linkifyjs": "4.3.2", @@ -2258,6 +2257,29 @@ "dev": true, "license": "MIT" }, + "node_modules/addons-linter/node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/addons-linter/node_modules/pino": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/pino/-/pino-9.13.0.tgz", @@ -6478,12 +6500,6 @@ "dev": true, "license": "ISC" }, - "node_modules/iso-8859-2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iso-8859-2/-/iso-8859-2-1.0.0.tgz", - "integrity": "sha512-4nenvssneZugAuUaIJwO2kBlRW5P1m4w2BrUhDGc9iiojH6cS4NlOP64JRBOnHCl7YgeV2cxNLehTzTR1aCKOg==", - "license": "MIT" - }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -10460,6 +10476,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -10842,6 +10867,15 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, "node_modules/webpack": { "version": "5.102.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", @@ -11030,6 +11064,19 @@ "node": ">=18" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/when": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", diff --git a/package.json b/package.json index f137dc448d5..9be792e313a 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "filesize": "11.0.13", "fs-extra": "^11.3.2", "globby": "^15.0.0", - "iso-8859-2": "1.0.0", "jquery": "3.7.1", "linkify-html": "4.3.2", "linkifyjs": "4.3.2", diff --git a/scripts/build.js b/scripts/build.js index 7a7de863b77..b6c93afa96c 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -57,7 +57,6 @@ const copyDependencies = async () => { ['linkify-html/dist/linkify-html.min.js', 'lib/linkify-html.min.js'], ['sweetalert2/dist/sweetalert2.js', 'lib/sweetalert2.js'], ['sweetalert2/dist/sweetalert2.css', 'css/sweetalert2.css'], - ['iso-8859-2/iso-8859-2.js', 'lib/iso-8859-2.js'], ['@zxcvbn-ts/core/dist/zxcvbn-ts.js', 'lib/zxcvbn-ts.js'], ['@zxcvbn-ts/language-common/dist/zxcvbn-ts.js', 'lib/zxcvbn-language-common.js'], ['@zxcvbn-ts/language-en/dist/zxcvbn-ts.js', 'lib/zxcvbn-language-en.js'], diff --git a/test/source/platform/require.ts b/test/source/platform/require.ts index 94b23c38dc3..fe793c61043 100644 --- a/test/source/platform/require.ts +++ b/test/source/platform/require.ts @@ -21,8 +21,4 @@ export const requireMimeBuilder = (): any => { return undefined; // todo }; -export const requireIso88592 = (): any => { - // (window as any).iso88592 - return undefined; // todo -}; /* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/tsconfig.json b/tsconfig.json index 4d577739d7a..9c718c88b26 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,7 +24,6 @@ "dompurify": ["../node_modules/dompurify/dist/purify.cjs.d.ts", "lib/purify.js", "COMMENT"], "fine-uploader": ["lib/fine-uploader.js", "COMMENT"], "filesize": ["lib/filesize.js", "../node_modules/filesize/types/filesize.d.ts"], - "iso-8859-2": ["lib/iso-8859-2.js", "COMMENT"], "emailjs-mime-parser": ["lib/emailjs/emailjs-mime-parser.js", "COMMENT"], "emailjs-mime-builder": ["lib/emailjs/emailjs-mime-builder.js", "COMMENT"], "node-forge": ["./extension/types/node-forge.d.ts", "lib/forge.mjs"],