From d3a2383d438c9429edd6cc4d3cd05d8186567977 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 23 Jul 2024 19:45:52 +0200 Subject: [PATCH 1/4] feat: display warning message to user when Compass cannot access credential storage COMPASS-7819 --- packages/compass/src/app/index.tsx | 14 ++++++++++++++ packages/compass/src/main/application.ts | 3 +++ 2 files changed, 17 insertions(+) diff --git a/packages/compass/src/app/index.tsx b/packages/compass/src/app/index.tsx index aeeaac10bba..2ea093bfcd3 100644 --- a/packages/compass/src/app/index.tsx +++ b/packages/compass/src/app/index.tsx @@ -9,6 +9,7 @@ import { globalAppRegistry } from 'hadron-app-registry'; import { defaultPreferencesInstance } from 'compass-preferences-model'; import semver from 'semver'; import { CompassElectron } from './components/entrypoint'; +import { openToast } from '@mongodb-js/compass-components'; // https://github.com/nodejs/node/issues/40537 dns.setDefaultResultOrder('ipv4first'); @@ -114,6 +115,10 @@ async function getWindowAutoConnectPreferences(): Promise { + return await ipcRenderer?.call('compass:check-secret-storage-is-available'); +} + /** * The top-level application singleton that brings everything together! */ @@ -212,6 +217,7 @@ const Application = View.extend({ (): Promise => { return Promise.resolve(initialAutoConnectPreferences); }; + const isSecretStorageAvailable = await checkSecretStorageIsAvailable(); const connectionStorage = new CompassRendererConnectionStorage( ipcRenderer, getInitialAutoConnectPreferences @@ -253,6 +259,14 @@ const Application = View.extend({ this.queryByHook('layout-container') ); + if (!isSecretStorageAvailable) { + openToast('secret-storage-not-available', { + variant: 'warning', + title: + 'Compass cannot access credential storage. You can still connect, but please note that passwords will not be saved.', + }); + } + document.querySelector('#loading-placeholder')?.remove(); }, updateAppVersion: async function () { diff --git a/packages/compass/src/main/application.ts b/packages/compass/src/main/application.ts index 360987067bb..40a3345c4c6 100644 --- a/packages/compass/src/main/application.ts +++ b/packages/compass/src/main/application.ts @@ -230,6 +230,9 @@ class CompassApplication { debug('Did not agree to license, quitting app.'); app.quit(); }, + 'compass:check-secret-storage-is-available': function () { + return safeStorage.isEncryptionAvailable(); + }, }); ipcMain?.handle('coverage', () => { From 7f42e69c2993d3fce14e5f85656c08739a70373a Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 25 Jul 2024 11:37:25 +0200 Subject: [PATCH 2/4] feat: track secret storage not available --- packages/compass/src/app/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/compass/src/app/index.tsx b/packages/compass/src/app/index.tsx index 2ea093bfcd3..f71f34438fd 100644 --- a/packages/compass/src/app/index.tsx +++ b/packages/compass/src/app/index.tsx @@ -265,6 +265,7 @@ const Application = View.extend({ title: 'Compass cannot access credential storage. You can still connect, but please note that passwords will not be saved.', }); + track('Secret Storage Not Available'); } document.querySelector('#loading-placeholder')?.remove(); From e48dedea24d27f451af614c28e3a76459cca29e0 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 25 Jul 2024 17:47:49 +0200 Subject: [PATCH 3/4] fix: await for app be ready before sending telemetry --- packages/compass/src/main/application.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/compass/src/main/application.ts b/packages/compass/src/main/application.ts index 40a3345c4c6..4469fa8aa55 100644 --- a/packages/compass/src/main/application.ts +++ b/packages/compass/src/main/application.ts @@ -101,6 +101,9 @@ class CompassApplication { safeStorage.setUsePlainTextEncryption(true); } + // Accessing isEncryptionAvailable is not allowed when app is not ready on Windows + // https://github.com/electron/electron/issues/33640 + await app.whenReady(); log.info( mongoLogId(1_001_000_307), 'Application', @@ -231,6 +234,9 @@ class CompassApplication { app.quit(); }, 'compass:check-secret-storage-is-available': function () { + // Accessing isEncryptionAvailable is not allowed when app is not ready on Windows + // https://github.com/electron/electron/issues/33640 + // But here Compass is already rendered and it is safe to omit `await app.whenReady()` return safeStorage.isEncryptionAvailable(); }, }); From aaa797507ea9f72f7a05c2ef2e231f36b43949f4 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 25 Jul 2024 21:21:20 +0200 Subject: [PATCH 4/4] refactor: wait for ready --- packages/compass/src/main/application.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/compass/src/main/application.ts b/packages/compass/src/main/application.ts index 4469fa8aa55..fd9a670f6f3 100644 --- a/packages/compass/src/main/application.ts +++ b/packages/compass/src/main/application.ts @@ -233,10 +233,10 @@ class CompassApplication { debug('Did not agree to license, quitting app.'); app.quit(); }, - 'compass:check-secret-storage-is-available': function () { + 'compass:check-secret-storage-is-available': async function () { // Accessing isEncryptionAvailable is not allowed when app is not ready on Windows // https://github.com/electron/electron/issues/33640 - // But here Compass is already rendered and it is safe to omit `await app.whenReady()` + await app.whenReady(); return safeStorage.isEncryptionAvailable(); }, });