Cypress: Add test to verify device after login (#11217)
* Run cypress test without `cryptoCallbacks` * Add security phrase test * Add security key test * Fix type import * Move new test in `verification.spec.ts` * The nest tests work with the new crypto * Fix import yupepull/28217/head
parent
a8f632ae19
commit
21a1bdf7b7
|
@ -36,7 +36,11 @@ describe("Device verification", () => {
|
||||||
cy.window({ log: false }).should("have.property", "matrixcs");
|
cy.window({ log: false }).should("have.property", "matrixcs");
|
||||||
|
|
||||||
// Create a new device for alice
|
// Create a new device for alice
|
||||||
cy.getBot(homeserver, { rustCrypto: true, bootstrapCrossSigning: true }).then((bot) => {
|
cy.getBot(homeserver, {
|
||||||
|
rustCrypto: true,
|
||||||
|
bootstrapCrossSigning: true,
|
||||||
|
bootstrapSecretStorage: true,
|
||||||
|
}).then((bot) => {
|
||||||
aliceBotClient = bot;
|
aliceBotClient = bot;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -87,6 +91,51 @@ describe("Device verification", () => {
|
||||||
checkDeviceIsCrossSigned();
|
checkDeviceIsCrossSigned();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("Verify device during login with Security Phrase", () => {
|
||||||
|
logIntoElement(homeserver.baseUrl, aliceBotClient.getUserId(), aliceBotClient.__cypress_password);
|
||||||
|
|
||||||
|
// Select the security phrase
|
||||||
|
cy.get(".mx_AuthPage").within(() => {
|
||||||
|
cy.findByRole("button", { name: "Verify with Security Key or Phrase" }).click();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fill the passphrase
|
||||||
|
cy.get(".mx_Dialog").within(() => {
|
||||||
|
cy.get("input").type("new passphrase");
|
||||||
|
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.get(".mx_AuthPage").within(() => {
|
||||||
|
cy.findByRole("button", { name: "Done" }).click();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that our device is now cross-signed
|
||||||
|
checkDeviceIsCrossSigned();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Verify device during login with Security Key", () => {
|
||||||
|
logIntoElement(homeserver.baseUrl, aliceBotClient.getUserId(), aliceBotClient.__cypress_password);
|
||||||
|
|
||||||
|
// Select the security phrase
|
||||||
|
cy.get(".mx_AuthPage").within(() => {
|
||||||
|
cy.findByRole("button", { name: "Verify with Security Key or Phrase" }).click();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fill the security key
|
||||||
|
cy.get(".mx_Dialog").within(() => {
|
||||||
|
cy.findByRole("button", { name: "use your Security Key" }).click();
|
||||||
|
cy.get("#mx_securityKey").type(aliceBotClient.__cypress_recovery_key.encodedPrivateKey);
|
||||||
|
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.get(".mx_AuthPage").within(() => {
|
||||||
|
cy.findByRole("button", { name: "Done" }).click();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that our device is now cross-signed
|
||||||
|
checkDeviceIsCrossSigned();
|
||||||
|
});
|
||||||
|
|
||||||
it("Handle incoming verification request with SAS", () => {
|
it("Handle incoming verification request with SAS", () => {
|
||||||
logIntoElement(homeserver.baseUrl, aliceBotClient.getUserId(), aliceBotClient.__cypress_password);
|
logIntoElement(homeserver.baseUrl, aliceBotClient.getUserId(), aliceBotClient.__cypress_password);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@ limitations under the License.
|
||||||
/// <reference types="cypress" />
|
/// <reference types="cypress" />
|
||||||
|
|
||||||
import type { ISendEventResponse, MatrixClient, Room } from "matrix-js-sdk/src/matrix";
|
import type { ISendEventResponse, MatrixClient, Room } from "matrix-js-sdk/src/matrix";
|
||||||
|
import type { GeneratedSecretStorageKey } from "matrix-js-sdk/src/crypto-api";
|
||||||
|
import type { AddSecretStorageKeyOpts } from "matrix-js-sdk/src/secret-storage";
|
||||||
import { HomeserverInstance } from "../plugins/utils/homeserver";
|
import { HomeserverInstance } from "../plugins/utils/homeserver";
|
||||||
import { Credentials } from "./homeserver";
|
import { Credentials } from "./homeserver";
|
||||||
import Chainable = Cypress.Chainable;
|
import Chainable = Cypress.Chainable;
|
||||||
|
@ -47,6 +49,10 @@ interface CreateBotOpts {
|
||||||
* Whether to use the rust crypto impl. Defaults to false (for now!)
|
* Whether to use the rust crypto impl. Defaults to false (for now!)
|
||||||
*/
|
*/
|
||||||
rustCrypto?: boolean;
|
rustCrypto?: boolean;
|
||||||
|
/**
|
||||||
|
* Whether or not to bootstrap the secret storage
|
||||||
|
*/
|
||||||
|
bootstrapSecretStorage?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultCreateBotOptions = {
|
const defaultCreateBotOptions = {
|
||||||
|
@ -58,6 +64,7 @@ const defaultCreateBotOptions = {
|
||||||
|
|
||||||
export interface CypressBot extends MatrixClient {
|
export interface CypressBot extends MatrixClient {
|
||||||
__cypress_password: string;
|
__cypress_password: string;
|
||||||
|
__cypress_recovery_key: GeneratedSecretStorageKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
@ -143,6 +150,24 @@ function setupBotClient(
|
||||||
Object.assign(keys, k);
|
Object.assign(keys, k);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Store the cached secret storage key and return it when `getSecretStorageKey` is called
|
||||||
|
let cachedKey: { keyId: string; key: Uint8Array };
|
||||||
|
const cacheSecretStorageKey = (keyId: string, keyInfo: AddSecretStorageKeyOpts, key: Uint8Array) => {
|
||||||
|
cachedKey = {
|
||||||
|
keyId,
|
||||||
|
key,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getSecretStorageKey = () => Promise.resolve<[string, Uint8Array]>([cachedKey.keyId, cachedKey.key]);
|
||||||
|
|
||||||
|
const cryptoCallbacks = {
|
||||||
|
getCrossSigningKey,
|
||||||
|
saveCrossSigningKeys,
|
||||||
|
cacheSecretStorageKey,
|
||||||
|
getSecretStorageKey,
|
||||||
|
};
|
||||||
|
|
||||||
const cli = new win.matrixcs.MatrixClient({
|
const cli = new win.matrixcs.MatrixClient({
|
||||||
baseUrl: homeserver.baseUrl,
|
baseUrl: homeserver.baseUrl,
|
||||||
userId: credentials.userId,
|
userId: credentials.userId,
|
||||||
|
@ -151,7 +176,7 @@ function setupBotClient(
|
||||||
store: new win.matrixcs.MemoryStore(),
|
store: new win.matrixcs.MemoryStore(),
|
||||||
scheduler: new win.matrixcs.MatrixScheduler(),
|
scheduler: new win.matrixcs.MatrixScheduler(),
|
||||||
cryptoStore: new win.matrixcs.MemoryCryptoStore(),
|
cryptoStore: new win.matrixcs.MemoryCryptoStore(),
|
||||||
cryptoCallbacks: { getCrossSigningKey, saveCrossSigningKeys },
|
cryptoCallbacks,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (opts.autoAcceptInvites) {
|
if (opts.autoAcceptInvites) {
|
||||||
|
@ -192,6 +217,18 @@ function setupBotClient(
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts.bootstrapSecretStorage) {
|
||||||
|
const passphrase = "new passphrase";
|
||||||
|
const recoveryKey = await cli.getCrypto().createRecoveryKeyFromPassphrase(passphrase);
|
||||||
|
Object.assign(cli, { __cypress_recovery_key: recoveryKey });
|
||||||
|
|
||||||
|
await cli.getCrypto()!.bootstrapSecretStorage({
|
||||||
|
setupNewSecretStorage: true,
|
||||||
|
createSecretStorageKey: () => Promise.resolve(recoveryKey),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return cli;
|
return cli;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue