You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-07-31 15:24:23 +03:00
Add CryptoApi.setDeviceVerified
(#3624)
I need a way to mark devices as trusted for the backup tests.
This commit is contained in:
committed by
GitHub
parent
e6fa4cdb3c
commit
73c9f4e322
@ -23,6 +23,8 @@ import { RustCrypto } from "../../../src/rust-crypto/rust-crypto";
|
|||||||
import { initRustCrypto } from "../../../src/rust-crypto";
|
import { initRustCrypto } from "../../../src/rust-crypto";
|
||||||
import {
|
import {
|
||||||
CryptoEvent,
|
CryptoEvent,
|
||||||
|
Device,
|
||||||
|
DeviceVerification,
|
||||||
HttpApiEvent,
|
HttpApiEvent,
|
||||||
HttpApiEventHandlerMap,
|
HttpApiEventHandlerMap,
|
||||||
IHttpOpts,
|
IHttpOpts,
|
||||||
@ -351,6 +353,60 @@ describe("RustCrypto", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("setDeviceVerified", () => {
|
||||||
|
let rustCrypto: RustCrypto;
|
||||||
|
|
||||||
|
async function getTestDevice(): Promise<Device> {
|
||||||
|
const devices = await rustCrypto.getUserDeviceInfo([testData.TEST_USER_ID]);
|
||||||
|
return devices.get(testData.TEST_USER_ID)!.get(testData.TEST_DEVICE_ID)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
rustCrypto = await makeTestRustCrypto(
|
||||||
|
new MatrixHttpApi(new TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>(), {
|
||||||
|
baseUrl: "http://server/",
|
||||||
|
prefix: "",
|
||||||
|
onlyData: true,
|
||||||
|
}),
|
||||||
|
testData.TEST_USER_ID,
|
||||||
|
);
|
||||||
|
|
||||||
|
fetchMock.post("path:/_matrix/client/v3/keys/upload", { one_time_key_counts: {} });
|
||||||
|
fetchMock.post("path:/_matrix/client/v3/keys/query", {
|
||||||
|
device_keys: {
|
||||||
|
[testData.TEST_USER_ID]: {
|
||||||
|
[testData.TEST_DEVICE_ID]: testData.SIGNED_TEST_DEVICE_DATA,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// call onSyncCompleted to kick off the outgoingRequestLoop and download the device list.
|
||||||
|
rustCrypto.onSyncCompleted({});
|
||||||
|
|
||||||
|
// before the call, the device should be unverified.
|
||||||
|
const device = await getTestDevice();
|
||||||
|
expect(device.verified).toEqual(DeviceVerification.Unverified);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error for an unknown device", async () => {
|
||||||
|
await expect(rustCrypto.setDeviceVerified(testData.TEST_USER_ID, "xxy")).rejects.toThrow("Unknown device");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should mark an unverified device as verified", async () => {
|
||||||
|
await rustCrypto.setDeviceVerified(testData.TEST_USER_ID, testData.TEST_DEVICE_ID);
|
||||||
|
|
||||||
|
// and confirm that the device is now verified
|
||||||
|
expect((await getTestDevice()).verified).toEqual(DeviceVerification.Verified);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should mark a verified device as unverified", async () => {
|
||||||
|
await rustCrypto.setDeviceVerified(testData.TEST_USER_ID, testData.TEST_DEVICE_ID);
|
||||||
|
expect((await getTestDevice()).verified).toEqual(DeviceVerification.Verified);
|
||||||
|
|
||||||
|
await rustCrypto.setDeviceVerified(testData.TEST_USER_ID, testData.TEST_DEVICE_ID, false);
|
||||||
|
expect((await getTestDevice()).verified).toEqual(DeviceVerification.Unverified);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("getDeviceVerificationStatus", () => {
|
describe("getDeviceVerificationStatus", () => {
|
||||||
let rustCrypto: RustCrypto;
|
let rustCrypto: RustCrypto;
|
||||||
let olmMachine: Mocked<RustSdkCryptoJs.OlmMachine>;
|
let olmMachine: Mocked<RustSdkCryptoJs.OlmMachine>;
|
||||||
|
@ -137,6 +137,22 @@ export interface CryptoApi {
|
|||||||
*/
|
*/
|
||||||
getDeviceVerificationStatus(userId: string, deviceId: string): Promise<DeviceVerificationStatus | null>;
|
getDeviceVerificationStatus(userId: string, deviceId: string): Promise<DeviceVerificationStatus | null>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark the given device as locally verified.
|
||||||
|
*
|
||||||
|
* Marking a devices as locally verified has much the same effect as completing the verification dance, or receiving
|
||||||
|
* a cross-signing signature for it.
|
||||||
|
*
|
||||||
|
* @param userId - owner of the device
|
||||||
|
* @param deviceId - unique identifier for the device.
|
||||||
|
* @param verified - whether to mark the device as verified. Defaults to 'true'.
|
||||||
|
*
|
||||||
|
* @throws an error if the device is unknown, or has not published any encryption keys.
|
||||||
|
*
|
||||||
|
* @remarks Fires {@link CryptoEvent#DeviceVerificationChanged}
|
||||||
|
*/
|
||||||
|
setDeviceVerified(userId: string, deviceId: string, verified?: boolean): Promise<void>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether cross signing:
|
* Checks whether cross signing:
|
||||||
* - is enabled on this account and trusted by this device
|
* - is enabled on this account and trusted by this device
|
||||||
|
@ -2174,6 +2174,15 @@ export class Crypto extends TypedEventEmitter<CryptoEvent, CryptoEventHandlerMap
|
|||||||
return this.deviceList.saveIfDirty(delay);
|
return this.deviceList.saveIfDirty(delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark the given device as locally verified.
|
||||||
|
*
|
||||||
|
* Implementation of {@link CryptoApi#setDeviceVerified}.
|
||||||
|
*/
|
||||||
|
public async setDeviceVerified(userId: string, deviceId: string, verified = true): Promise<void> {
|
||||||
|
await this.setDeviceVerification(userId, deviceId, verified);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the blocked/verified state of the given device
|
* Update the blocked/verified state of the given device
|
||||||
*
|
*
|
||||||
|
@ -377,6 +377,23 @@ export class RustCrypto extends TypedEventEmitter<RustCryptoEvents, RustCryptoEv
|
|||||||
// events. Maybe we need to do the same?
|
// events. Maybe we need to do the same?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark the given device as locally verified.
|
||||||
|
*
|
||||||
|
* Implementation of {@link CryptoApi#setDeviceVerified}.
|
||||||
|
*/
|
||||||
|
public async setDeviceVerified(userId: string, deviceId: string, verified = true): Promise<void> {
|
||||||
|
const device: RustSdkCryptoJs.Device | undefined = await this.olmMachine.getDevice(
|
||||||
|
new RustSdkCryptoJs.UserId(userId),
|
||||||
|
new RustSdkCryptoJs.DeviceId(deviceId),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!device) {
|
||||||
|
throw new Error(`Unknown device ${userId}|${deviceId}`);
|
||||||
|
}
|
||||||
|
await device.setLocalTrust(verified ? RustSdkCryptoJs.LocalTrust.Verified : RustSdkCryptoJs.LocalTrust.Unset);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link CryptoApi#getDeviceVerificationStatus}.
|
* Implementation of {@link CryptoApi#getDeviceVerificationStatus}.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user