matrix-react-sdk
Version:
SDK for matrix.org using React
75 lines (70 loc) • 14.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DecryptionFailureBody = void 0;
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _cryptoApi = require("matrix-js-sdk/src/crypto-api");
var _icons = require("@vector-im/compound-design-tokens/assets/web/icons");
var _languageHandler = require("../../../languageHandler");
var _LocalDeviceVerificationStateContext = require("../../../contexts/LocalDeviceVerificationStateContext");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2022-2024 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.
*/
function getErrorMessage(mxEvent, isVerified) {
switch (mxEvent.decryptionFailureReason) {
case _cryptoApi.DecryptionFailureCode.MEGOLM_KEY_WITHHELD_FOR_UNVERIFIED_DEVICE:
return (0, _languageHandler._t)("timeline|decryption_failure|blocked");
case _cryptoApi.DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP:
return (0, _languageHandler._t)("timeline|decryption_failure|historical_event_no_key_backup");
case _cryptoApi.DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED:
if (isVerified === false) {
// The user seems to have a key backup, so prompt them to verify in the hope that doing so will
// mean we can restore from backup and we'll get the key for this message.
return (0, _languageHandler._t)("timeline|decryption_failure|historical_event_unverified_device");
}
// otherwise, use the default.
break;
case _cryptoApi.DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED:
// TODO: event should be hidden instead of showing this error.
// To be revisited as part of https://github.com/element-hq/element-meta/issues/2449
return (0, _languageHandler._t)("timeline|decryption_failure|historical_event_user_not_joined");
case _cryptoApi.DecryptionFailureCode.SENDER_IDENTITY_PREVIOUSLY_VERIFIED:
return /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_icons.WarningIcon, {
className: "mx_Icon mx_Icon_16"
}), (0, _languageHandler._t)("timeline|decryption_failure|sender_identity_previously_verified"));
case _cryptoApi.DecryptionFailureCode.UNSIGNED_SENDER_DEVICE:
// TODO: event should be hidden instead of showing this error.
// To be revisited as part of https://github.com/element-hq/element-meta/issues/2449
return (0, _languageHandler._t)("timeline|decryption_failure|sender_unsigned_device");
}
return (0, _languageHandler._t)("timeline|decryption_failure|unable_to_decrypt");
}
/** Get an extra CSS class, specific to the decryption failure reason */
function errorClassName(mxEvent) {
switch (mxEvent.decryptionFailureReason) {
case _cryptoApi.DecryptionFailureCode.SENDER_IDENTITY_PREVIOUSLY_VERIFIED:
return "mx_DecryptionFailureVerifiedIdentityChanged";
default:
return null;
}
}
// A placeholder element for messages that could not be decrypted
const DecryptionFailureBody = exports.DecryptionFailureBody = /*#__PURE__*/(0, _react.forwardRef)(({
mxEvent
}, ref) => {
const verificationState = (0, _react.useContext)(_LocalDeviceVerificationStateContext.LocalDeviceVerificationStateContext);
const classes = (0, _classnames.default)("mx_DecryptionFailureBody", "mx_EventTile_content", errorClassName(mxEvent));
return /*#__PURE__*/_react.default.createElement("div", {
className: classes,
ref: ref
}, getErrorMessage(mxEvent, verificationState));
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfY3J5cHRvQXBpIiwiX2ljb25zIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Mb2NhbERldmljZVZlcmlmaWNhdGlvblN0YXRlQ29udGV4dCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdldEVycm9yTWVzc2FnZSIsIm14RXZlbnQiLCJpc1ZlcmlmaWVkIiwiZGVjcnlwdGlvbkZhaWx1cmVSZWFzb24iLCJEZWNyeXB0aW9uRmFpbHVyZUNvZGUiLCJNRUdPTE1fS0VZX1dJVEhIRUxEX0ZPUl9VTlZFUklGSUVEX0RFVklDRSIsIl90IiwiSElTVE9SSUNBTF9NRVNTQUdFX05PX0tFWV9CQUNLVVAiLCJISVNUT1JJQ0FMX01FU1NBR0VfQkFDS1VQX1VOQ09ORklHVVJFRCIsIkhJU1RPUklDQUxfTUVTU0FHRV9VU0VSX05PVF9KT0lORUQiLCJTRU5ERVJfSURFTlRJVFlfUFJFVklPVVNMWV9WRVJJRklFRCIsImNyZWF0ZUVsZW1lbnQiLCJXYXJuaW5nSWNvbiIsImNsYXNzTmFtZSIsIlVOU0lHTkVEX1NFTkRFUl9ERVZJQ0UiLCJlcnJvckNsYXNzTmFtZSIsIkRlY3J5cHRpb25GYWlsdXJlQm9keSIsImV4cG9ydHMiLCJmb3J3YXJkUmVmIiwicmVmIiwidmVyaWZpY2F0aW9uU3RhdGUiLCJ1c2VDb250ZXh0IiwiTG9jYWxEZXZpY2VWZXJpZmljYXRpb25TdGF0ZUNvbnRleHQiLCJjbGFzc2VzIiwiY2xhc3NOYW1lcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL21lc3NhZ2VzL0RlY3J5cHRpb25GYWlsdXJlQm9keS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjItMjAyNCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIEZvcndhcmRSZWZFeG90aWNDb21wb25lbnQsIHVzZUNvbnRleHQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IE1hdHJpeEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgRGVjcnlwdGlvbkZhaWx1cmVDb2RlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2NyeXB0by1hcGlcIjtcbmltcG9ydCB7IFdhcm5pbmdJY29uIH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zXCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgSUJvZHlQcm9wcyB9IGZyb20gXCIuL0lCb2R5UHJvcHNcIjtcbmltcG9ydCB7IExvY2FsRGV2aWNlVmVyaWZpY2F0aW9uU3RhdGVDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL0xvY2FsRGV2aWNlVmVyaWZpY2F0aW9uU3RhdGVDb250ZXh0XCI7XG5cbmZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShteEV2ZW50OiBNYXRyaXhFdmVudCwgaXNWZXJpZmllZDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50IHtcbiAgICBzd2l0Y2ggKG14RXZlbnQuZGVjcnlwdGlvbkZhaWx1cmVSZWFzb24pIHtcbiAgICAgICAgY2FzZSBEZWNyeXB0aW9uRmFpbHVyZUNvZGUuTUVHT0xNX0tFWV9XSVRISEVMRF9GT1JfVU5WRVJJRklFRF9ERVZJQ0U6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJ0aW1lbGluZXxkZWNyeXB0aW9uX2ZhaWx1cmV8YmxvY2tlZFwiKTtcblxuICAgICAgICBjYXNlIERlY3J5cHRpb25GYWlsdXJlQ29kZS5ISVNUT1JJQ0FMX01FU1NBR0VfTk9fS0VZX0JBQ0tVUDpcbiAgICAgICAgICAgIHJldHVybiBfdChcInRpbWVsaW5lfGRlY3J5cHRpb25fZmFpbHVyZXxoaXN0b3JpY2FsX2V2ZW50X25vX2tleV9iYWNrdXBcIik7XG5cbiAgICAgICAgY2FzZSBEZWNyeXB0aW9uRmFpbHVyZUNvZGUuSElTVE9SSUNBTF9NRVNTQUdFX0JBQ0tVUF9VTkNPTkZJR1VSRUQ6XG4gICAgICAgICAgICBpZiAoaXNWZXJpZmllZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBzZWVtcyB0byBoYXZlIGEga2V5IGJhY2t1cCwgc28gcHJvbXB0IHRoZW0gdG8gdmVyaWZ5IGluIHRoZSBob3BlIHRoYXQgZG9pbmcgc28gd2lsbFxuICAgICAgICAgICAgICAgIC8vIG1lYW4gd2UgY2FuIHJlc3RvcmUgZnJvbSBiYWNrdXAgYW5kIHdlJ2xsIGdldCB0aGUga2V5IGZvciB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF90KFwidGltZWxpbmV8ZGVjcnlwdGlvbl9mYWlsdXJlfGhpc3RvcmljYWxfZXZlbnRfdW52ZXJpZmllZF9kZXZpY2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdC5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRGVjcnlwdGlvbkZhaWx1cmVDb2RlLkhJU1RPUklDQUxfTUVTU0FHRV9VU0VSX05PVF9KT0lORUQ6XG4gICAgICAgICAgICAvLyBUT0RPOiBldmVudCBzaG91bGQgYmUgaGlkZGVuIGluc3RlYWQgb2Ygc2hvd2luZyB0aGlzIGVycm9yLlxuICAgICAgICAgICAgLy8gICBUbyBiZSByZXZpc2l0ZWQgYXMgcGFydCBvZiBodHRwczovL2dpdGh1Yi5jb20vZWxlbWVudC1ocS9lbGVtZW50LW1ldGEvaXNzdWVzLzI0NDlcbiAgICAgICAgICAgIHJldHVybiBfdChcInRpbWVsaW5lfGRlY3J5cHRpb25fZmFpbHVyZXxoaXN0b3JpY2FsX2V2ZW50X3VzZXJfbm90X2pvaW5lZFwiKTtcblxuICAgICAgICBjYXNlIERlY3J5cHRpb25GYWlsdXJlQ29kZS5TRU5ERVJfSURFTlRJVFlfUFJFVklPVVNMWV9WRVJJRklFRDpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxXYXJuaW5nSWNvbiBjbGFzc05hbWU9XCJteF9JY29uIG14X0ljb25fMTZcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJ0aW1lbGluZXxkZWNyeXB0aW9uX2ZhaWx1cmV8c2VuZGVyX2lkZW50aXR5X3ByZXZpb3VzbHlfdmVyaWZpZWRcIil9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjYXNlIERlY3J5cHRpb25GYWlsdXJlQ29kZS5VTlNJR05FRF9TRU5ERVJfREVWSUNFOlxuICAgICAgICAgICAgLy8gVE9ETzogZXZlbnQgc2hvdWxkIGJlIGhpZGRlbiBpbnN0ZWFkIG9mIHNob3dpbmcgdGhpcyBlcnJvci5cbiAgICAgICAgICAgIC8vICAgVG8gYmUgcmV2aXNpdGVkIGFzIHBhcnQgb2YgaHR0cHM6Ly9naXRodWIuY29tL2VsZW1lbnQtaHEvZWxlbWVudC1tZXRhL2lzc3Vlcy8yNDQ5XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJ0aW1lbGluZXxkZWNyeXB0aW9uX2ZhaWx1cmV8c2VuZGVyX3Vuc2lnbmVkX2RldmljZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIF90KFwidGltZWxpbmV8ZGVjcnlwdGlvbl9mYWlsdXJlfHVuYWJsZV90b19kZWNyeXB0XCIpO1xufVxuXG4vKiogR2V0IGFuIGV4dHJhIENTUyBjbGFzcywgc3BlY2lmaWMgdG8gdGhlIGRlY3J5cHRpb24gZmFpbHVyZSByZWFzb24gKi9cbmZ1bmN0aW9uIGVycm9yQ2xhc3NOYW1lKG14RXZlbnQ6IE1hdHJpeEV2ZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgc3dpdGNoIChteEV2ZW50LmRlY3J5cHRpb25GYWlsdXJlUmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGVjcnlwdGlvbkZhaWx1cmVDb2RlLlNFTkRFUl9JREVOVElUWV9QUkVWSU9VU0xZX1ZFUklGSUVEOlxuICAgICAgICAgICAgcmV0dXJuIFwibXhfRGVjcnlwdGlvbkZhaWx1cmVWZXJpZmllZElkZW50aXR5Q2hhbmdlZFwiO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIEEgcGxhY2Vob2xkZXIgZWxlbWVudCBmb3IgbWVzc2FnZXMgdGhhdCBjb3VsZCBub3QgYmUgZGVjcnlwdGVkXG5leHBvcnQgY29uc3QgRGVjcnlwdGlvbkZhaWx1cmVCb2R5ID0gZm9yd2FyZFJlZjxIVE1MRGl2RWxlbWVudCwgSUJvZHlQcm9wcz4oKHsgbXhFdmVudCB9LCByZWYpOiBSZWFjdC5KU1guRWxlbWVudCA9PiB7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uU3RhdGUgPSB1c2VDb250ZXh0KExvY2FsRGV2aWNlVmVyaWZpY2F0aW9uU3RhdGVDb250ZXh0KTtcbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X0RlY3J5cHRpb25GYWlsdXJlQm9keVwiLCBcIm14X0V2ZW50VGlsZV9jb250ZW50XCIsIGVycm9yQ2xhc3NOYW1lKG14RXZlbnQpKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfSByZWY9e3JlZn0+XG4gICAgICAgICAgICB7Z2V0RXJyb3JNZXNzYWdlKG14RXZlbnQsIHZlcmlmaWNhdGlvblN0YXRlKX1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn0pIGFzIEZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8SUJvZHlQcm9wcz47XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFRQSxJQUFBQSxXQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxnQkFBQSxHQUFBTCxPQUFBO0FBRUEsSUFBQU0sb0NBQUEsR0FBQU4sT0FBQTtBQUE0RyxTQUFBTyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBTix3QkFBQU0sQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFD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