You've already forked matrix-react-sdk
mirror of
https://github.com/matrix-org/matrix-react-sdk.git
synced 2025-08-09 08:42:50 +03:00
Simplify isDeviceVerified
definitions (#10594)
* Simplify `isDeviceVerified` definitions Currently, we have two similar but different definitions of `isDeviceVerified`, and they both do a lot of wrangling that relies on js-sdk internals. We can simplify it a lot by just calling `MatrixClientPeg.checkDeviceTrust`. * fix tests * more test fixes
This commit is contained in:
committed by
GitHub
parent
e4ebcf5731
commit
70b87f8bde
@@ -15,10 +15,10 @@ limitations under the License.
|
||||
*/
|
||||
import React from "react";
|
||||
import { act, fireEvent, render } from "@testing-library/react";
|
||||
import { CrossSigningInfo } from "matrix-js-sdk/src/crypto/CrossSigning";
|
||||
import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo";
|
||||
import { sleep } from "matrix-js-sdk/src/utils";
|
||||
import { PUSHER_DEVICE_ID, PUSHER_ENABLED } from "matrix-js-sdk/src/@types/event";
|
||||
import { DeviceTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning";
|
||||
|
||||
import DevicesPanel from "../../../../src/components/views/settings/DevicesPanel";
|
||||
import { flushPromises, getMockClientWithEventEmitter, mkPusher, mockClientMethodsUser } from "../../../test-utils";
|
||||
@@ -34,7 +34,7 @@ describe("<DevicesPanel />", () => {
|
||||
getDevices: jest.fn(),
|
||||
getDeviceId: jest.fn().mockReturnValue(device1.device_id),
|
||||
deleteMultipleDevices: jest.fn(),
|
||||
getStoredCrossSigningForUser: jest.fn().mockReturnValue(new CrossSigningInfo(userId, {}, {})),
|
||||
checkDeviceTrust: jest.fn().mockReturnValue(new DeviceTrustLevel(false, false, false, false)),
|
||||
getStoredDevice: jest.fn().mockReturnValue(new DeviceInfo("id")),
|
||||
generateClientSecret: jest.fn(),
|
||||
getPushers: jest.fn(),
|
||||
|
@@ -74,16 +74,13 @@ describe("<SessionManagerTab />", () => {
|
||||
last_seen_ts: Date.now() - (INACTIVE_DEVICE_AGE_MS + 1000),
|
||||
};
|
||||
|
||||
const mockCrossSigningInfo = {
|
||||
checkDeviceTrust: jest.fn(),
|
||||
};
|
||||
const mockVerificationRequest = {
|
||||
cancel: jest.fn(),
|
||||
on: jest.fn(),
|
||||
} as unknown as VerificationRequest;
|
||||
const mockClient = getMockClientWithEventEmitter({
|
||||
...mockClientMethodsUser(aliceId),
|
||||
getStoredCrossSigningForUser: jest.fn().mockReturnValue(mockCrossSigningInfo),
|
||||
checkDeviceTrust: jest.fn(),
|
||||
getDevices: jest.fn(),
|
||||
getStoredDevice: jest.fn(),
|
||||
getDeviceId: jest.fn().mockReturnValue(deviceId),
|
||||
@@ -174,9 +171,7 @@ describe("<SessionManagerTab />", () => {
|
||||
const device = [alicesDevice, alicesMobileDevice].find((device) => device.device_id === id);
|
||||
return device ? new DeviceInfo(device.device_id) : null;
|
||||
});
|
||||
mockCrossSigningInfo.checkDeviceTrust
|
||||
.mockReset()
|
||||
.mockReturnValue(new DeviceTrustLevel(false, false, false, false));
|
||||
mockClient.checkDeviceTrust.mockReset().mockReturnValue(new DeviceTrustLevel(false, false, false, false));
|
||||
|
||||
mockClient.getDevices.mockReset().mockResolvedValue({ devices: [alicesDevice, alicesMobileDevice] });
|
||||
|
||||
@@ -226,12 +221,12 @@ describe("<SessionManagerTab />", () => {
|
||||
});
|
||||
|
||||
it("does not fail when checking device verification fails", async () => {
|
||||
const logSpy = jest.spyOn(logger, "error").mockImplementation(() => {});
|
||||
const logSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
||||
mockClient.getDevices.mockResolvedValue({
|
||||
devices: [alicesDevice, alicesMobileDevice],
|
||||
});
|
||||
const noCryptoError = new Error("End-to-end encryption disabled");
|
||||
mockClient.getStoredDevice.mockImplementation(() => {
|
||||
mockClient.checkDeviceTrust.mockImplementation(() => {
|
||||
throw noCryptoError;
|
||||
});
|
||||
render(getComponent());
|
||||
@@ -241,8 +236,8 @@ describe("<SessionManagerTab />", () => {
|
||||
});
|
||||
|
||||
// called for each device despite error
|
||||
expect(mockClient.getStoredDevice).toHaveBeenCalledWith(aliceId, alicesDevice.device_id);
|
||||
expect(mockClient.getStoredDevice).toHaveBeenCalledWith(aliceId, alicesMobileDevice.device_id);
|
||||
expect(mockClient.checkDeviceTrust).toHaveBeenCalledWith(aliceId, alicesDevice.device_id);
|
||||
expect(mockClient.checkDeviceTrust).toHaveBeenCalledWith(aliceId, alicesMobileDevice.device_id);
|
||||
expect(logSpy).toHaveBeenCalledWith("Error getting device cross-signing info", noCryptoError);
|
||||
});
|
||||
|
||||
@@ -251,7 +246,7 @@ describe("<SessionManagerTab />", () => {
|
||||
devices: [alicesDevice, alicesMobileDevice, alicesOlderMobileDevice],
|
||||
});
|
||||
mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId));
|
||||
mockCrossSigningInfo.checkDeviceTrust.mockImplementation((_userId, { deviceId }) => {
|
||||
mockClient.checkDeviceTrust.mockImplementation((_userId, deviceId) => {
|
||||
// alices device is trusted
|
||||
if (deviceId === alicesDevice.device_id) {
|
||||
return new DeviceTrustLevel(true, true, false, false);
|
||||
@@ -270,7 +265,7 @@ describe("<SessionManagerTab />", () => {
|
||||
await flushPromises();
|
||||
});
|
||||
|
||||
expect(mockCrossSigningInfo.checkDeviceTrust).toHaveBeenCalledTimes(3);
|
||||
expect(mockClient.checkDeviceTrust).toHaveBeenCalledTimes(3);
|
||||
expect(
|
||||
getByTestId(`device-tile-${alicesDevice.device_id}`).querySelector('[aria-label="Verified"]'),
|
||||
).toBeTruthy();
|
||||
@@ -423,7 +418,7 @@ describe("<SessionManagerTab />", () => {
|
||||
devices: [alicesDevice, alicesMobileDevice],
|
||||
});
|
||||
mockClient.getStoredDevice.mockImplementation(() => new DeviceInfo(alicesDevice.device_id));
|
||||
mockCrossSigningInfo.checkDeviceTrust.mockReturnValue(new DeviceTrustLevel(true, true, false, false));
|
||||
mockClient.checkDeviceTrust.mockReturnValue(new DeviceTrustLevel(true, true, false, false));
|
||||
|
||||
const { getByTestId } = render(getComponent());
|
||||
|
||||
@@ -525,7 +520,7 @@ describe("<SessionManagerTab />", () => {
|
||||
devices: [alicesDevice, alicesMobileDevice],
|
||||
});
|
||||
mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId));
|
||||
mockCrossSigningInfo.checkDeviceTrust.mockImplementation((_userId, { deviceId }) => {
|
||||
mockClient.checkDeviceTrust.mockImplementation((_userId, deviceId) => {
|
||||
if (deviceId === alicesDevice.device_id) {
|
||||
return new DeviceTrustLevel(true, true, false, false);
|
||||
}
|
||||
@@ -552,7 +547,7 @@ describe("<SessionManagerTab />", () => {
|
||||
devices: [alicesDevice, alicesMobileDevice],
|
||||
});
|
||||
mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId));
|
||||
mockCrossSigningInfo.checkDeviceTrust.mockImplementation((_userId, { deviceId }) => {
|
||||
mockClient.checkDeviceTrust.mockImplementation((_userId, deviceId) => {
|
||||
// current session verified = able to verify other sessions
|
||||
if (deviceId === alicesDevice.device_id) {
|
||||
return new DeviceTrustLevel(true, true, false, false);
|
||||
@@ -586,7 +581,7 @@ describe("<SessionManagerTab />", () => {
|
||||
devices: [alicesDevice, alicesMobileDevice],
|
||||
});
|
||||
mockClient.getStoredDevice.mockImplementation((_userId, deviceId) => new DeviceInfo(deviceId));
|
||||
mockCrossSigningInfo.checkDeviceTrust.mockImplementation((_userId, { deviceId }) => {
|
||||
mockClient.checkDeviceTrust.mockImplementation((_userId, deviceId) => {
|
||||
if (deviceId === alicesDevice.device_id) {
|
||||
return new DeviceTrustLevel(true, true, false, false);
|
||||
}
|
||||
|
@@ -99,6 +99,7 @@ export function createTestClient(): MatrixClient {
|
||||
getDevice: jest.fn(),
|
||||
getDeviceId: jest.fn().mockReturnValue("ABCDEFGHI"),
|
||||
getStoredCrossSigningForUser: jest.fn(),
|
||||
checkDeviceTrust: jest.fn(),
|
||||
getStoredDevice: jest.fn(),
|
||||
requestVerification: jest.fn(),
|
||||
deviceId: "ABCDEFGHI",
|
||||
|
@@ -20,7 +20,7 @@ import userEvent from "@testing-library/user-event";
|
||||
import { mocked, Mocked } from "jest-mock";
|
||||
import { IMyDevice, MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo";
|
||||
import { CrossSigningInfo } from "matrix-js-sdk/src/crypto/CrossSigning";
|
||||
import { DeviceTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning";
|
||||
|
||||
import dis from "../../src/dispatcher/dispatcher";
|
||||
import { showToast } from "../../src/toasts/UnverifiedSessionToast";
|
||||
@@ -55,11 +55,7 @@ describe("UnverifiedSessionToast", () => {
|
||||
|
||||
return null;
|
||||
});
|
||||
client.getStoredCrossSigningForUser.mockReturnValue({
|
||||
checkDeviceTrust: jest.fn().mockReturnValue({
|
||||
isCrossSigningVerified: jest.fn().mockReturnValue(true),
|
||||
}),
|
||||
} as unknown as CrossSigningInfo);
|
||||
client.checkDeviceTrust.mockReturnValue(new DeviceTrustLevel(true, false, false, false));
|
||||
jest.spyOn(dis, "dispatch");
|
||||
jest.spyOn(DeviceListener.sharedInstance(), "dismissUnverifiedSessions");
|
||||
});
|
||||
|
Reference in New Issue
Block a user