From 53401bbf2ff136c60256d8c05d2e3613b3ef2a7c Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Fri, 21 Nov 2025 20:36:12 -0500 Subject: [PATCH 01/10] chore(compass-web): build devtools-connect into compass web COMPASS-9793 --- package-lock.json | 42 +++++++++++++++++++ packages/compass-web/.depcheckrc | 1 + .../devtools-connect-original.d.ts | 3 ++ .../@mongodb-js/devtools-connect/index.ts | 28 +++++++------ .../devtools-proxy-support/index.ts | 16 ++++--- .../@mongodb-js/oidc-plugin/index.ts | 10 +++++ packages/compass-web/polyfills/net/index.ts | 8 ++-- .../polyfills/os-dns-native/index.ts | 7 ++++ packages/compass-web/webpack.config.js | 13 ++++-- 9 files changed, 103 insertions(+), 25 deletions(-) create mode 100644 packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts create mode 100644 packages/compass-web/polyfills/@mongodb-js/oidc-plugin/index.ts create mode 100644 packages/compass-web/polyfills/os-dns-native/index.ts diff --git a/package-lock.json b/package-lock.json index f9736d35d41..89f2eefde4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51790,6 +51790,31 @@ "react-dom": "^17.0.2" } }, + "packages/compass-web/node_modules/@mongodb-js/devtools-connect": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.10.0.tgz", + "integrity": "sha512-RcHUT/vyhMz7dJ8IWwRu6AHJXDHoq7xRXNIbHtTAJSEgqbvo5megx6JdTx08LDFZitO0sn5mwPFHRGA3FsFPDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "lodash.merge": "^4.6.2", + "mongodb-connection-string-url": "^3.0.0", + "socks": "^2.7.3" + }, + "optionalDependencies": { + "kerberos": "^2.1.0", + "mongodb-client-encryption": "^6.1.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1" + }, + "peerDependencies": { + "@mongodb-js/oidc-plugin": "^2.0.0", + "mongodb": "^6.9.0", + "mongodb-log-writer": "^2.4.4" + } + }, "packages/compass-web/node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -64441,6 +64466,23 @@ "ws": "^8.16.0" }, "dependencies": { + "@mongodb-js/devtools-connect": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.10.0.tgz", + "integrity": "sha512-RcHUT/vyhMz7dJ8IWwRu6AHJXDHoq7xRXNIbHtTAJSEgqbvo5megx6JdTx08LDFZitO0sn5mwPFHRGA3FsFPDQ==", + "dev": true, + "requires": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "kerberos": "^2.1.0", + "lodash.merge": "^4.6.2", + "mongodb-client-encryption": "^6.1.0", + "mongodb-connection-string-url": "^3.0.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1", + "socks": "^2.7.3" + } + }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", diff --git a/packages/compass-web/.depcheckrc b/packages/compass-web/.depcheckrc index 15781132757..3a6217f0081 100644 --- a/packages/compass-web/.depcheckrc +++ b/packages/compass-web/.depcheckrc @@ -8,6 +8,7 @@ ignores: - '@types/chai-dom' - '@types/react' - '@types/react-dom' + - 'devtools-connect-original' # Used in electron-proxy through @ts-check, but depcheckrc can't detect it - '@types/express-http-proxy' # Used in webpack config as polyfills, depcheck can't detect that because of `/` diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts new file mode 100644 index 00000000000..c73689119b0 --- /dev/null +++ b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts @@ -0,0 +1,3 @@ +declare module 'devtools-connect-original' { + export * from '@mongodb-js/devtools-connect'; +} diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts index 046692f9a4e..f89668a7405 100644 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts +++ b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts @@ -1,6 +1,10 @@ +import * as devtools_connect from 'devtools-connect-original'; +import { createMongoDBOIDCPlugin } from '../oidc-plugin'; + export function hookLogger() { /* no-op */ } + export async function connectMongoClient( url: string, options: any, @@ -16,23 +20,21 @@ export async function connectMongoClient( delete options.parentState; delete options.parentHandle; options.__skipPingOnConnect = true; - const client = new MongoClient(url, options); - await client.connect(); + const { client } = await devtools_connect.connectMongoClient( + url, + options, + logger, + MongoClient + ); return { client, state: { - getStateShareServer() { - return Promise.resolve('Not Available'); - }, - oidcPlugin: { - logger, - serialize() { - return Promise.resolve(undefined); - }, - }, - destroy() { - return Promise.resolve(); + // eslint-disable-next-line @typescript-eslint/require-await + async getStateShareServer() { + return 'Not Available'; }, + oidcPlugin: createMongoDBOIDCPlugin({ logger }), + async destroy() {}, }, }; } diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts index 33189348b98..8b13a1b2a81 100644 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts +++ b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts @@ -10,14 +10,20 @@ export function createSocks5Tunnel(): void { export function hookLogger(): void { // no-op } -export function createFetch(): never { - throw new Error('node-fetch like-API not available in compass-web'); +export function createFetch(): typeof fetch { + // eslint-disable-next-line @typescript-eslint/require-await + return async () => { + throw new Error('node-fetch not available in compass web'); + }; } -export function systemCA(): never { - throw new Error('system CA access not available in compass-web'); +// eslint-disable-next-line @typescript-eslint/require-await +export async function systemCA(): Promise { + const error = new Error('system CA access not available in compass-web'); + (error as unknown as { code: 'OUT_OF_MEM' }).code = 'OUT_OF_MEM'; // This is a "tls" error code that makes devtools-connect not use the systemCA + throw error; } export function resetSystemCACache(): never { - throw new Error('system CA access not available in compass-web'); + throw new Error('reset system CA access not available in compass-web'); } // Explicitly web-compatible diff --git a/packages/compass-web/polyfills/@mongodb-js/oidc-plugin/index.ts b/packages/compass-web/polyfills/@mongodb-js/oidc-plugin/index.ts new file mode 100644 index 00000000000..bfe64886334 --- /dev/null +++ b/packages/compass-web/polyfills/@mongodb-js/oidc-plugin/index.ts @@ -0,0 +1,10 @@ +export function hookLoggerToMongoLogWriter() {} +export function createMongoDBOIDCPlugin({ logger }: any) { + return { + mongoClientOptions: {}, + logger, + /* eslint-disable @typescript-eslint/require-await */ + serialize: async () => '', + destroy: () => {}, + }; +} diff --git a/packages/compass-web/polyfills/net/index.ts b/packages/compass-web/polyfills/net/index.ts index b1081232fbb..585fb99436f 100644 --- a/packages/compass-web/polyfills/net/index.ts +++ b/packages/compass-web/polyfills/net/index.ts @@ -27,8 +27,12 @@ class Socket extends Duplex { lookup?: ConnectionOptions['lookup']; tls?: boolean; }) { + // WS does not support callback lookup + if ((lookup?.length ?? 0) > 0) lookup = undefined; + const { wsURL, ...atlasOptions } = lookup?.() ?? ({} as { wsURL?: string; clusterName?: string }); + this._ws = new WebSocket(wsURL ?? '/ws-proxy'); this._ws.binaryType = 'arraybuffer'; this._ws.addEventListener( @@ -159,8 +163,6 @@ export { isIPv4, isIPv6 } from 'is-ip'; export const isIP = (input: string) => ipVersion(input) ?? 0; export const createConnection = (options: { host: string; port: number }) => { const socket = new Socket(); - setTimeout(() => { - socket.connect(options); - }); + socket.connect(options); return socket; }; diff --git a/packages/compass-web/polyfills/os-dns-native/index.ts b/packages/compass-web/polyfills/os-dns-native/index.ts new file mode 100644 index 00000000000..612046acb46 --- /dev/null +++ b/packages/compass-web/polyfills/os-dns-native/index.ts @@ -0,0 +1,7 @@ +import { resolveSrv, resolveTxt } from '../dns'; + +export const wasNativelyLookedUp = () => false; +export const withNodeFallback = { + resolveSrv, + resolveTxt, +}; diff --git a/packages/compass-web/webpack.config.js b/packages/compass-web/webpack.config.js index 8d63c2b2d75..2e25fa84472 100644 --- a/packages/compass-web/webpack.config.js +++ b/packages/compass-web/webpack.config.js @@ -45,6 +45,7 @@ module.exports = (env, args) => { '@mongodb-js/devtools-proxy-support': localPolyfill( '@mongodb-js/devtools-proxy-support' ), + '@mongodb-js/oidc-plugin': localPolyfill('@mongodb-js/oidc-plugin'), ...(config.mode === 'production' ? { @@ -56,14 +57,17 @@ module.exports = (env, args) => { } : {}), - // Replace 'devtools-connect' with a package that just directly connects - // using the driver (= web-compatible driver) logic, because devtools-connect - // contains a lot of logic that makes sense in a desktop application/CLI but - // not in a web environment (DNS resolution, OIDC, CSFLE/QE, etc.) + // We replace the direct import without own the sanitizes unsupported options + // from the web env that are never relevant to connecting on web. '@mongodb-js/devtools-connect': localPolyfill( '@mongodb-js/devtools-connect' ), + // Then we call into the real devtools-connect package + 'devtools-connect-original': require.resolve( + '@mongodb-js/devtools-connect' + ), + // TODO(COMPASS-7407): compass-logging // hard to disable the whole thing while there are direct dependencies // on log-writer @@ -124,6 +128,7 @@ module.exports = (env, args) => { os: require.resolve('os-browserify/browser'), crypto: require.resolve('crypto-browserify'), dns: localPolyfill('dns'), + 'os-dns-native': localPolyfill('os-dns-native'), // Built-in Node.js modules imported by the driver directly and used in // ways that requires us to provide a no-op polyfill zlib: localPolyfill('zlib'), From 1a9e26ab136816f05dafd8248f7e4392902d8292 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Mon, 24 Nov 2025 15:55:42 -0500 Subject: [PATCH 02/10] removing devtools-connect indirection --- .../devtools-connect-original.d.ts | 3 -- .../@mongodb-js/devtools-connect/index.ts | 40 ------------------- .../devtools-proxy-support/index.ts | 15 +++---- .../compass-web/src/connection-storage.tsx | 1 + packages/compass-web/webpack.config.js | 11 ----- .../data-service/src/connection-options.ts | 3 +- 6 files changed, 9 insertions(+), 64 deletions(-) delete mode 100644 packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts delete mode 100644 packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts deleted file mode 100644 index c73689119b0..00000000000 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/devtools-connect-original.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'devtools-connect-original' { - export * from '@mongodb-js/devtools-connect'; -} diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts deleted file mode 100644 index f89668a7405..00000000000 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-connect/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as devtools_connect from 'devtools-connect-original'; -import { createMongoDBOIDCPlugin } from '../oidc-plugin'; - -export function hookLogger() { - /* no-op */ -} - -export async function connectMongoClient( - url: string, - options: any, - logger: any, - MongoClient: any -): Promise { - // Remove options not understood by the plain Node.js driver - delete options.proxy; - delete options.applyProxyToOIDC; - delete options.productDocsLink; - delete options.productName; - delete options.oidc; - delete options.parentState; - delete options.parentHandle; - options.__skipPingOnConnect = true; - const { client } = await devtools_connect.connectMongoClient( - url, - options, - logger, - MongoClient - ); - return { - client, - state: { - // eslint-disable-next-line @typescript-eslint/require-await - async getStateShareServer() { - return 'Not Available'; - }, - oidcPlugin: createMongoDBOIDCPlugin({ logger }), - async destroy() {}, - }, - }; -} diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts index 8b13a1b2a81..c70772271b9 100644 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts +++ b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts @@ -11,16 +11,13 @@ export function hookLogger(): void { // no-op } export function createFetch(): typeof fetch { - // eslint-disable-next-line @typescript-eslint/require-await - return async () => { - throw new Error('node-fetch not available in compass web'); - }; + return async () => + Promise.reject(new Error('node-fetch not available in compass web')); } -// eslint-disable-next-line @typescript-eslint/require-await -export async function systemCA(): Promise { - const error = new Error('system CA access not available in compass-web'); - (error as unknown as { code: 'OUT_OF_MEM' }).code = 'OUT_OF_MEM'; // This is a "tls" error code that makes devtools-connect not use the systemCA - throw error; +export async function systemCA() { + await Promise.reject( + new Error('system CA access not available in compass-web') + ); } export function resetSystemCACache(): never { throw new Error('reset system CA access not available in compass-web'); diff --git a/packages/compass-web/src/connection-storage.tsx b/packages/compass-web/src/connection-storage.tsx index 5bc824d5c65..3b3bd5eda9d 100644 --- a/packages/compass-web/src/connection-storage.tsx +++ b/packages/compass-web/src/connection-storage.tsx @@ -138,6 +138,7 @@ export class AtlasCloudConnectionStorage ...connectionInfo, connectionOptions: { ...connectionInfo.connectionOptions, + useSystemCA: false, lookup: () => { return { wsURL: this.atlasService.driverProxyEndpoint( diff --git a/packages/compass-web/webpack.config.js b/packages/compass-web/webpack.config.js index 2e25fa84472..9b358c16390 100644 --- a/packages/compass-web/webpack.config.js +++ b/packages/compass-web/webpack.config.js @@ -57,17 +57,6 @@ module.exports = (env, args) => { } : {}), - // We replace the direct import without own the sanitizes unsupported options - // from the web env that are never relevant to connecting on web. - '@mongodb-js/devtools-connect': localPolyfill( - '@mongodb-js/devtools-connect' - ), - - // Then we call into the real devtools-connect package - 'devtools-connect-original': require.resolve( - '@mongodb-js/devtools-connect' - ), - // TODO(COMPASS-7407): compass-logging // hard to disable the whole thing while there are direct dependencies // on log-writer diff --git a/packages/data-service/src/connection-options.ts b/packages/data-service/src/connection-options.ts index cc284f32fa5..d006dfce230 100644 --- a/packages/data-service/src/connection-options.ts +++ b/packages/data-service/src/connection-options.ts @@ -19,7 +19,8 @@ export type OIDCOptions = Omit< >[]; }; -export interface ConnectionOptions { +export interface ConnectionOptions + extends Pick { /** * The connection string to connect to the MongoDB instance including all options set by the user. */ From a4a1c0fe9045537d58271a8dbc24c4d8553a02b0 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Mon, 1 Dec 2025 13:01:40 -0500 Subject: [PATCH 03/10] chore: update devtools-connect --- package-lock.json | 100 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89f2eefde4f..136ac0be809 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47138,6 +47138,30 @@ "typescript": "^5.9.3" } }, + "packages/atlas-service/node_modules/@mongodb-js/devtools-connect": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "lodash.merge": "^4.6.2", + "mongodb-connection-string-url": "^3.0.0", + "socks": "^2.7.3" + }, + "optionalDependencies": { + "kerberos": "^2.1.0", + "mongodb-client-encryption": "^6.1.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1" + }, + "peerDependencies": { + "@mongodb-js/oidc-plugin": "^2.0.0", + "mongodb": "^6.9.0", + "mongodb-log-writer": "^2.4.4" + } + }, "packages/atlas-service/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -51791,9 +51815,9 @@ } }, "packages/compass-web/node_modules/@mongodb-js/devtools-connect": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.10.0.tgz", - "integrity": "sha512-RcHUT/vyhMz7dJ8IWwRu6AHJXDHoq7xRXNIbHtTAJSEgqbvo5megx6JdTx08LDFZitO0sn5mwPFHRGA3FsFPDQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -52722,6 +52746,30 @@ "mongodb-client-encryption": "^6.5.0" } }, + "packages/data-service/node_modules/@mongodb-js/devtools-connect": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "lodash.merge": "^4.6.2", + "mongodb-connection-string-url": "^3.0.0", + "socks": "^2.7.3" + }, + "optionalDependencies": { + "kerberos": "^2.1.0", + "mongodb-client-encryption": "^6.1.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1" + }, + "peerDependencies": { + "@mongodb-js/oidc-plugin": "^2.0.0", + "mongodb": "^6.9.0", + "mongodb-log-writer": "^2.4.4" + } + }, "packages/data-service/node_modules/@mongodb-js/devtools-docker-test-envs": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-docker-test-envs/-/devtools-docker-test-envs-1.3.3.tgz", @@ -52784,7 +52832,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-2.2.1.tgz", "integrity": "sha512-Vlyv1tjAPb0y2VIJ03dKkUjsneGIBuTkH24uGRx6/DrKpFlVuGPmct3m5aEotljVUlw7PAGWABwR5aNeW7y8Zw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -52799,7 +52847,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "packages/data-service/node_modules/sinon": { @@ -61015,6 +61063,22 @@ "typescript": "^5.9.3" }, "dependencies": { + "@mongodb-js/devtools-connect": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "requires": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "kerberos": "^2.1.0", + "lodash.merge": "^4.6.2", + "mongodb-client-encryption": "^6.1.0", + "mongodb-connection-string-url": "^3.0.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1", + "socks": "^2.7.3" + } + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -64467,9 +64531,9 @@ }, "dependencies": { "@mongodb-js/devtools-connect": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.10.0.tgz", - "integrity": "sha512-RcHUT/vyhMz7dJ8IWwRu6AHJXDHoq7xRXNIbHtTAJSEgqbvo5megx6JdTx08LDFZitO0sn5mwPFHRGA3FsFPDQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", "dev": true, "requires": { "@mongodb-js/devtools-proxy-support": "^0.5.5", @@ -86090,6 +86154,22 @@ "typescript": "^5.9.3" }, "dependencies": { + "@mongodb-js/devtools-connect": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", + "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "requires": { + "@mongodb-js/devtools-proxy-support": "^0.5.5", + "@mongodb-js/oidc-http-server-pages": "1.1.8", + "kerberos": "^2.1.0", + "lodash.merge": "^4.6.2", + "mongodb-client-encryption": "^6.1.0", + "mongodb-connection-string-url": "^3.0.0", + "os-dns-native": "^1.2.0", + "resolve-mongodb-srv": "^1.1.1", + "socks": "^2.7.3" + } + }, "@mongodb-js/devtools-docker-test-envs": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-docker-test-envs/-/devtools-docker-test-envs-1.3.3.tgz", @@ -86139,7 +86219,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/kerberos/-/kerberos-2.2.1.tgz", "integrity": "sha512-Vlyv1tjAPb0y2VIJ03dKkUjsneGIBuTkH24uGRx6/DrKpFlVuGPmct3m5aEotljVUlw7PAGWABwR5aNeW7y8Zw==", - "dev": true, + "devOptional": true, "requires": { "node-addon-api": "^6.1.0", "prebuild-install": "^7.1.2" @@ -86149,7 +86229,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true + "devOptional": true }, "sinon": { "version": "9.2.4", From 55b8a3696fabd9294abcd94c470d8e0d7b972434 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Tue, 2 Dec 2025 15:20:39 -0500 Subject: [PATCH 04/10] chore: pass through useSystemCA --- packages/compass-web/.depcheckrc | 1 - .../src/compass-main-connection-storage.spec.ts | 1 + packages/data-service/src/connect-mongo-client.ts | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/compass-web/.depcheckrc b/packages/compass-web/.depcheckrc index 3a6217f0081..15781132757 100644 --- a/packages/compass-web/.depcheckrc +++ b/packages/compass-web/.depcheckrc @@ -8,7 +8,6 @@ ignores: - '@types/chai-dom' - '@types/react' - '@types/react-dom' - - 'devtools-connect-original' # Used in electron-proxy through @ts-check, but depcheckrc can't detect it - '@types/express-http-proxy' # Used in webpack config as polyfills, depcheck can't detect that because of `/` diff --git a/packages/connection-storage/src/compass-main-connection-storage.spec.ts b/packages/connection-storage/src/compass-main-connection-storage.spec.ts index 3cb992a386d..d88700f5e69 100644 --- a/packages/connection-storage/src/compass-main-connection-storage.spec.ts +++ b/packages/connection-storage/src/compass-main-connection-storage.spec.ts @@ -795,6 +795,7 @@ describe('ConnectionStorage', function () { oidc: {}, fleOptions: { storeCredentials: false }, lookup: () => ({} as any), + useSystemCA: true, }; await connectionStorage.save({ connectionInfo: { diff --git a/packages/data-service/src/connect-mongo-client.ts b/packages/data-service/src/connect-mongo-client.ts index e3726a6dce0..3eecc07458a 100644 --- a/packages/data-service/src/connect-mongo-client.ts +++ b/packages/data-service/src/connect-mongo-client.ts @@ -164,6 +164,7 @@ export async function connectMongoClientDataService({ productDocsLink: productDocsLink ?? 'https://www.mongodb.com/docs/compass/', monitorCommands: true, autoEncryption: connectionOptions.fleOptions?.autoEncryption, + useSystemCA: connectionOptions.useSystemCA ?? true, ...oidcOptions, }; From 697037aca7cb58b7c4e19d0213835881dc9169f0 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Tue, 2 Dec 2025 16:53:40 -0500 Subject: [PATCH 05/10] rm unused --- package-lock.json | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 136ac0be809..58b31caab75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51814,31 +51814,6 @@ "react-dom": "^17.0.2" } }, - "packages/compass-web/node_modules/@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/devtools-proxy-support": "^0.5.5", - "@mongodb-js/oidc-http-server-pages": "1.1.8", - "lodash.merge": "^4.6.2", - "mongodb-connection-string-url": "^3.0.0", - "socks": "^2.7.3" - }, - "optionalDependencies": { - "kerberos": "^2.1.0", - "mongodb-client-encryption": "^6.1.0", - "os-dns-native": "^1.2.0", - "resolve-mongodb-srv": "^1.1.1" - }, - "peerDependencies": { - "@mongodb-js/oidc-plugin": "^2.0.0", - "mongodb": "^6.9.0", - "mongodb-log-writer": "^2.4.4" - } - }, "packages/compass-web/node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -64530,23 +64505,6 @@ "ws": "^8.16.0" }, "dependencies": { - "@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", - "dev": true, - "requires": { - "@mongodb-js/devtools-proxy-support": "^0.5.5", - "@mongodb-js/oidc-http-server-pages": "1.1.8", - "kerberos": "^2.1.0", - "lodash.merge": "^4.6.2", - "mongodb-client-encryption": "^6.1.0", - "mongodb-connection-string-url": "^3.0.0", - "os-dns-native": "^1.2.0", - "resolve-mongodb-srv": "^1.1.1", - "socks": "^2.7.3" - } - }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", From 9115081d5336987a37200190bde04666c085ceba Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 3 Dec 2025 15:41:49 -0500 Subject: [PATCH 06/10] chore: update devtools-connect and add necessary proxy api stub --- package-lock.json | 24 +++++++++---------- .../devtools-proxy-support/index.ts | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58b31caab75..1b13d25f9ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47139,9 +47139,9 @@ } }, "packages/atlas-service/node_modules/@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.12.0.tgz", + "integrity": "sha512-/aiGAKE5k6y1noI6hFo3pkLarNCNjEn+J3iqWTAMBuX4SpKUWsDdpMAyyxkqou7qH97gvon4A7wQafWFgWTXvA==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/devtools-proxy-support": "^0.5.5", @@ -52722,9 +52722,9 @@ } }, "packages/data-service/node_modules/@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.12.0.tgz", + "integrity": "sha512-/aiGAKE5k6y1noI6hFo3pkLarNCNjEn+J3iqWTAMBuX4SpKUWsDdpMAyyxkqou7qH97gvon4A7wQafWFgWTXvA==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/devtools-proxy-support": "^0.5.5", @@ -61039,9 +61039,9 @@ }, "dependencies": { "@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.12.0.tgz", + "integrity": "sha512-/aiGAKE5k6y1noI6hFo3pkLarNCNjEn+J3iqWTAMBuX4SpKUWsDdpMAyyxkqou7qH97gvon4A7wQafWFgWTXvA==", "requires": { "@mongodb-js/devtools-proxy-support": "^0.5.5", "@mongodb-js/oidc-http-server-pages": "1.1.8", @@ -86113,9 +86113,9 @@ }, "dependencies": { "@mongodb-js/devtools-connect": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.11.0.tgz", - "integrity": "sha512-vXxBJ8kgcHcomI0P4NamT2X9EMN5VmLfDnwsL4jM2MgMVJnjNUh49re87vA/t+8BAuj853Db1WCgP+YBTTq/Hw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.12.0.tgz", + "integrity": "sha512-/aiGAKE5k6y1noI6hFo3pkLarNCNjEn+J3iqWTAMBuX4SpKUWsDdpMAyyxkqou7qH97gvon4A7wQafWFgWTXvA==", "requires": { "@mongodb-js/devtools-proxy-support": "^0.5.5", "@mongodb-js/oidc-http-server-pages": "1.1.8", diff --git a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts index c70772271b9..b356c5a39c3 100644 --- a/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts +++ b/packages/compass-web/polyfills/@mongodb-js/devtools-proxy-support/index.ts @@ -1,6 +1,9 @@ export function createAgent(): void { // The original can return 'undefined' as well } +export function isExistingAgentInstance(): boolean { + return false; +} export function useOrCreateAgent(): void { // The original can return 'undefined' as well } From ca1eeda535f0ce7170cfb742c296ae6dd9d24feb Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 3 Dec 2025 16:16:37 -0500 Subject: [PATCH 07/10] test: fix! --- packages/data-service/src/connect-mongo-client.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/data-service/src/connect-mongo-client.spec.ts b/packages/data-service/src/connect-mongo-client.spec.ts index f5349d5634f..f6edb830f39 100644 --- a/packages/data-service/src/connect-mongo-client.spec.ts +++ b/packages/data-service/src/connect-mongo-client.spec.ts @@ -14,6 +14,7 @@ import ConnectionString from 'mongodb-connection-string-url'; const defaultOptions = { productDocsLink: 'https://www.mongodb.com/docs/compass/', productName: 'MongoDB Compass', + useSystemCA: true, }; const setupListeners = () => { From b24bd02d008ecd3ecd70abccef3254e9d8a5569c Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 3 Dec 2025 21:46:25 -0500 Subject: [PATCH 08/10] more useSystemCA false changes --- .../helpers/compass-web-sandbox.ts | 6 ++++- .../sandbox/sandbox-connection-storage.tsx | 24 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts b/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts index caccb9f9608..6b00e234dc6 100644 --- a/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts +++ b/packages/compass-e2e-tests/helpers/compass-web-sandbox.ts @@ -208,7 +208,11 @@ export const getAtlasCloudSandboxDefaultConnections = ( str.password = dbPassword; return { id: name, - connectionOptions: { connectionString: String(str) }, + connectionOptions: { + connectionString: String(str), + // System CA certificates are not available in the browser environment + useSystemCA: false, + }, favorite: { name }, }; }); diff --git a/packages/compass-web/sandbox/sandbox-connection-storage.tsx b/packages/compass-web/sandbox/sandbox-connection-storage.tsx index aae40bd3da4..38ee6c9f126 100644 --- a/packages/compass-web/sandbox/sandbox-connection-storage.tsx +++ b/packages/compass-web/sandbox/sandbox-connection-storage.tsx @@ -36,11 +36,31 @@ class SandboxConnectionStorage implements ConnectionStorage { return [info.id, info]; }) ); + + // Ensure useSystemCA is set to false for all connections since system CA + // certificates are not available in the browser environment + private normalizeConnectionInfo(info: ConnectionInfo): ConnectionInfo { + return { + ...info, + connectionOptions: { + ...info.connectionOptions, + useSystemCA: false, + }, + }; + } + loadAll(): Promise { - return Promise.resolve(Array.from(this._connections.values())); + return Promise.resolve( + Array.from(this._connections.values()).map((info) => + this.normalizeConnectionInfo(info) + ) + ); } load({ id }: { id: string }): Promise { - return Promise.resolve(this._connections.get(id)); + const info = this._connections.get(id); + return Promise.resolve( + info ? this.normalizeConnectionInfo(info) : undefined + ); } save({ connectionInfo }: { connectionInfo: ConnectionInfo }): Promise { this._connections.set(connectionInfo.id, connectionInfo); From 5e1a11c2a0efbd64d541a80863a0ae21287a58f8 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Mon, 15 Dec 2025 15:28:54 -0500 Subject: [PATCH 09/10] wip --- .../connection-status-notifications.tsx | 2 +- packages/compass-connections/src/index.tsx | 6 ++ .../src/stores/connections-store-redux.ts | 3 + packages/compass-e2e-tests/helpers/compass.ts | 18 ++++ .../sandbox/sandbox-connection-storage.tsx | 4 +- .../compass-web/src/connection-storage.tsx | 16 ++++ packages/compass-web/src/entrypoint.tsx | 83 ++++++++++++------- .../src/hooks/use-connect-form.ts | 11 +++ .../data-service/src/connect-mongo-client.ts | 13 ++- 9 files changed, 121 insertions(+), 35 deletions(-) diff --git a/packages/compass-connections/src/components/connection-status-notifications.tsx b/packages/compass-connections/src/components/connection-status-notifications.tsx index a7682e54a15..b5a02a93713 100644 --- a/packages/compass-connections/src/components/connection-status-notifications.tsx +++ b/packages/compass-connections/src/components/connection-status-notifications.tsx @@ -100,7 +100,7 @@ function ConnectionErrorToastBody({ > {info ? getConnectionTitle(info) : 'Connection failed'} - {error.message} + {info && onReview && ( diff --git a/packages/compass-connections/src/index.tsx b/packages/compass-connections/src/index.tsx index 60e2f2b79f6..7743a2cde3a 100644 --- a/packages/compass-connections/src/index.tsx +++ b/packages/compass-connections/src/index.tsx @@ -73,6 +73,11 @@ const ConnectionsComponent: React.FunctionComponent<{ * When connections fail to load, this callback will be called */ onFailToLoadConnections: (error: Error) => void; + /** + * Can be used to override the default useSystemCA behavior. + * Set to false in browser environments where system CA certificates are not available. + */ + useSystemCA?: boolean; }> = ({ children }) => { const activeConnections = useConnectionsList((connection) => { return connection.status === 'connected'; @@ -119,6 +124,7 @@ const CompassConnectionsPlugin = registerCompassPlugin( globalAppRegistry, onFailToLoadConnections: initialProps.onFailToLoadConnections, compassAssistant, + useSystemCA: initialProps.useSystemCA, }); setTimeout(() => { diff --git a/packages/compass-connections/src/stores/connections-store-redux.ts b/packages/compass-connections/src/stores/connections-store-redux.ts index 85db8197767..468b2489c85 100644 --- a/packages/compass-connections/src/stores/connections-store-redux.ts +++ b/packages/compass-connections/src/stores/connections-store-redux.ts @@ -214,6 +214,7 @@ type ThunkExtraArg = { globalAppRegistry: Pick; onFailToLoadConnections: (error: Error) => void; compassAssistant: CompassAssistantService; + useSystemCA?: boolean; }; export type ConnectionsThunkAction< @@ -1532,6 +1533,7 @@ const connectWithOptions = ( appName, getExtraConnectionData, connectFn, + useSystemCA, } ) => { let inflightConnection = InFlightConnections.get(connectionInfo.id); @@ -1643,6 +1645,7 @@ const connectWithOptions = ( deviceAuthAbortController.signal ); }, + useSystemCA, }), } ); diff --git a/packages/compass-e2e-tests/helpers/compass.ts b/packages/compass-e2e-tests/helpers/compass.ts index a614354389a..b9bf35205d0 100644 --- a/packages/compass-e2e-tests/helpers/compass.ts +++ b/packages/compass-e2e-tests/helpers/compass.ts @@ -24,12 +24,14 @@ import { CHROME_STARTUP_FLAGS } from './chrome-startup-flags'; import { DEFAULT_CONNECTION_STRINGS, DEFAULT_CONNECTION_NAMES, + DEFAULT_CONNECTIONS, DEFAULT_CONNECTIONS_SERVER_INFO, isTestingWeb, isTestingDesktop, context, assertTestingWeb, isTestingAtlasCloudExternal, + isTestingAtlasCloudSandbox, } from './test-runner-context'; import { MONOREPO_ELECTRON_CHROMIUM_VERSION, @@ -897,6 +899,22 @@ export async function startBrowser( ); } else { await browser.navigateTo(context.sandboxUrl); + + // For Atlas Cloud Sandbox tests, inject the default connections into localStorage + // and reload the page so that SandboxConnectionStorage picks them up + if (isTestingAtlasCloudSandbox(context)) { + await browser.execute((connections) => { + const historyKey = 'CONNECTIONS_HISTORY_V$'; + const bytes = new TextEncoder().encode(JSON.stringify(connections)); + const binStr = String.fromCodePoint(...bytes); + const b64Str = window.btoa(binStr); + localStorage.setItem(historyKey, b64Str); + }, DEFAULT_CONNECTIONS); + + // Reload the page so that SandboxConnectionStorage is re-instantiated + // with the connections from localStorage + await browser.navigateTo(context.sandboxUrl); + } } const compass = new Compass(name, browser, { diff --git a/packages/compass-web/sandbox/sandbox-connection-storage.tsx b/packages/compass-web/sandbox/sandbox-connection-storage.tsx index 38ee6c9f126..beddeb6e40e 100644 --- a/packages/compass-web/sandbox/sandbox-connection-storage.tsx +++ b/packages/compass-web/sandbox/sandbox-connection-storage.tsx @@ -63,7 +63,9 @@ class SandboxConnectionStorage implements ConnectionStorage { ); } save({ connectionInfo }: { connectionInfo: ConnectionInfo }): Promise { - this._connections.set(connectionInfo.id, connectionInfo); + // Normalize the connection to ensure useSystemCA is false before saving + const normalizedInfo = this.normalizeConnectionInfo(connectionInfo); + this._connections.set(normalizedInfo.id, normalizedInfo); setTimeout(() => { saveHistory(Array.from(this._connections.values())); }, 0); diff --git a/packages/compass-web/src/connection-storage.tsx b/packages/compass-web/src/connection-storage.tsx index 3b3bd5eda9d..17b49352ac9 100644 --- a/packages/compass-web/src/connection-storage.tsx +++ b/packages/compass-web/src/connection-storage.tsx @@ -163,6 +163,22 @@ export class AtlasCloudConnectionStorage }); return this.loadAllPromise; } + + async save({ + connectionInfo, + }: { + connectionInfo: ConnectionInfo; + }): Promise { + // Ensure useSystemCA is false for all connections in the browser environment + const normalizedInfo: ConnectionInfo = { + ...connectionInfo, + connectionOptions: { + ...connectionInfo.connectionOptions, + useSystemCA: false, + }, + }; + return super.save({ connectionInfo: normalizedInfo }); + } } const SandboxConnectionStorageContext = diff --git a/packages/compass-web/src/entrypoint.tsx b/packages/compass-web/src/entrypoint.tsx index b25363d3973..f89d08072f9 100644 --- a/packages/compass-web/src/entrypoint.tsx +++ b/packages/compass-web/src/entrypoint.tsx @@ -126,6 +126,55 @@ const WithAtlasProviders: React.FC<{ children: React.ReactNode }> = ({ ); }; +const WithConnectionsProvider: React.FC<{ + appName: string; + autoconnectId?: string; + onFailToLoadConnections: (err: Error) => void; + children: React.ReactNode; +}> = ({ appName, autoconnectId, onFailToLoadConnections, children }) => { + const logger = useCompassWebLogger({}); + + return ( + { + return Promise.resolve([{}, null] as [ + Record, + null + ]); + }} + onAutoconnectInfoRequest={(connectionStore) => { + if (autoconnectId) { + return connectionStore.loadAll().then( + (connections) => { + return connections.find( + (connectionInfo) => connectionInfo.id === autoconnectId + ); + }, + (err) => { + const { log, mongoLogId } = logger; + log.warn( + mongoLogId(1_001_000_329), + 'Compass Web', + 'Could not load connections when trying to autoconnect', + { err: err.message } + ); + return undefined; + } + ); + } + return Promise.resolve(undefined); + }} + > + {children} + + ); +}; + const WithStorageProviders = createServiceProvider( function WithStorageProviders({ orgId, @@ -556,38 +605,10 @@ const CompassWeb = ({ originForPrompt="atlas-data-explorer" appNameForPrompt={APP_NAMES_FOR_PROMPT.DataExplorer} > - { - return Promise.resolve([{}, null] as [ - Record, - null - ]); - }} - onAutoconnectInfoRequest={(connectionStore) => { - if (autoconnectId) { - return connectionStore.loadAll().then( - (connections) => { - return connections.find( - (connectionInfo) => - connectionInfo.id === autoconnectId - ); - }, - (err) => { - const { log, mongoLogId } = logger; - log.warn( - mongoLogId(1_001_000_329), - 'Compass Web', - 'Could not load connections when trying to autoconnect', - { err: err.message } - ); - return undefined; - } - ); - } - return Promise.resolve(undefined); - }} > @@ -611,7 +632,7 @@ const CompassWeb = ({ isCloudOptIn={true} /> - + diff --git a/packages/connection-form/src/hooks/use-connect-form.ts b/packages/connection-form/src/hooks/use-connect-form.ts index 1f8c7a060b2..1571db2bec6 100644 --- a/packages/connection-form/src/hooks/use-connect-form.ts +++ b/packages/connection-form/src/hooks/use-connect-form.ts @@ -848,6 +848,7 @@ export function adjustConnectionOptionsBeforeConnect({ defaultAppName, notifyDeviceFlow, preferences, + useSystemCA, }: { connectionOptions: Readonly; connectionId: string; @@ -861,6 +862,7 @@ export function adjustConnectionOptionsBeforeConnect({ telemetryAnonymousId?: string; forceConnectionOptions: [string, string][]; }; + useSystemCA?: boolean; }): ConnectionOptions { const transformers: (( connectionOptions: Readonly @@ -882,5 +884,14 @@ export function adjustConnectionOptionsBeforeConnect({ for (const transformer of transformers) { connectionOptions = transformer(connectionOptions); } + + // Apply useSystemCA if explicitly provided + if (useSystemCA !== undefined) { + connectionOptions = { + ...connectionOptions, + useSystemCA, + }; + } + return connectionOptions; } diff --git a/packages/data-service/src/connect-mongo-client.ts b/packages/data-service/src/connect-mongo-client.ts index 3eecc07458a..a4ecd995258 100644 --- a/packages/data-service/src/connect-mongo-client.ts +++ b/packages/data-service/src/connect-mongo-client.ts @@ -285,7 +285,13 @@ export async function connectMongoClientDataService({ const { client: metadataClient, state } = await connectSingleClient({ autoEncryption: undefined, }); - const parentHandlePromise = state.getStateShareServer(); + + // StateShareServer is only needed for OIDC authentication. + // Check if OIDC is being used before creating the server. + const connectionStringUrl = new ConnectionString(url); + const isOIDC = connectionStringUrl.searchParams.get('authMechanism') === 'MONGODB-OIDC'; + const parentHandlePromise = isOIDC ? state.getStateShareServer() : Promise.resolve(''); + parentHandlePromise.catch(() => { /* handled below */ }); @@ -324,7 +330,10 @@ export async function connectMongoClientDataService({ waitForTunnelError(tunnel), ]); // waitForTunnel always throws, never resolves - options.parentHandle = await state.getStateShareServer(); + // Only get StateShareServer handle for OIDC connections + const connectionStringUrl = new ConnectionString(url); + const isOIDC = connectionStringUrl.searchParams.get('authMechanism') === 'MONGODB-OIDC'; + options.parentHandle = isOIDC ? await state.getStateShareServer() : ''; return [ metadataClient, From 143f646d14c6bba81ee44da964f94d10b594b32a Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 17 Dec 2025 17:33:12 -0500 Subject: [PATCH 10/10] chore: fmt --- .../connection-status-notifications.tsx | 9 ++++++++- packages/compass-web/src/entrypoint.tsx | 5 +---- packages/data-service/src/connect-mongo-client.ts | 15 ++++++++++----- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/compass-connections/src/components/connection-status-notifications.tsx b/packages/compass-connections/src/components/connection-status-notifications.tsx index b5a02a93713..af111174685 100644 --- a/packages/compass-connections/src/components/connection-status-notifications.tsx +++ b/packages/compass-connections/src/components/connection-status-notifications.tsx @@ -100,7 +100,14 @@ function ConnectionErrorToastBody({ > {info ? getConnectionTitle(info) : 'Connection failed'} - + {info && onReview && ( diff --git a/packages/compass-web/src/entrypoint.tsx b/packages/compass-web/src/entrypoint.tsx index f89d08072f9..55545c1e7fa 100644 --- a/packages/compass-web/src/entrypoint.tsx +++ b/packages/compass-web/src/entrypoint.tsx @@ -142,10 +142,7 @@ const WithConnectionsProvider: React.FC<{ // are not available, so we disable useSystemCA useSystemCA={false} onExtraConnectionDataRequest={() => { - return Promise.resolve([{}, null] as [ - Record, - null - ]); + return Promise.resolve([{}, null] as [Record, null]); }} onAutoconnectInfoRequest={(connectionStore) => { if (autoconnectId) { diff --git a/packages/data-service/src/connect-mongo-client.ts b/packages/data-service/src/connect-mongo-client.ts index a4ecd995258..9b3dc12cd19 100644 --- a/packages/data-service/src/connect-mongo-client.ts +++ b/packages/data-service/src/connect-mongo-client.ts @@ -285,13 +285,17 @@ export async function connectMongoClientDataService({ const { client: metadataClient, state } = await connectSingleClient({ autoEncryption: undefined, }); - + // StateShareServer is only needed for OIDC authentication. // Check if OIDC is being used before creating the server. const connectionStringUrl = new ConnectionString(url); - const isOIDC = connectionStringUrl.searchParams.get('authMechanism') === 'MONGODB-OIDC'; - const parentHandlePromise = isOIDC ? state.getStateShareServer() : Promise.resolve(''); - + const isOIDC = + connectionStringUrl.searchParams.get('authMechanism') === + 'MONGODB-OIDC'; + const parentHandlePromise = isOIDC + ? state.getStateShareServer() + : Promise.resolve(''); + parentHandlePromise.catch(() => { /* handled below */ }); @@ -332,7 +336,8 @@ export async function connectMongoClientDataService({ // Only get StateShareServer handle for OIDC connections const connectionStringUrl = new ConnectionString(url); - const isOIDC = connectionStringUrl.searchParams.get('authMechanism') === 'MONGODB-OIDC'; + const isOIDC = + connectionStringUrl.searchParams.get('authMechanism') === 'MONGODB-OIDC'; options.parentHandle = isOIDC ? await state.getStateShareServer() : ''; return [