mirror of https://github.com/vector-im/riot-web
				
				
				
			Add verification with QR codes
							parent
							
								
									d3960b8c54
								
							
						
					
					
						commit
						1ec746c014
					
				|  | @ -217,7 +217,7 @@ class _MatrixClientPeg { | |||
|             timelineSupport: true, | ||||
|             forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false), | ||||
|             fallbackICEServerAllowed: !!SettingsStore.getValue('fallbackICEServerAllowed'), | ||||
|             verificationMethods: [verificationMethods.SAS], | ||||
|             verificationMethods: [verificationMethods.SAS, verificationMethods.QR_CODE_SHOW], | ||||
|             unstableClientRelationAggregation: true, | ||||
|             identityServer: new IdentityAuthClient(), | ||||
|         }; | ||||
|  |  | |||
|  | @ -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 * as sdk from '../../../index'; | ||||
| 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 { | ||||
|     constructor(props) { | ||||
|  | @ -36,15 +39,30 @@ export default class VerificationPanel extends React.PureComponent { | |||
|     renderStatus() { | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|         const {request} = this.props; | ||||
|         const {request: req} = this.props; | ||||
|         const request: VerificationRequest = req; | ||||
| 
 | ||||
|         if (request.requested) { | ||||
|             return (<p>Waiting for {request.otherUserId} to accept ... <Spinner /></p>); | ||||
|         } 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}> | ||||
|                 Verify by emoji | ||||
|             </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) { | ||||
|             if (this.state.sasWaitingForOtherParty) { | ||||
|                 return <p>Waiting for {request.otherUserId} to confirm ...</p>; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Travis Ralston
						Travis Ralston