matrix-react-sdk
Version:
SDK for matrix.org using React
92 lines (87 loc) • 15.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MatrixClientContextProvider = MatrixClientContextProvider;
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _useEventEmitter = require("../../hooks/useEventEmitter");
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 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.
*/
/**
* A React hook whose value is whether the local device has been "verified".
*
* Figuring out if we are verified is an async operation, so on the first render this always returns `false`, but
* fires off a background job to update a state variable. It also registers an event listener to update the state
* variable changes.
*
* @param client - Matrix client.
* @returns A boolean which is `true` if the local device has been verified.
*
* @remarks
*
* Some notes on implementation.
*
* It turns out "is this device verified?" isn't a question that is easy to answer as you might think.
*
* Roughly speaking, it normally means "do we believe this device actually belongs to the person it claims to belong
* to", and that data is available via `getDeviceVerificationStatus().isVerified()`. However, the problem is that for
* the local device, that "do we believe..." question is trivially true, and `isVerified()` always returns true.
*
* Instead, when we're talking about the local device, what we really mean is one of:
* * "have we completed a verification dance (either interactive verification with a device with access to the
* cross-signing secrets, or typing in the 4S key)?", or
* * "will other devices consider this one to be verified?"
*
* (The first is generally required but not sufficient for the second to be true.)
*
* The second question basically amounts to "has this device been signed by our cross-signing key". So one option here
* is to use `getDeviceVerificationStatus().isCrossSigningVerified()`. That might work, but it's a bit annoying because
* it needs a `/keys/query` request to complete after the actual verification process completes.
*
* A slightly less rigorous check is just to find out if we have validated our own public cross-signing keys. If we
* have, it's a good indication that we've at least completed a verification dance -- and hopefully, during that dance,
* a cross-signature of our own device was published. And it's also easy to monitor via `UserTrustStatusChanged` events.
*
* Sooo: TL;DR: `getUserVerificationStatus()` is a good proxy for "is the local device verified?".
*/
function useLocalVerificationState(client) {
const [value, setValue] = (0, _react.useState)(false);
// On the first render, initialise the state variable
(0, _react.useEffect)(() => {
const userId = client.getUserId();
if (!userId) return;
const crypto = client.getCrypto();
crypto?.getUserVerificationStatus(userId).then(verificationStatus => setValue(verificationStatus.isCrossSigningVerified()), error => _logger.logger.error("Error fetching verification status", error));
}, [client]);
// Update the value whenever our own trust status changes.
(0, _useEventEmitter.useEventEmitter)(client, _matrix.CryptoEvent.UserTrustStatusChanged, (userId, verificationStatus) => {
if (userId === client.getUserId()) {
setValue(verificationStatus.isCrossSigningVerified());
}
});
return value;
}
/**
* A React component which exposes a {@link MatrixClientContext} and a {@link LocalDeviceVerificationStateContext}
* to its children.
*/
function MatrixClientContextProvider(props) {
const verificationState = useLocalVerificationState(props.client);
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, {
value: props.client
}, /*#__PURE__*/_react.default.createElement(_LocalDeviceVerificationStateContext.LocalDeviceVerificationStateContext.Provider, {
value: verificationState
}, props.children));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xvZ2dlciIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91c2VFdmVudEVtaXR0ZXIiLCJfTG9jYWxEZXZpY2VWZXJpZmljYXRpb25TdGF0ZUNvbnRleHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJ1c2VMb2NhbFZlcmlmaWNhdGlvblN0YXRlIiwiY2xpZW50IiwidmFsdWUiLCJzZXRWYWx1ZSIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwidXNlcklkIiwiZ2V0VXNlcklkIiwiY3J5cHRvIiwiZ2V0Q3J5cHRvIiwiZ2V0VXNlclZlcmlmaWNhdGlvblN0YXR1cyIsInRoZW4iLCJ2ZXJpZmljYXRpb25TdGF0dXMiLCJpc0Nyb3NzU2lnbmluZ1ZlcmlmaWVkIiwiZXJyb3IiLCJsb2dnZXIiLCJ1c2VFdmVudEVtaXR0ZXIiLCJDcnlwdG9FdmVudCIsIlVzZXJUcnVzdFN0YXR1c0NoYW5nZWQiLCJNYXRyaXhDbGllbnRDb250ZXh0UHJvdmlkZXIiLCJwcm9wcyIsInZlcmlmaWNhdGlvblN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIlByb3ZpZGVyIiwiTG9jYWxEZXZpY2VWZXJpZmljYXRpb25TdGF0ZUNvbnRleHQiLCJjaGlsZHJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvTWF0cml4Q2xpZW50Q29udGV4dFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyNCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgUHJvcHNXaXRoQ2hpbGRyZW4sIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENyeXB0b0V2ZW50LCBNYXRyaXhDbGllbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VFdmVudEVtaXR0ZXIgfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBMb2NhbERldmljZVZlcmlmaWNhdGlvblN0YXRlQ29udGV4dCB9IGZyb20gXCIuLi8uLi9jb250ZXh0cy9Mb2NhbERldmljZVZlcmlmaWNhdGlvblN0YXRlQ29udGV4dFwiO1xuXG4vKipcbiAqIEEgUmVhY3QgaG9vayB3aG9zZSB2YWx1ZSBpcyB3aGV0aGVyIHRoZSBsb2NhbCBkZXZpY2UgaGFzIGJlZW4gXCJ2ZXJpZmllZFwiLlxuICpcbiAqIEZpZ3VyaW5nIG91dCBpZiB3ZSBhcmUgdmVyaWZpZWQgaXMgYW4gYXN5bmMgb3BlcmF0aW9uLCBzbyBvbiB0aGUgZmlyc3QgcmVuZGVyIHRoaXMgYWx3YXlzIHJldHVybnMgYGZhbHNlYCwgYnV0XG4gKiBmaXJlcyBvZmYgYSBiYWNrZ3JvdW5kIGpvYiB0byB1cGRhdGUgYSBzdGF0ZSB2YXJpYWJsZS4gSXQgYWxzbyByZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdXBkYXRlIHRoZSBzdGF0ZVxuICogdmFyaWFibGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gY2xpZW50IC0gTWF0cml4IGNsaWVudC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiB3aGljaCBpcyBgdHJ1ZWAgaWYgdGhlIGxvY2FsIGRldmljZSBoYXMgYmVlbiB2ZXJpZmllZC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFNvbWUgbm90ZXMgb24gaW1wbGVtZW50YXRpb24uXG4gKlxuICogSXQgdHVybnMgb3V0IFwiaXMgdGhpcyBkZXZpY2UgdmVyaWZpZWQ/XCIgaXNuJ3QgYSBxdWVzdGlvbiB0aGF0IGlzIGVhc3kgdG8gYW5zd2VyIGFzIHlvdSBtaWdodCB0aGluay5cbiAqXG4gKiBSb3VnaGx5IHNwZWFraW5nLCBpdCBub3JtYWxseSBtZWFucyBcImRvIHdlIGJlbGlldmUgdGhpcyBkZXZpY2UgYWN0dWFsbHkgYmVsb25ncyB0byB0aGUgcGVyc29uIGl0IGNsYWltcyB0byBiZWxvbmdcbiAqIHRvXCIsIGFuZCB0aGF0IGRhdGEgaXMgYXZhaWxhYmxlIHZpYSBgZ2V0RGV2aWNlVmVyaWZpY2F0aW9uU3RhdHVzKCkuaXNWZXJpZmllZCgpYC4gSG93ZXZlciwgdGhlIHByb2JsZW0gaXMgdGhhdCBmb3JcbiAqIHRoZSBsb2NhbCBkZXZpY2UsIHRoYXQgXCJkbyB3ZSBiZWxpZXZlLi4uXCIgcXVlc3Rpb24gaXMgdHJpdmlhbGx5IHRydWUsIGFuZCBgaXNWZXJpZmllZCgpYCBhbHdheXMgcmV0dXJucyB0cnVlLlxuICpcbiAqIEluc3RlYWQsIHdoZW4gd2UncmUgdGFsa2luZyBhYm91dCB0aGUgbG9jYWwgZGV2aWNlLCB3aGF0IHdlIHJlYWxseSBtZWFuIGlzIG9uZSBvZjpcbiAqICAqIFwiaGF2ZSB3ZSBjb21wbGV0ZWQgYSB2ZXJpZmljYXRpb24gZGFuY2UgKGVpdGhlciBpbnRlcmFjdGl2ZSB2ZXJpZmljYXRpb24gd2l0aCBhIGRldmljZSB3aXRoIGFjY2VzcyB0byB0aGVcbiAqICAgIGNyb3NzLXNpZ25pbmcgc2VjcmV0cywgb3IgdHlwaW5nIGluIHRoZSA0UyBrZXkpP1wiLCBvclxuICogICogXCJ3aWxsIG90aGVyIGRldmljZXMgY29uc2lkZXIgdGhpcyBvbmUgdG8gYmUgdmVyaWZpZWQ/XCJcbiAqXG4gKiAoVGhlIGZpcnN0IGlzIGdlbmVyYWxseSByZXF1aXJlZCBidXQgbm90IHN1ZmZpY2llbnQgZm9yIHRoZSBzZWNvbmQgdG8gYmUgdHJ1ZS4pXG4gKlxuICogVGhlIHNlY29uZCBxdWVzdGlvbiBiYXNpY2FsbHkgYW1vdW50cyB0byBcImhhcyB0aGlzIGRldmljZSBiZWVuIHNpZ25lZCBieSBvdXIgY3Jvc3Mtc2lnbmluZyBrZXlcIi4gU28gb25lIG9wdGlvbiBoZXJlXG4gKiBpcyB0byB1c2UgYGdldERldmljZVZlcmlmaWNhdGlvblN0YXR1cygpLmlzQ3Jvc3NTaWduaW5nVmVyaWZpZWQoKWAuIFRoYXQgbWlnaHQgd29yaywgYnV0IGl0J3MgYSBiaXQgYW5ub3lpbmcgYmVjYXVzZVxuICogaXQgbmVlZHMgYSBgL2tleXMvcXVlcnlgIHJlcXVlc3QgdG8gY29tcGxldGUgYWZ0ZXIgdGhlIGFjdHVhbCB2ZXJpZmljYXRpb24gcHJvY2VzcyBjb21wbGV0ZXMuXG4gKlxuICogQSBzbGlnaHRseSBsZXNzIHJpZ29yb3VzIGNoZWNrIGlzIGp1c3QgdG8gZmluZCBvdXQgaWYgd2UgaGF2ZSB2YWxpZGF0ZWQgb3VyIG93biBwdWJsaWMgY3Jvc3Mtc2lnbmluZyBrZXlzLiBJZiB3ZVxuICogaGF2ZSwgaXQncyBhIGdvb2QgaW5kaWNhdGlvbiB0aGF0IHdlJ3ZlIGF0IGxlYXN0IGNvbXBsZXRlZCBhIHZlcmlmaWNhdGlvbiBkYW5jZSAtLSBhbmQgaG9wZWZ1bGx5LCBkdXJpbmcgdGhhdCBkYW5jZSxcbiAqIGEgY3Jvc3Mtc2lnbmF0dXJlIG9mIG91ciBvd24gZGV2aWNlIHdhcyBwdWJsaXNoZWQuIEFuZCBpdCdzIGFsc28gZWFzeSB0byBtb25pdG9yIHZpYSBgVXNlclRydXN0U3RhdHVzQ2hhbmdlZGAgZXZlbnRzLlxuICpcbiAqIFNvb286IFRMO0RSOiBgZ2V0VXNlclZlcmlmaWNhdGlvblN0YXR1cygpYCBpcyBhIGdvb2QgcHJveHkgZm9yIFwiaXMgdGhlIGxvY2FsIGRldmljZSB2ZXJpZmllZD9cIi5cbiAqL1xuZnVuY3Rpb24gdXNlTG9jYWxWZXJpZmljYXRpb25TdGF0ZShjbGllbnQ6IE1hdHJpeENsaWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgLy8gT24gdGhlIGZpcnN0IHJlbmRlciwgaW5pdGlhbGlzZSB0aGUgc3RhdGUgdmFyaWFibGVcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VySWQgPSBjbGllbnQuZ2V0VXNlcklkKCk7XG4gICAgICAgIGlmICghdXNlcklkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNyeXB0byA9IGNsaWVudC5nZXRDcnlwdG8oKTtcbiAgICAgICAgY3J5cHRvPy5nZXRVc2VyVmVyaWZpY2F0aW9uU3RhdHVzKHVzZXJJZCkudGhlbihcbiAgICAgICAgICAgICh2ZXJpZmljYXRpb25TdGF0dXMpID0+IHNldFZhbHVlKHZlcmlmaWNhdGlvblN0YXR1cy5pc0Nyb3NzU2lnbmluZ1ZlcmlmaWVkKCkpLFxuICAgICAgICAgICAgKGVycm9yKSA9PiBsb2dnZXIuZXJyb3IoXCJFcnJvciBmZXRjaGluZyB2ZXJpZmljYXRpb24gc3RhdHVzXCIsIGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9LCBbY2xpZW50XSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHZhbHVlIHdoZW5ldmVyIG91ciBvd24gdHJ1c3Qgc3RhdHVzIGNoYW5nZXMuXG4gICAgdXNlRXZlbnRFbWl0dGVyKGNsaWVudCwgQ3J5cHRvRXZlbnQuVXNlclRydXN0U3RhdHVzQ2hhbmdlZCwgKHVzZXJJZCwgdmVyaWZpY2F0aW9uU3RhdHVzKSA9PiB7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGNsaWVudC5nZXRVc2VySWQoKSkge1xuICAgICAgICAgICAgc2V0VmFsdWUodmVyaWZpY2F0aW9uU3RhdHVzLmlzQ3Jvc3NTaWduaW5nVmVyaWZpZWQoKSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgICAvKiogTWF0cml4IGNsaWVudCwgd2hpY2ggaXMgZXhwb3NlZCB0byBhbGwgY2hpbGQgY29tcG9uZW50cyB2aWEge0BsaW5rIE1hdHJpeENsaWVudENvbnRleHR9LiAqL1xuICAgIGNsaWVudDogTWF0cml4Q2xpZW50O1xufVxuXG4vKipcbiAqIEEgUmVhY3QgY29tcG9uZW50IHdoaWNoIGV4cG9zZXMgYSB7QGxpbmsgTWF0cml4Q2xpZW50Q29udGV4dH0gYW5kIGEge0BsaW5rIExvY2FsRGV2aWNlVmVyaWZpY2F0aW9uU3RhdGVDb250ZXh0fVxuICogdG8gaXRzIGNoaWxkcmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWF0cml4Q2xpZW50Q29udGV4dFByb3ZpZGVyKHByb3BzOiBQcm9wc1dpdGhDaGlsZHJlbjxQcm9wcz4pOiBSZWFjdC5KU1guRWxlbWVudCB7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uU3RhdGUgPSB1c2VMb2NhbFZlcmlmaWNhdGlvblN0YXRlKHByb3BzLmNsaWVudCk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPE1hdHJpeENsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Byb3BzLmNsaWVudH0+XG4gICAgICAgICAgICA8TG9jYWxEZXZpY2VWZXJpZmljYXRpb25TdGF0ZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZlcmlmaWNhdGlvblN0YXRlfT5cbiAgICAgICAgICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICA8L0xvY2FsRGV2aWNlVmVyaWZpY2F0aW9uU3RhdGVDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L01hdHJpeENsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLG9CQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sb0NBQUEsR0FBQU4sT0FBQTtBQUF5RyxTQUFBTyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBVCx3QkFBQVMsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEs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