Add verification with QR codes
This commit is contained in:
parent
d3960b8c54
commit
1ec746c014
3 changed files with 80 additions and 3 deletions
|
@ -217,7 +217,7 @@ class _MatrixClientPeg {
|
||||||
timelineSupport: true,
|
timelineSupport: true,
|
||||||
forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false),
|
forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false),
|
||||||
fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'),
|
fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'),
|
||||||
verificationMethods: [verificationMethods.SAS],
|
verificationMethods: [verificationMethods.SAS, verificationMethods.QR_CODE_SHOW],
|
||||||
unstableClientRelationAggregation: true,
|
unstableClientRelationAggregation: true,
|
||||||
identityServer: new IdentityAuthClient(),
|
identityServer: new IdentityAuthClient(),
|
||||||
};
|
};
|
||||||
|
|
59
src/components/views/elements/crypto/VerificationQRCode.js
Normal file
59
src/components/views/elements/crypto/VerificationQRCode.js
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import {replaceableComponent} from "../../../../utils/replaceableComponent";
|
||||||
|
import * as qs from "qs";
|
||||||
|
import QRCode from "qrcode-react";
|
||||||
|
|
||||||
|
@replaceableComponent("views.elements.crypto.VerificationQRCode")
|
||||||
|
export default class VerificationQRCode extends React.PureComponent {
|
||||||
|
static propTypes = {
|
||||||
|
// Common for all kinds of QR codes
|
||||||
|
keys: PropTypes.array.isRequired, // array of [Key ID, Key] pairs
|
||||||
|
action: PropTypes.string.isRequired,
|
||||||
|
keyholderUserId: PropTypes.string.isRequired,
|
||||||
|
|
||||||
|
// User verification use case only
|
||||||
|
secret: PropTypes.string,
|
||||||
|
otherUserKey: PropTypes.string,
|
||||||
|
verificationKey: PropTypes.string,
|
||||||
|
verificationAlgorithms: PropTypes.array,
|
||||||
|
requestEventId: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
|
static defaultProps = {
|
||||||
|
action: "verify",
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const query = {
|
||||||
|
request: this.props.requestEventId,
|
||||||
|
action: this.props.action,
|
||||||
|
verification_algorithms: this.props.verificationAlgorithms,
|
||||||
|
verification_key: this.props.verificationKey,
|
||||||
|
other_user_key: this.props.otherUserKey,
|
||||||
|
};
|
||||||
|
for (const key of this.props.keys) {
|
||||||
|
query[`key_${key[0]}`] = key[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
const uri = `https://matrix.to/#/${this.props.keyholderUserId}?${qs.stringify(query)}`;
|
||||||
|
|
||||||
|
return <QRCode value={uri} size={256} logoWidth={48} logo={require("../../../../../res/img/matrix-m.svg")} />
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,9 @@ limitations under the License.
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import * as sdk from '../../../index';
|
import * as sdk from '../../../index';
|
||||||
import {verificationMethods} from 'matrix-js-sdk/src/crypto';
|
import {verificationMethods} from 'matrix-js-sdk/src/crypto';
|
||||||
|
import VerificationQRCode from "../elements/crypto/VerificationQRCode";
|
||||||
|
import {VerificationRequest} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
|
||||||
|
import {MatrixClientPeg} from "../../../MatrixClientPeg";
|
||||||
|
|
||||||
export default class VerificationPanel extends React.PureComponent {
|
export default class VerificationPanel extends React.PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -36,15 +39,30 @@ export default class VerificationPanel extends React.PureComponent {
|
||||||
renderStatus() {
|
renderStatus() {
|
||||||
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
|
||||||
const Spinner = sdk.getComponent('elements.Spinner');
|
const Spinner = sdk.getComponent('elements.Spinner');
|
||||||
const {request} = this.props;
|
const {request: req} = this.props;
|
||||||
|
const request: VerificationRequest = req;
|
||||||
|
|
||||||
if (request.requested) {
|
if (request.requested) {
|
||||||
return (<p>Waiting for {request.otherUserId} to accept ... <Spinner /></p>);
|
return (<p>Waiting for {request.otherUserId} to accept ... <Spinner /></p>);
|
||||||
} else if (request.ready) {
|
} else if (request.ready) {
|
||||||
|
const qrCodeKeys = [
|
||||||
|
[MatrixClientPeg.get().getDeviceId(), MatrixClientPeg.get().getDeviceEd25519Key()],
|
||||||
|
[MatrixClientPeg.get().getCrossSigningId(), MatrixClientPeg.get().getCrossSigningKey("master")],
|
||||||
|
];
|
||||||
|
// TODO: Await a bunch of this
|
||||||
|
const otherCrossSigning = MatrixClientPeg.get().getStoredCrossSigningForUser(request.otherUserId);
|
||||||
|
const otherUserKey = otherCrossSigning ? otherCrossSigning.getCrossSigningKey("master") : null;
|
||||||
|
const qrCode = <VerificationQRCode
|
||||||
|
keyholderUserId={MatrixClientPeg.get().getUserId()}
|
||||||
|
requestEventId={request.event.eventId}
|
||||||
|
otherUserKey={otherUserKey}
|
||||||
|
secret={request.encodedSharedSecret}
|
||||||
|
keys={qrCodeKeys}
|
||||||
|
/>;
|
||||||
const verifyButton = <AccessibleButton kind="primary" onClick={this._startSAS}>
|
const verifyButton = <AccessibleButton kind="primary" onClick={this._startSAS}>
|
||||||
Verify by emoji
|
Verify by emoji
|
||||||
</AccessibleButton>;
|
</AccessibleButton>;
|
||||||
return (<p>{request.otherUserId} is ready, start {verifyButton}</p>);
|
return (<p>{request.otherUserId} is ready, start {verifyButton} or have them scan: {qrCode}</p>);
|
||||||
} else if (request.started) {
|
} else if (request.started) {
|
||||||
if (this.state.sasWaitingForOtherParty) {
|
if (this.state.sasWaitingForOtherParty) {
|
||||||
return <p>Waiting for {request.otherUserId} to confirm ...</p>;
|
return <p>Waiting for {request.otherUserId} to confirm ...</p>;
|
||||||
|
|
Loading…
Reference in a new issue