diff --git a/package.json b/package.json index f2086b21..ccfea9b0 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,6 @@ "@types/react-i18next": "^8.1.0", "@types/react-router-dom": "^5.1.6", "@types/react-tooltip": "^4.2.4", - "@types/spark-md5": "^3.0.2", "@types/underscore": "^1.13.0", "@types/ws": "^8.5.5", "classnames": "^2.2.6", @@ -98,7 +97,6 @@ "redux": "^4.0.5", "redux-thunk": "^2.3.0", "source-map-explorer": "^2.5.2", - "spark-md5": "^3.0.1", "typescript": "^5.9.3", "wait-on": "^7.0.1" }, diff --git a/src/components/dialogs/opdsDialog/component.tsx b/src/components/dialogs/opdsDialog/component.tsx index 063451c1..f5429025 100644 --- a/src/components/dialogs/opdsDialog/component.tsx +++ b/src/components/dialogs/opdsDialog/component.tsx @@ -2,7 +2,7 @@ import React from "react"; import "./opdsDialog.css"; import { Trans } from "react-i18next"; import toast from "react-hot-toast"; -import SparkMD5 from "spark-md5"; +import CryptoJS from "crypto-js"; import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min"; import { OPDSCatalog, @@ -106,7 +106,7 @@ function buildDigestAuthHeader( const qop = qopList.includes("auth") ? "auth" : qopList[0] || ""; const nc = "00000001"; const cnonce = randomString(); - const hash = (value: string) => SparkMD5.hash(value); + const hash = (value: string) => CryptoJS.MD5(value.trim()).toString(); let ha1 = hash(`${username}:${realm}:${password}`); if (algorithm === "MD5-SESS") { diff --git a/src/utils/common.ts b/src/utils/common.ts index 682cc967..610e201c 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,6 +1,6 @@ import Plugin from "../models/Plugin"; import { isElectron } from "react-device-detect"; -import SparkMD5 from "spark-md5"; +import CryptoJS from "crypto-js"; import { CommonTool, ConfigService, @@ -54,19 +54,29 @@ export const supportedFormats = [ ]; export const calculateFileMD5 = (file: File): Promise => { return new Promise((resolve, reject) => { - const reader = new FileReader(); - - reader.onload = (event) => { - const arrayBuffer = event.target?.result as ArrayBuffer; - const md5Hash = SparkMD5.ArrayBuffer.hash(arrayBuffer); - resolve(md5Hash); - }; - - reader.onerror = (error) => { - reject(error); - }; - - reader.readAsArrayBuffer(file); + if (isElectron) { + const reader = new FileReader(); + reader.onload = (event) => { + const arrayBuffer = event.target?.result as ArrayBuffer; + const crypto = window.require("crypto"); + const hash = crypto.createHash("md5"); + hash.update(Buffer.from(arrayBuffer)); + resolve(hash.digest("hex")); + }; + reader.onerror = (error) => reject(error); + reader.readAsArrayBuffer(file); + } else { + const reader = new FileReader(); + reader.onload = (event) => { + const arrayBuffer = event.target?.result as ArrayBuffer; + const wordArray = CryptoJS.lib.WordArray.create( + new Uint8Array(arrayBuffer) as any + ); + resolve(CryptoJS.MD5(wordArray).toString()); + }; + reader.onerror = (error) => reject(error); + reader.readAsArrayBuffer(file); + } }); }; export const vexPromptAsync = (message, placeholder = "", value = "") => { diff --git a/src/utils/file/koReaderSync.ts b/src/utils/file/koReaderSync.ts index 1260d4d6..55710b4e 100644 --- a/src/utils/file/koReaderSync.ts +++ b/src/utils/file/koReaderSync.ts @@ -1,4 +1,3 @@ -import SparkMD5 from "spark-md5"; import { ConfigService, TokenService, @@ -300,7 +299,7 @@ export const verifyAndBuildKOReaderSyncConfig = async (params: { serverUrl: normalizeServerUrl(params.serverUrl), username: (params.username || "").trim(), passwordHash: (params.password || "").trim() - ? SparkMD5.hash((params.password || "").trim()) + ? CryptoJS.MD5((params.password || "").trim()).toString() : (params.passwordHash || "").trim(), }; if (!config.serverUrl || !config.username || !config.passwordHash) { diff --git a/yarn.lock b/yarn.lock index 19097e68..cc80f3b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4439,11 +4439,6 @@ dependencies: "@types/node" "*" -"@types/spark-md5@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/spark-md5/-/spark-md5-3.0.2.tgz#da2e8a778a20335fc4f40b6471c4b0d86b70da55" - integrity sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ== - "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -13840,11 +13835,6 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -spark-md5@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" - integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== - spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"