UNPKG

matrix-react-sdk

Version:
83 lines (77 loc) 9.54 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.DownloadError = exports.DecryptError = void 0; exports.decryptFile = decryptFile; var _matrixEncryptAttachment = _interopRequireDefault(require("matrix-encrypt-attachment")); var _matrix = require("matrix-js-sdk/src/matrix"); var _Media = require("../customisations/Media"); var _blobs = require("./blobs"); /* Copyright 2024 New Vector Ltd. Copyright 2016-2018 , 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ // Pull in the encryption lib so that we can decrypt attachments. class DownloadError extends Error { constructor(e) { super(e.message); this.name = "DownloadError"; this.stack = e.stack; } } exports.DownloadError = DownloadError; class DecryptError extends Error { constructor(e) { super(e.message); this.name = "DecryptError"; this.stack = e.stack; } } /** * Decrypt a file attached to a matrix event. * @param {EncryptedFile} file The encrypted file information taken from the matrix event. * This passed to [link]{@link https://github.com/matrix-org/matrix-encrypt-attachment} * as the encryption info object, so will also have the those keys in addition to * the keys below. * @param {MediaEventInfo} info The info parameter taken from the matrix event. * @returns {Promise<Blob>} Resolves to a Blob of the file. */ exports.DecryptError = DecryptError; async function decryptFile(file, info) { // throws if file is falsy const media = (0, _Media.mediaFromContent)({ file }); let responseData; try { // Download the encrypted file as an array buffer. const response = await media.downloadSource(); if (!response.ok) { throw (0, _matrix.parseErrorResponse)(response, await response.text()); } responseData = await response.arrayBuffer(); } catch (e) { throw new DownloadError(e); } try { // Decrypt the array buffer using the information taken from the event content. const dataArray = await _matrixEncryptAttachment.default.decryptAttachment(responseData, file); // Turn the array into a Blob and give it the correct MIME-type. // IMPORTANT: we must not allow scriptable mime-types into Blobs otherwise // they introduce XSS attacks if the Blob URI is viewed directly in the // browser (e.g. by copying the URI into a new tab or window.) // See warning at top of file. let mimetype = info?.mimetype ? info.mimetype.split(";")[0].trim() : ""; mimetype = (0, _blobs.getBlobSafeMimeType)(mimetype); return new Blob([dataArray], { type: mimetype }); } catch (e) { throw new DecryptError(e); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4RW5jcnlwdEF0dGFjaG1lbnQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfTWVkaWEiLCJfYmxvYnMiLCJEb3dubG9hZEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImUiLCJtZXNzYWdlIiwibmFtZSIsInN0YWNrIiwiZXhwb3J0cyIsIkRlY3J5cHRFcnJvciIsImRlY3J5cHRGaWxlIiwiZmlsZSIsImluZm8iLCJtZWRpYSIsIm1lZGlhRnJvbUNvbnRlbnQiLCJyZXNwb25zZURhdGEiLCJyZXNwb25zZSIsImRvd25sb2FkU291cmNlIiwib2siLCJwYXJzZUVycm9yUmVzcG9uc2UiLCJ0ZXh0IiwiYXJyYXlCdWZmZXIiLCJkYXRhQXJyYXkiLCJlbmNyeXB0IiwiZGVjcnlwdEF0dGFjaG1lbnQiLCJtaW1ldHlwZSIsInNwbGl0IiwidHJpbSIsImdldEJsb2JTYWZlTWltZVR5cGUiLCJCbG9iIiwidHlwZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9EZWNyeXB0RmlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNi0yMDE4ICwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG4vLyBQdWxsIGluIHRoZSBlbmNyeXB0aW9uIGxpYiBzbyB0aGF0IHdlIGNhbiBkZWNyeXB0IGF0dGFjaG1lbnRzLlxuaW1wb3J0IGVuY3J5cHQgZnJvbSBcIm1hdHJpeC1lbmNyeXB0LWF0dGFjaG1lbnRcIjtcbmltcG9ydCB7IHBhcnNlRXJyb3JSZXNwb25zZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEVuY3J5cHRlZEZpbGUsIE1lZGlhRXZlbnRJbmZvIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5cbmltcG9ydCB7IG1lZGlhRnJvbUNvbnRlbnQgfSBmcm9tIFwiLi4vY3VzdG9taXNhdGlvbnMvTWVkaWFcIjtcbmltcG9ydCB7IGdldEJsb2JTYWZlTWltZVR5cGUgfSBmcm9tIFwiLi9ibG9ic1wiO1xuXG5leHBvcnQgY2xhc3MgRG93bmxvYWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZTogRXJyb3IpIHtcbiAgICAgICAgc3VwZXIoZS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJEb3dubG9hZEVycm9yXCI7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBlLnN0YWNrO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlY3J5cHRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZTogRXJyb3IpIHtcbiAgICAgICAgc3VwZXIoZS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJEZWNyeXB0RXJyb3JcIjtcbiAgICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxufVxuXG4vKipcbiAqIERlY3J5cHQgYSBmaWxlIGF0dGFjaGVkIHRvIGEgbWF0cml4IGV2ZW50LlxuICogQHBhcmFtIHtFbmNyeXB0ZWRGaWxlfSBmaWxlIFRoZSBlbmNyeXB0ZWQgZmlsZSBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZSBtYXRyaXggZXZlbnQuXG4gKiAgIFRoaXMgcGFzc2VkIHRvIFtsaW5rXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWF0cml4LW9yZy9tYXRyaXgtZW5jcnlwdC1hdHRhY2htZW50fVxuICogICBhcyB0aGUgZW5jcnlwdGlvbiBpbmZvIG9iamVjdCwgc28gd2lsbCBhbHNvIGhhdmUgdGhlIHRob3NlIGtleXMgaW4gYWRkaXRpb24gdG9cbiAqICAgdGhlIGtleXMgYmVsb3cuXG4gKiBAcGFyYW0ge01lZGlhRXZlbnRJbmZvfSBpbmZvIFRoZSBpbmZvIHBhcmFtZXRlciB0YWtlbiBmcm9tIHRoZSBtYXRyaXggZXZlbnQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCbG9iPn0gUmVzb2x2ZXMgdG8gYSBCbG9iIG9mIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdEZpbGUoZmlsZT86IEVuY3J5cHRlZEZpbGUsIGluZm8/OiBNZWRpYUV2ZW50SW5mbyk6IFByb21pc2U8QmxvYj4ge1xuICAgIC8vIHRocm93cyBpZiBmaWxlIGlzIGZhbHN5XG4gICAgY29uc3QgbWVkaWEgPSBtZWRpYUZyb21Db250ZW50KHsgZmlsZSB9KTtcblxuICAgIGxldCByZXNwb25zZURhdGE6IEFycmF5QnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIERvd25sb2FkIHRoZSBlbmNyeXB0ZWQgZmlsZSBhcyBhbiBhcnJheSBidWZmZXIuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWVkaWEuZG93bmxvYWRTb3VyY2UoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgdGhyb3cgcGFyc2VFcnJvclJlc3BvbnNlKHJlc3BvbnNlLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRG93bmxvYWRFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBEZWNyeXB0IHRoZSBhcnJheSBidWZmZXIgdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRha2VuIGZyb20gdGhlIGV2ZW50IGNvbnRlbnQuXG4gICAgICAgIGNvbnN0IGRhdGFBcnJheSA9IGF3YWl0IGVuY3J5cHQuZGVjcnlwdEF0dGFjaG1lbnQocmVzcG9uc2VEYXRhLCBmaWxlISk7XG4gICAgICAgIC8vIFR1cm4gdGhlIGFycmF5IGludG8gYSBCbG9iIGFuZCBnaXZlIGl0IHRoZSBjb3JyZWN0IE1JTUUtdHlwZS5cblxuICAgICAgICAvLyBJTVBPUlRBTlQ6IHdlIG11c3Qgbm90IGFsbG93IHNjcmlwdGFibGUgbWltZS10eXBlcyBpbnRvIEJsb2JzIG90aGVyd2lzZVxuICAgICAgICAvLyB0aGV5IGludHJvZHVjZSBYU1MgYXR0YWNrcyBpZiB0aGUgQmxvYiBVUkkgaXMgdmlld2VkIGRpcmVjdGx5IGluIHRoZVxuICAgICAgICAvLyBicm93c2VyIChlLmcuIGJ5IGNvcHlpbmcgdGhlIFVSSSBpbnRvIGEgbmV3IHRhYiBvciB3aW5kb3cuKVxuICAgICAgICAvLyBTZWUgd2FybmluZyBhdCB0b3Agb2YgZmlsZS5cbiAgICAgICAgbGV0IG1pbWV0eXBlID0gaW5mbz8ubWltZXR5cGUgPyBpbmZvLm1pbWV0eXBlLnNwbGl0KFwiO1wiKVswXS50cmltKCkgOiBcIlwiO1xuICAgICAgICBtaW1ldHlwZSA9IGdldEJsb2JTYWZlTWltZVR5cGUobWltZXR5cGUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YUFycmF5XSwgeyB0eXBlOiBtaW1ldHlwZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEZWNyeXB0RXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLHdCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFRTyxNQUFNSSxhQUFhLFNBQVNDLEtBQUssQ0FBQztFQUM5QkMsV0FBV0EsQ0FBQ0MsQ0FBUSxFQUFFO0lBQ3pCLEtBQUssQ0FBQ0EsQ0FBQyxDQUFDQyxPQUFPLENBQUM7SUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsZUFBZTtJQUMzQixJQUFJLENBQUNDLEtBQUssR0FBR0gsQ0FBQyxDQUFDRyxLQUFLO0VBQ3hCO0FBQ0o7QUFBQ0MsT0FBQSxDQUFBUCxhQUFBLEdBQUFBLGFBQUE7QUFFTSxNQUFNUSxZQUFZLFNBQVNQLEtBQUssQ0FBQztFQUM3QkMsV0FBV0EsQ0FBQ0MsQ0FBUSxFQUFFO0lBQ3pCLEtBQUssQ0FBQ0EsQ0FBQyxDQUFDQyxPQUFPLENBQUM7SUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsY0FBYztJQUMxQixJQUFJLENBQUNDLEtBQUssR0FBR0gsQ0FBQyxDQUFDRyxLQUFLO0VBQ3hCO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkFDLE9BQUEsQ0FBQUMsWUFBQSxHQUFBQSxZQUFBO0FBU08sZUFBZUMsV0FBV0EsQ0FBQ0MsSUFBb0IsRUFBRUMsSUFBcUIsRUFBaUI7RUFDMUY7RUFDQSxNQUFNQyxLQUFLLEdBQUcsSUFBQUMsdUJBQWdCLEVBQUM7SUFBRUg7RUFBSyxDQUFDLENBQUM7RUFFeEMsSUFBSUksWUFBeUI7RUFDN0IsSUFBSTtJQUNBO0lBQ0EsTUFBTUMsUUFBUSxHQUFHLE1BQU1ILEtBQUssQ0FBQ0ksY0FBYyxDQUFDLENBQUM7SUFDN0MsSUFBSSxDQUFDRCxRQUFRLENBQUNFLEVBQUUsRUFBRTtNQUNkLE1BQU0sSUFBQUMsMEJBQWtCLEVBQUNILFFBQVEsRUFBRSxNQUFNQSxRQUFRLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0Q7SUFDQUwsWUFBWSxHQUFHLE1BQU1DLFFBQVEsQ0FBQ0ssV0FBVyxDQUFDLENBQUM7RUFDL0MsQ0FBQyxDQUFDLE9BQU9qQixDQUFDLEVBQUU7SUFDUixNQUFNLElBQUlILGFBQWEsQ0FBQ0csQ0FBVSxDQUFDO0VBQ3ZDO0VBRUEsSUFBSTtJQUNBO0lBQ0EsTUFBTWtCLFNBQVMsR0FBRyxNQUFNQyxnQ0FBTyxDQUFDQyxpQkFBaUIsQ0FBQ1QsWUFBWSxFQUFFSixJQUFLLENBQUM7SUFDdEU7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJYyxRQUFRLEdBQUdiLElBQUksRUFBRWEsUUFBUSxHQUFHYixJQUFJLENBQUNhLFFBQVEsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFDdkVGLFFBQVEsR0FBRyxJQUFBRywwQkFBbUIsRUFBQ0gsUUFBUSxDQUFDO0lBRXhDLE9BQU8sSUFBSUksSUFBSSxDQUFDLENBQUNQLFNBQVMsQ0FBQyxFQUFFO01BQUVRLElBQUksRUFBRUw7SUFBUyxDQUFDLENBQUM7RUFDcEQsQ0FBQyxDQUFDLE9BQU9yQixDQUFDLEVBQUU7SUFDUixNQUFNLElBQUlLLFlBQVksQ0FBQ0wsQ0FBVSxDQUFDO0VBQ3RDO0FBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=