Cypress: Run setting up secure key backup should work test for both verified and unverified devices (#11119)

* Add `cypress-each` dev dependencies

* Run `setting up secure key backup should work` test for both verified and unverified device.
This commit is contained in:
Florian Duros 2023-06-20 17:27:18 +02:00 committed by GitHub
parent 8aa46b3005
commit b84a230d58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 102 additions and 76 deletions

View file

@ -174,92 +174,110 @@ describe("Cryptography", function () {
cy.stopHomeserver(this.homeserver); cy.stopHomeserver(this.homeserver);
}); });
describe("setting up secure key backup should work", () => { describe.each([{ isDeviceVerified: true }, { isDeviceVerified: false }])(
/** "setting up secure key backup should work %j",
* Verify that the `m.cross_signing.${keyType}` key is available on the account data on the server ({ isDeviceVerified }) => {
* @param keyType /**
*/ * Verify that the `m.cross_signing.${keyType}` key is available on the account data on the server
function verifyKey(keyType: string) { * @param keyType
return cy */
.getClient() function verifyKey(keyType: string) {
.then((cli) => cy.wrap(cli.getAccountDataFromServer(`m.cross_signing.${keyType}`))) return cy
.then((accountData: { encrypted: Record<string, Record<string, string>> }) => { .getClient()
expect(accountData.encrypted).to.exist; .then((cli) => cy.wrap(cli.getAccountDataFromServer(`m.cross_signing.${keyType}`)))
const keys = Object.keys(accountData.encrypted); .then((accountData: { encrypted: Record<string, Record<string, string>> }) => {
const key = accountData.encrypted[keys[0]]; expect(accountData.encrypted).to.exist;
expect(key.ciphertext).to.exist; const keys = Object.keys(accountData.encrypted);
expect(key.iv).to.exist; const key = accountData.encrypted[keys[0]];
expect(key.mac).to.exist; expect(key.ciphertext).to.exist;
}); expect(key.iv).to.exist;
} expect(key.mac).to.exist;
/**
* Click on download button and continue
*/
function downloadKey() {
// Clicking download instead of Copy because of https://github.com/cypress-io/cypress/issues/2851
cy.findByRole("button", { name: "Download" }).click();
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
}
it("by recovery code", () => {
skipIfRustCrypto();
cy.openUserSettings("Security & Privacy");
cy.findByRole("button", { name: "Set up Secure Backup" }).click();
cy.get(".mx_Dialog").within(() => {
// Recovery key is selected by default
cy.findByRole("button", { name: "Continue" }).click();
cy.get(".mx_CreateSecretStorageDialog_recoveryKey code").invoke("text").as("securityKey");
downloadKey();
cy.get(".mx_InteractiveAuthDialog").within(() => {
cy.get(".mx_Dialog_title").within(() => {
cy.findByText("Setting up keys").should("exist");
cy.findByText("Setting up keys").should("not.exist");
}); });
}
/**
* Click on download button and continue
*/
function downloadKey() {
// Clicking download instead of Copy because of https://github.com/cypress-io/cypress/issues/2851
cy.findByRole("button", { name: "Download" }).click();
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
}
it("by recovery code", () => {
skipIfRustCrypto();
// Verified the device
if (isDeviceVerified) {
cy.bootstrapCrossSigning(aliceCredentials);
}
cy.openUserSettings("Security & Privacy");
cy.findByRole("button", { name: "Set up Secure Backup" }).click();
cy.get(".mx_Dialog").within(() => {
// Recovery key is selected by default
cy.findByRole("button", { name: "Continue" }).click();
cy.get(".mx_CreateSecretStorageDialog_recoveryKey code").invoke("text").as("securityKey");
downloadKey();
// When the device is verified, the `Setting up keys` step is skipped
if (!isDeviceVerified) {
cy.get(".mx_InteractiveAuthDialog").within(() => {
cy.get(".mx_Dialog_title").within(() => {
cy.findByText("Setting up keys").should("exist");
cy.findByText("Setting up keys").should("not.exist");
});
});
}
cy.findByText("Secure Backup successful").should("exist");
cy.findByRole("button", { name: "Done" }).click();
cy.findByText("Secure Backup successful").should("not.exist");
}); });
cy.findByText("Secure Backup successful").should("exist"); // Verify that the SSSS keys are in the account data stored in the server
cy.findByRole("button", { name: "Done" }).click(); verifyKey("master");
cy.findByText("Secure Backup successful").should("not.exist"); verifyKey("self_signing");
verifyKey("user_signing");
}); });
// Verify that the SSSS keys are in the account data stored in the server it("by passphrase", () => {
verifyKey("master"); skipIfRustCrypto();
verifyKey("self_signing");
verifyKey("user_signing");
});
it("by passphrase", () => { // Verified the device
skipIfRustCrypto(); if (isDeviceVerified) {
cy.openUserSettings("Security & Privacy"); cy.bootstrapCrossSigning(aliceCredentials);
cy.findByRole("button", { name: "Set up Secure Backup" }).click(); }
cy.get(".mx_Dialog").within(() => {
// Select passphrase option
cy.findByText("Enter a Security Phrase").click();
cy.findByRole("button", { name: "Continue" }).click();
// Fill passphrase input cy.openUserSettings("Security & Privacy");
cy.get("input").type("new passphrase for setting up a secure key backup"); cy.findByRole("button", { name: "Set up Secure Backup" }).click();
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click(); cy.get(".mx_Dialog").within(() => {
// Confirm passphrase // Select passphrase option
cy.get("input").type("new passphrase for setting up a secure key backup"); cy.findByText("Enter a Security Phrase").click();
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click(); cy.findByRole("button", { name: "Continue" }).click();
downloadKey(); // Fill passphrase input
cy.get("input").type("new passphrase for setting up a secure key backup");
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
// Confirm passphrase
cy.get("input").type("new passphrase for setting up a secure key backup");
cy.contains(".mx_Dialog_primary:not([disabled])", "Continue").click();
cy.findByText("Secure Backup successful").should("exist"); downloadKey();
cy.findByRole("button", { name: "Done" }).click();
cy.findByText("Secure Backup successful").should("not.exist"); cy.findByText("Secure Backup successful").should("exist");
cy.findByRole("button", { name: "Done" }).click();
cy.findByText("Secure Backup successful").should("not.exist");
});
// Verify that the SSSS keys are in the account data stored in the server
verifyKey("master");
verifyKey("self_signing");
verifyKey("user_signing");
}); });
},
// Verify that the SSSS keys are in the account data stored in the server );
verifyKey("master");
verifyKey("self_signing");
verifyKey("user_signing");
});
});
it("creating a DM should work, being e2e-encrypted / user verification", function (this: CryptoTestContext) { it("creating a DM should work, being e2e-encrypted / user verification", function (this: CryptoTestContext) {
skipIfRustCrypto(); skipIfRustCrypto();

View file

@ -16,6 +16,8 @@ limitations under the License.
/// <reference types="cypress" /> /// <reference types="cypress" />
import "cypress-each";
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace
namespace Cypress { namespace Cypress {

View file

@ -181,6 +181,7 @@
"chokidar": "^3.5.1", "chokidar": "^3.5.1",
"cypress": "^12.0.0", "cypress": "^12.0.0",
"cypress-axe": "^1.0.0", "cypress-axe": "^1.0.0",
"cypress-each": "^1.13.3",
"cypress-multi-reporters": "^1.6.1", "cypress-multi-reporters": "^1.6.1",
"cypress-real-events": "^1.7.1", "cypress-real-events": "^1.7.1",
"eslint": "8.42.0", "eslint": "8.42.0",

View file

@ -3638,6 +3638,11 @@ cypress-axe@^1.0.0:
resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff" resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff"
integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA== integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA==
cypress-each@^1.13.3:
version "1.13.3"
resolved "https://registry.yarnpkg.com/cypress-each/-/cypress-each-1.13.3.tgz#c0f59628975164e23a3fd10090b587a66ed9438e"
integrity sha512-aNFoDuybFAQ7OObbeO5yxBGmXkGKVAcT1wLHLiL3+HQi+g+q3vECbn4J9cYOXJ7yYfbcBLh8dgQd/IG3Ls2z7A==
cypress-multi-reporters@^1.6.1: cypress-multi-reporters@^1.6.1:
version "1.6.3" version "1.6.3"
resolved "https://registry.yarnpkg.com/cypress-multi-reporters/-/cypress-multi-reporters-1.6.3.tgz#0f0da8db4caf8d7a21f94e5209148348416d7c71" resolved "https://registry.yarnpkg.com/cypress-multi-reporters/-/cypress-multi-reporters-1.6.3.tgz#0f0da8db4caf8d7a21f94e5209148348416d7c71"