You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-07-30 04:23:07 +03:00
Element-R: fix bootstrapSecretStorage
not resetting key backup when requested (#3976)
* pull resetKeyBackup outside of if statement * fix broken conflict resolution * prettier
This commit is contained in:
@ -38,7 +38,13 @@ import { mkEvent } from "../../test-utils/test-utils";
|
|||||||
import { CryptoBackend } from "../../../src/common-crypto/CryptoBackend";
|
import { CryptoBackend } from "../../../src/common-crypto/CryptoBackend";
|
||||||
import { IEventDecryptionResult } from "../../../src/@types/crypto";
|
import { IEventDecryptionResult } from "../../../src/@types/crypto";
|
||||||
import { OutgoingRequestProcessor } from "../../../src/rust-crypto/OutgoingRequestProcessor";
|
import { OutgoingRequestProcessor } from "../../../src/rust-crypto/OutgoingRequestProcessor";
|
||||||
import { ServerSideSecretStorage } from "../../../src/secret-storage";
|
import {
|
||||||
|
AccountDataClient,
|
||||||
|
AddSecretStorageKeyOpts,
|
||||||
|
SecretStorageCallbacks,
|
||||||
|
ServerSideSecretStorage,
|
||||||
|
ServerSideSecretStorageImpl,
|
||||||
|
} from "../../../src/secret-storage";
|
||||||
import {
|
import {
|
||||||
CryptoCallbacks,
|
CryptoCallbacks,
|
||||||
EventShieldColour,
|
EventShieldColour,
|
||||||
@ -51,6 +57,7 @@ import * as testData from "../../test-utils/test-data";
|
|||||||
import { defer } from "../../../src/utils";
|
import { defer } from "../../../src/utils";
|
||||||
import { logger } from "../../../src/logger";
|
import { logger } from "../../../src/logger";
|
||||||
import { OutgoingRequestsManager } from "../../../src/rust-crypto/OutgoingRequestsManager";
|
import { OutgoingRequestsManager } from "../../../src/rust-crypto/OutgoingRequestsManager";
|
||||||
|
import { ClientEvent, ClientEventHandlerMap } from "../../../src/client";
|
||||||
import { Curve25519AuthData } from "../../../src/crypto-api/keybackup";
|
import { Curve25519AuthData } from "../../../src/crypto-api/keybackup";
|
||||||
|
|
||||||
const TEST_USER = "@alice:example.com";
|
const TEST_USER = "@alice:example.com";
|
||||||
@ -294,6 +301,62 @@ describe("RustCrypto", () => {
|
|||||||
expect(mockCrossSigningIdentity.bootstrapCrossSigning).toHaveBeenCalledWith({});
|
expect(mockCrossSigningIdentity.bootstrapCrossSigning).toHaveBeenCalledWith({});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("bootstrapSecretStorage creates new backup when requested", async () => {
|
||||||
|
const secretStorageCallbacks = {
|
||||||
|
getSecretStorageKey: async (keys: any, name: string) => {
|
||||||
|
return [[...Object.keys(keys.keys)][0], new Uint8Array(32)];
|
||||||
|
},
|
||||||
|
} as SecretStorageCallbacks;
|
||||||
|
const secretStorage = new ServerSideSecretStorageImpl(new DummyAccountDataClient(), secretStorageCallbacks);
|
||||||
|
|
||||||
|
const outgoingRequestProcessor = {
|
||||||
|
makeOutgoingRequest: jest.fn(),
|
||||||
|
} as unknown as Mocked<OutgoingRequestProcessor>;
|
||||||
|
|
||||||
|
const rustCrypto = await makeTestRustCrypto(
|
||||||
|
new MatrixHttpApi(new TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>(), {
|
||||||
|
baseUrl: "http://server/",
|
||||||
|
prefix: "",
|
||||||
|
onlyData: true,
|
||||||
|
}),
|
||||||
|
testData.TEST_USER_ID,
|
||||||
|
undefined,
|
||||||
|
secretStorage,
|
||||||
|
);
|
||||||
|
|
||||||
|
rustCrypto["checkKeyBackupAndEnable"] = async () => {
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
(rustCrypto["crossSigningIdentity"] as any)["outgoingRequestProcessor"] = outgoingRequestProcessor;
|
||||||
|
const resetKeyBackup = (rustCrypto["resetKeyBackup"] = jest.fn());
|
||||||
|
|
||||||
|
async function createSecretStorageKey() {
|
||||||
|
return {
|
||||||
|
keyInfo: {} as AddSecretStorageKeyOpts,
|
||||||
|
privateKey: new Uint8Array(32),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// create initial secret storage
|
||||||
|
await rustCrypto.bootstrapCrossSigning({ setupNewCrossSigning: true });
|
||||||
|
await rustCrypto.bootstrapSecretStorage({
|
||||||
|
createSecretStorageKey,
|
||||||
|
setupNewSecretStorage: true,
|
||||||
|
setupNewKeyBackup: true,
|
||||||
|
});
|
||||||
|
// check that rustCrypto.resetKeyBackup was called
|
||||||
|
expect(resetKeyBackup.mock.calls).toHaveLength(1);
|
||||||
|
|
||||||
|
// reset secret storage
|
||||||
|
await rustCrypto.bootstrapSecretStorage({
|
||||||
|
createSecretStorageKey,
|
||||||
|
setupNewSecretStorage: true,
|
||||||
|
setupNewKeyBackup: true,
|
||||||
|
});
|
||||||
|
// check that rustCrypto.resetKeyBackup was called again
|
||||||
|
expect(resetKeyBackup.mock.calls).toHaveLength(2);
|
||||||
|
});
|
||||||
|
|
||||||
it("isSecretStorageReady", async () => {
|
it("isSecretStorageReady", async () => {
|
||||||
const mockSecretStorage = {
|
const mockSecretStorage = {
|
||||||
getDefaultKeyId: jest.fn().mockResolvedValue(null),
|
getDefaultKeyId: jest.fn().mockResolvedValue(null),
|
||||||
@ -990,3 +1053,38 @@ async function makeTestRustCrypto(
|
|||||||
): Promise<RustCrypto> {
|
): Promise<RustCrypto> {
|
||||||
return await initRustCrypto(logger, http, userId, deviceId, secretStorage, cryptoCallbacks, null, undefined);
|
return await initRustCrypto(logger, http, userId, deviceId, secretStorage, cryptoCallbacks, null, undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** emulate account data, storing in memory
|
||||||
|
*/
|
||||||
|
class DummyAccountDataClient
|
||||||
|
extends TypedEventEmitter<ClientEvent.AccountData, ClientEventHandlerMap>
|
||||||
|
implements AccountDataClient
|
||||||
|
{
|
||||||
|
private storage: Map<string, any> = new Map();
|
||||||
|
|
||||||
|
public constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getAccountDataFromServer<T extends Record<string, any>>(eventType: string): Promise<T | null> {
|
||||||
|
const ret = this.storage.get(eventType);
|
||||||
|
|
||||||
|
if (eventType) {
|
||||||
|
return ret as T;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async setAccountData(eventType: string, content: any): Promise<{}> {
|
||||||
|
this.storage.set(eventType, content);
|
||||||
|
this.emit(
|
||||||
|
ClientEvent.AccountData,
|
||||||
|
new MatrixEvent({
|
||||||
|
content,
|
||||||
|
type: eventType,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -732,10 +732,10 @@ export class RustCrypto extends TypedEventEmitter<RustCryptoEvents, RustCryptoEv
|
|||||||
await this.secretStorage.store("m.cross_signing.master", crossSigningPrivateKeys.masterKey);
|
await this.secretStorage.store("m.cross_signing.master", crossSigningPrivateKeys.masterKey);
|
||||||
await this.secretStorage.store("m.cross_signing.user_signing", crossSigningPrivateKeys.userSigningKey);
|
await this.secretStorage.store("m.cross_signing.user_signing", crossSigningPrivateKeys.userSigningKey);
|
||||||
await this.secretStorage.store("m.cross_signing.self_signing", crossSigningPrivateKeys.self_signing_key);
|
await this.secretStorage.store("m.cross_signing.self_signing", crossSigningPrivateKeys.self_signing_key);
|
||||||
|
}
|
||||||
|
|
||||||
if (setupNewKeyBackup) {
|
if (setupNewKeyBackup) {
|
||||||
await this.resetKeyBackup();
|
await this.resetKeyBackup();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user