Simplify references to VerificationRequest (#11045)

* Use new `VerificationRequest.getQRCodeBytes()`

* Use new `VerificationRequest.otherDeviceId`

* Remove references to `VerificationRequest.channel`

* Replace references to `VerificationRequest.{requesting,receiving}UserId`

Normally these are guarded by `request.initiatedByMe` so we can trivially
replace it with `request.otherUserId` or `client.getUserId()`. In one place we
actually need to apply some logic.

* increase test coverage

* Even more test coverage

* Even more test coverage
This commit is contained in:
Richard van der Hoff 2023-06-07 15:43:44 +01:00 committed by GitHub
parent ac2c9cef8d
commit 34439ee652
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 310 additions and 33 deletions

View file

@ -1667,7 +1667,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
);
} else if (request.pending) {
ToastStore.sharedInstance().addOrReplaceToast({
key: "verifreq_" + request.channel.transactionId,
key: "verifreq_" + request.transactionId,
title: _t("Verification requested"),
icon: "verification",
props: { request },

View file

@ -15,19 +15,18 @@ limitations under the License.
*/
import React from "react";
import { QRCodeData } from "matrix-js-sdk/src/crypto/verification/QRCode";
import QRCode from "../QRCode";
interface IProps {
qrCodeData: QRCodeData;
qrCodeBytes: Buffer;
}
export default class VerificationQRCode extends React.PureComponent<IProps> {
public render(): React.ReactNode {
return (
<QRCode
data={[{ data: this.props.qrCodeData.getBuffer(), mode: "byte" }]}
data={[{ data: this.props.qrCodeBytes, mode: "byte" }]}
className="mx_VerificationQRCode"
width={196}
/>

View file

@ -148,7 +148,7 @@ export default class MKeyVerificationRequest extends React.Component<IProps> {
if (accepted) {
stateLabel = (
<AccessibleButton onClick={this.openRequest}>
{this.acceptedLabel(request.receivingUserId)}
{this.acceptedLabel(request.initiatedByMe ? request.otherUserId : client.getSafeUserId())}
</AccessibleButton>
);
} else if (request.phase === VerificationPhase.Cancelled) {
@ -162,9 +162,9 @@ export default class MKeyVerificationRequest extends React.Component<IProps> {
}
if (!request.initiatedByMe) {
const name = getNameForEventRoom(client, request.requestingUserId, mxEvent.getRoomId()!);
const name = getNameForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!);
title = _t("%(name)s wants to verify", { name });
subtitle = userLabelForEventRoom(client, request.requestingUserId, mxEvent.getRoomId()!);
subtitle = userLabelForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!);
if (request.canAccept) {
stateNode = (
<div className="mx_cryptoEvent_buttons">
@ -180,7 +180,7 @@ export default class MKeyVerificationRequest extends React.Component<IProps> {
} else {
// request sent by us
title = _t("You sent a verification request");
subtitle = userLabelForEventRoom(client, request.receivingUserId, mxEvent.getRoomId()!);
subtitle = userLabelForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!);
}
if (title) {

View file

@ -165,7 +165,7 @@ const EncryptionPanel: React.FC<IProps> = (props: IProps) => {
onClose={onClose}
member={member}
request={request}
key={request.channel.transactionId}
key={request.transactionId}
inDialog={layout === "dialog"}
phase={phase}
/>

View file

@ -67,6 +67,7 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
const { member, request } = this.props;
const showSAS: boolean = request.otherPartySupportsMethod(verificationMethods.SAS);
const showQR: boolean = request.otherPartySupportsMethod(SCAN_QR_CODE_METHOD);
const qrCodeBytes = showQR ? request.getQRCodeBytes() : null;
const brand = SdkConfig.get().brand;
const noCommonMethodError: JSX.Element | null =
@ -85,11 +86,11 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
// HACK: This is a terrible idea.
let qrBlockDialog: JSX.Element | undefined;
let sasBlockDialog: JSX.Element | undefined;
if (showQR && request.qrCodeData) {
if (!!qrCodeBytes) {
qrBlockDialog = (
<div className="mx_VerificationPanel_QRPhase_startOption">
<p>{_t("Scan this unique code")}</p>
<VerificationQRCode qrCodeData={request.qrCodeData} />
<VerificationQRCode qrCodeBytes={qrCodeBytes} />
</div>
);
}
@ -133,7 +134,7 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
}
let qrBlock: JSX.Element | undefined;
if (showQR && request.qrCodeData) {
if (!!qrCodeBytes) {
qrBlock = (
<div className="mx_UserInfo_container">
<h3>{_t("Verify by scanning")}</h3>
@ -144,7 +145,7 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
</p>
<div className="mx_VerificationPanel_qrCode">
<VerificationQRCode qrCodeData={request.qrCodeData} />
<VerificationQRCode qrCodeBytes={qrCodeBytes} />
</div>
</div>
);
@ -201,7 +202,7 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
};
private getDevice(): DeviceInfo | null {
const deviceId = this.props.request && this.props.request.channel.deviceId;
const deviceId = this.props.request && this.props.request.otherDeviceId;
const userId = MatrixClientPeg.get().getUserId();
if (deviceId && userId) {
return MatrixClientPeg.get().getStoredDevice(userId, deviceId);
@ -275,12 +276,12 @@ export default class VerificationPanel extends React.PureComponent<IProps, IStat
if (!device) {
// This can happen if the device is logged out while we're still showing verification
// UI for it.
logger.warn("Verified device we don't know about: " + this.props.request.channel.deviceId);
logger.warn("Verified device we don't know about: " + this.props.request.otherDeviceId);
description = _t("You've successfully verified your device!");
} else {
description = _t("You've successfully verified %(deviceName)s (%(deviceId)s)!", {
deviceName: device ? device.getDisplayName() : "",
deviceId: this.props.request.channel.deviceId,
deviceId: this.props.request.otherDeviceId,
});
}
} else {

View file

@ -74,11 +74,11 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
if (request.isSelfVerification) {
const cli = MatrixClientPeg.get();
const device = request.channel.deviceId ? await cli.getDevice(request.channel.deviceId) : null;
const device = request.otherDeviceId ? await cli.getDevice(request.otherDeviceId) : null;
const ip = device?.last_seen_ip;
this.setState({
device:
(request.channel.deviceId && cli.getStoredDevice(cli.getSafeUserId(), request.channel.deviceId)) ||
(request.otherDeviceId && cli.getStoredDevice(cli.getSafeUserId(), request.otherDeviceId)) ||
undefined,
ip,
});
@ -113,10 +113,10 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
// no room id for to_device requests
const cli = MatrixClientPeg.get();
try {
if (request.channel.roomId) {
if (request.roomId) {
dis.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: request.channel.roomId,
room_id: request.roomId,
should_peek: false,
metricsTrigger: "VerificationRequest",
});
@ -128,7 +128,7 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
{ phase: RightPanelPhases.EncryptionPanel, state: { verificationRequest: request, member } },
],
undefined,
request.channel.roomId,
request.roomId,
);
} else {
Modal.createDialog(
@ -164,7 +164,7 @@ export default class VerificationRequestToast extends React.PureComponent<IProps
}
} else {
const userId = request.otherUserId;
const roomId = request.channel.roomId;
const roomId = request.roomId;
description = roomId ? userLabelForEventRoom(MatrixClientPeg.get(), userId, roomId) : userId;
// for legacy to_device verification requests
if (description === userId) {