From 9a466944f069ad7aba27ac5aeef84dce12aa7e64 Mon Sep 17 00:00:00 2001 From: Martin Varmuza Date: Tue, 3 Oct 2023 14:42:10 +0200 Subject: [PATCH] test(e2e): unacquired device (cherry picked from commit 192bb354e259b737a2c57c37e80f877dc5885e62) --- packages/suite-web/e2e/cypress.config.ts | 11 +++++ .../e2e/tests/suite/unacquired-device.test.ts | 40 +++++++++++++++++++ packages/suite-web/package.json | 2 + packages/suite-web/tsconfig.json | 2 + .../DeviceSelector/DeviceStatus.tsx | 1 + yarn.lock | 2 + 6 files changed, 58 insertions(+) create mode 100644 packages/suite-web/e2e/tests/suite/unacquired-device.test.ts diff --git a/packages/suite-web/e2e/cypress.config.ts b/packages/suite-web/e2e/cypress.config.ts index da280a83638..7fe78bd1e4f 100644 --- a/packages/suite-web/e2e/cypress.config.ts +++ b/packages/suite-web/e2e/cypress.config.ts @@ -4,6 +4,8 @@ import CDP from 'chrome-remote-interface'; import fs from 'fs'; import path from 'path'; import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin'; +import { BridgeTransport } from '@trezor/transport'; +import * as messages from '@trezor/protobuf/src/messages'; import { TrezorUserEnvLink } from '@trezor/trezor-user-env-link'; import * as metadataUtils from '@trezor/suite/src/utils/suite/metadata'; @@ -149,6 +151,15 @@ export default defineConfig({ await mocked.bridge.stop(); return null; }, + stealBridgeSession: async () => { + const bridge = new BridgeTransport({ messages }); + await bridge.init().promise; + const enumerateRes = await bridge.enumerate().promise; + if (!enumerateRes.success) return null; + await bridge.acquire({ input: { path: enumerateRes.payload[0].path } }).promise; + + return null; + }, resetCRI: async () => { if (client) { diff --git a/packages/suite-web/e2e/tests/suite/unacquired-device.test.ts b/packages/suite-web/e2e/tests/suite/unacquired-device.test.ts new file mode 100644 index 00000000000..9f85fd2888a --- /dev/null +++ b/packages/suite-web/e2e/tests/suite/unacquired-device.test.ts @@ -0,0 +1,40 @@ +// @group:suite +// @retry=2 + +describe('unacquried device', () => { + beforeEach(() => { + cy.viewport(1080, 1440).resetDb(); + cy.task('startEmu', { wipe: true }); + cy.task('setupEmu', { passphrase_protection: true, pin_protection: false }); + cy.task('startBridge'); + }); + + it('somone steals session, device status turns inactive', () => { + cy.prefixedVisit('/'); + cy.passThroughInitialRun(); + cy.getTestElement('@passphrase-type/standard').click(); + cy.discoveryShouldFinish(); + + // simulate stolen session from another window. device receives indicative button + cy.task('stealBridgeSession'); + cy.getTestElement('@menu/switch-device/refresh-button').click(); + cy.getTestElement('@deviceStatus-connected'); + + // when user reloads app while device is ancquired, suite will not try to acquire device so that it + // does not interfers with somebody else's session + cy.task('stealBridgeSession'); + cy.getTestElement('@menu/switch-device/refresh-button'); + cy.reload(); + cy.getTestElement('@device-acquire').click(); + cy.getTestElement('@passphrase-type/standard').click(); + cy.discoveryShouldFinish(); + }); + + // todo: + // - it is broken in settings! there is not acquire button + // - make sure it works in onboarding, I am not sure there is acquire button present + // - also firmware update, maybe standalone backup/recovery might have custom implementation that might be worth revisiting + // - device state is incorrect is wrong copy!!! +}); + +export {}; diff --git a/packages/suite-web/package.json b/packages/suite-web/package.json index 04f0eb5d695..527c0df36d2 100644 --- a/packages/suite-web/package.json +++ b/packages/suite-web/package.json @@ -32,7 +32,9 @@ "@trezor/connect": "workspace:*", "@trezor/e2e-utils": "workspace:*", "@trezor/env-utils": "workspace:*", + "@trezor/protobuf": "workspace:*", "@trezor/suite-analytics": "workspace:*", + "@trezor/transport": "workspace:*", "@trezor/trezor-user-env-link": "workspace:*", "@trezor/utils": "workspace:*", "@types/chrome-remote-interface": "^0.31.10", diff --git a/packages/suite-web/tsconfig.json b/packages/suite-web/tsconfig.json index 0620527a55a..7725f85d9b0 100644 --- a/packages/suite-web/tsconfig.json +++ b/packages/suite-web/tsconfig.json @@ -21,7 +21,9 @@ }, { "path": "../e2e-utils" }, { "path": "../env-utils" }, + { "path": "../protobuf" }, { "path": "../suite-analytics" }, + { "path": "../transport" }, { "path": "../trezor-user-env-link" }, { "path": "../utils" } ] diff --git a/packages/suite/src/components/suite/Preloader/SuiteLayout/NavigationBar/DeviceSelector/DeviceStatus.tsx b/packages/suite/src/components/suite/Preloader/SuiteLayout/NavigationBar/DeviceSelector/DeviceStatus.tsx index 10259fe5ce0..836aebc7a65 100644 --- a/packages/suite/src/components/suite/Preloader/SuiteLayout/NavigationBar/DeviceSelector/DeviceStatus.tsx +++ b/packages/suite/src/components/suite/Preloader/SuiteLayout/NavigationBar/DeviceSelector/DeviceStatus.tsx @@ -122,6 +122,7 @@ export const DeviceStatus = ({ icon="REFRESH" size={12} color={getStatusColor(status, theme)} + data-test="@menu/switch-device/refresh-button" /> ); } diff --git a/yarn.lock b/yarn.lock index 50258736952..bcee1c265b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10201,8 +10201,10 @@ __metadata: "@trezor/device-utils": "workspace:*" "@trezor/e2e-utils": "workspace:*" "@trezor/env-utils": "workspace:*" + "@trezor/protobuf": "workspace:*" "@trezor/suite": "workspace:*" "@trezor/suite-analytics": "workspace:*" + "@trezor/transport": "workspace:*" "@trezor/trezor-user-env-link": "workspace:*" "@trezor/utils": "workspace:*" "@types/chrome-remote-interface": ^0.31.10