From 0ef6061d7e7f018a3cff5439ead8dd3a7a5d6006 Mon Sep 17 00:00:00 2001 From: "Pedro S. Lopez" Date: Fri, 9 Jul 2021 02:38:31 -0400 Subject: [PATCH] Fix downloading media for WhatsApp Web v2.2126.10 (#735) * fix downloadMedia * return a boolean for hasMedia --- src/structures/Message.js | 18 ++++++++++----- src/util/Injected.js | 46 ++++++++------------------------------- 2 files changed, 21 insertions(+), 43 deletions(-) diff --git a/src/structures/Message.js b/src/structures/Message.js index d7a21b0..2d0b75e 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -41,7 +41,7 @@ class Message extends Base { * Indicates if the message has media available for download * @type {boolean} */ - this.hasMedia = data.clientUrl || data.deprecatedMms3Url; + this.hasMedia = Boolean(data.mediaKey && data.directPath); /** * Message content @@ -312,14 +312,20 @@ class Message extends Base { return undefined; } - const mediaUrl = msg.clientUrl || msg.deprecatedMms3Url; + const decryptedMedia = await window.Store.DownloadManager.downloadAndDecrypt({ + directPath: msg.directPath, + encFilehash: msg.encFilehash, + filehash: msg.filehash, + mediaKey: msg.mediaKey, + mediaKeyTimestamp: msg.mediaKeyTimestamp, + type: msg.type, + signal: (new AbortController).signal + }); - const buffer = await window.WWebJS.downloadBuffer(mediaUrl); - const decrypted = await window.Store.CryptoLib.decryptE2EMedia(msg.type, buffer, msg.mediaKey, msg.mimetype); - const data = await window.WWebJS.readBlobAsync(decrypted._blob); + const data = window.WWebJS.arrayBufferToBase64(decryptedMedia); return { - data: data.split(',')[1], + data, mimetype: msg.mimetype, filename: msg.filename }; diff --git a/src/util/Injected.js b/src/util/Injected.js index 255232b..2d85c15 100644 --- a/src/util/Injected.js +++ b/src/util/Injected.js @@ -35,6 +35,7 @@ exports.ExposeStore = (moduleRaidStr) => { window.Store.Features = window.mR.findModule('FEATURE_CHANGE_EVENT')[0].default; window.Store.QueryOrder = window.mR.findModule('queryOrder')[0]; window.Store.QueryProduct = window.mR.findModule('queryProduct')[0]; + window.Store.DownloadManager = window.mR.findModule('DownloadManager')[0].default; }; exports.LoadUtils = () => { @@ -349,43 +350,14 @@ exports.LoadUtils = () => { }); }; - window.WWebJS.downloadBuffer = (url) => { - return new Promise(function (resolve, reject) { - let xhr = new XMLHttpRequest(); - xhr.open('GET', url); - xhr.responseType = 'arraybuffer'; - xhr.onload = function () { - if (xhr.status == 200) { - resolve(xhr.response); - } else { - reject({ - status: this.status, - statusText: xhr.statusText - }); - } - }; - xhr.onerror = function () { - reject({ - status: this.status, - statusText: xhr.statusText - }); - }; - xhr.send(null); - }); - }; - - window.WWebJS.readBlobAsync = (blob) => { - return new Promise((resolve, reject) => { - let reader = new FileReader(); - - reader.onload = () => { - resolve(reader.result); - }; - - reader.onerror = reject; - - reader.readAsDataURL(blob); - }); + window.WWebJS.arrayBufferToBase64 = async (arrayBuffer) => { + let binary = ''; + const bytes = new Uint8Array( arrayBuffer ); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode( bytes[ i ] ); + } + return window.btoa( binary ); }; window.WWebJS.getFileHash = async (data) => {