mongodb-data-service 22.23.2 → 22.23.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/connect-mongo-client.js +42 -4
- package/lib/connect-mongo-client.js.map +1 -1
- package/lib/connection-attempt.js +2 -0
- package/lib/connection-attempt.js.map +1 -1
- package/lib/connection-options.d.ts +45 -0
- package/lib/connection-options.d.ts.map +1 -1
- package/lib/csfle-collection-tracker.d.ts +41 -0
- package/lib/csfle-collection-tracker.d.ts.map +1 -1
- package/lib/csfle-collection-tracker.js +43 -0
- package/lib/csfle-collection-tracker.js.map +1 -1
- package/lib/data-service.d.ts +386 -0
- package/lib/data-service.d.ts.map +1 -1
- package/lib/data-service.js +161 -14
- package/lib/data-service.js.map +1 -1
- package/lib/index-detail-helper.d.ts +1 -1
- package/lib/index-detail-helper.d.ts.map +1 -1
- package/lib/index-detail-helper.js +1 -0
- package/lib/index-detail-helper.js.map +1 -1
- package/lib/instance-detail-helper.js +19 -0
- package/lib/instance-detail-helper.js.map +1 -1
- package/lib/run-command.d.ts +25 -0
- package/lib/run-command.d.ts.map +1 -1
- package/lib/run-command.js +23 -1
- package/lib/run-command.js.map +1 -1
- package/package.json +13 -13
|
@@ -16,20 +16,24 @@ const run_command_1 = require("./run-command");
|
|
|
16
16
|
const logger_1 = require("./logger");
|
|
17
17
|
const debug = logger_1.debug.extend('compass-connect');
|
|
18
18
|
exports.createClonedClient = Symbol('createClonedClient');
|
|
19
|
+
// Return an ALLOWED_HOSTS value that matches the hosts listed in the connection
|
|
20
|
+
// string, including possible SRV "sibling" domains.
|
|
19
21
|
function matchingAllowedHosts(connectionOptions) {
|
|
20
22
|
const connectionString = new mongodb_connection_string_url_1.default(connectionOptions.connectionString, { looseValidation: true });
|
|
21
23
|
const suffixes = connectionString.hosts.map((hostStr) => {
|
|
24
|
+
// eslint-disable-next-line
|
|
22
25
|
const { host } = hostStr.match(/^(?<host>.+?)(?<port>:[^:\]\[]+)?$/)
|
|
23
26
|
?.groups;
|
|
24
27
|
if (host.startsWith('[') && host.endsWith(']')) {
|
|
25
|
-
return host.slice(1, -1);
|
|
28
|
+
return host.slice(1, -1); // IPv6
|
|
26
29
|
}
|
|
27
30
|
if (host.match(/^[0-9.]+$/)) {
|
|
28
|
-
return host;
|
|
31
|
+
return host; // IPv4
|
|
29
32
|
}
|
|
30
33
|
if (!host.includes('.') || !connectionString.isSRV) {
|
|
31
34
|
return host;
|
|
32
35
|
}
|
|
36
|
+
// An SRV record for foo.bar.net can resolve to any hosts that match `*.bar.net`
|
|
33
37
|
const parts = host.split('.');
|
|
34
38
|
parts[0] = '*';
|
|
35
39
|
return parts.join('.');
|
|
@@ -43,7 +47,7 @@ function prepareOIDCOptions({ connectionOptions, proxyOptions = {}, signal, reau
|
|
|
43
47
|
applyProxyToOIDC: false,
|
|
44
48
|
};
|
|
45
49
|
const allowedFlows = connectionOptions.oidc?.allowedFlows ?? ['auth-code'];
|
|
46
|
-
let isFirstAuthAttempt = true;
|
|
50
|
+
let isFirstAuthAttempt = true; // Don't need to prompt for re-auth on first attempt
|
|
47
51
|
options.oidc.allowedFlows = async function () {
|
|
48
52
|
if (!isFirstAuthAttempt) {
|
|
49
53
|
await reauthenticationHandler?.();
|
|
@@ -52,6 +56,8 @@ function prepareOIDCOptions({ connectionOptions, proxyOptions = {}, signal, reau
|
|
|
52
56
|
return allowedFlows;
|
|
53
57
|
};
|
|
54
58
|
if (connectionOptions.oidc?.enableUntrustedEndpoints) {
|
|
59
|
+
// Set the driver's `authMechanismProperties` (non-url) `ALLOWED_HOSTS` value
|
|
60
|
+
// to match the connection string hosts, including possible SRV "sibling" domains.
|
|
55
61
|
options.authMechanismProperties.ALLOWED_HOSTS =
|
|
56
62
|
matchingAllowedHosts(connectionOptions);
|
|
57
63
|
}
|
|
@@ -84,6 +90,14 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
84
90
|
...oidcOptions,
|
|
85
91
|
};
|
|
86
92
|
if (connectionOptions.lookup) {
|
|
93
|
+
// NB: This value is currently only passed through by compass-web in the
|
|
94
|
+
// browser environment as a custom way to pass extra metadata to the
|
|
95
|
+
// underlying socket implementation that works over the websocket protocol.
|
|
96
|
+
// Event though the type of `connectionOptions.lookup` is technically
|
|
97
|
+
// assignable to `options.lookup`, this method is not actually implementing
|
|
98
|
+
// the `dns.lookup` interface and lead to unexpected behavior if driver ever
|
|
99
|
+
// decides to use it before directly passing to the `socket.connect` method
|
|
100
|
+
// as an option.
|
|
87
101
|
options.lookup = connectionOptions.lookup;
|
|
88
102
|
}
|
|
89
103
|
if (options.autoEncryption && process.env.COMPASS_CRYPT_LIBRARY_PATH) {
|
|
@@ -95,7 +109,15 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
95
109
|
},
|
|
96
110
|
};
|
|
97
111
|
}
|
|
112
|
+
// If connectionOptions.sshTunnel is defined, open an ssh tunnel.
|
|
113
|
+
//
|
|
114
|
+
// If connectionOptions.sshTunnel is not defined, the tunnel
|
|
115
|
+
// will also be undefined.
|
|
98
116
|
const tunnel = (0, devtools_proxy_support_1.createSocks5Tunnel)((0, ssh_tunnel_helpers_1.getTunnelOptions)(connectionOptions, proxyOptions), 'generate-credentials', 'mongodb://');
|
|
117
|
+
// TODO: Not urgent, but it might be helpful to properly implement redaction
|
|
118
|
+
// and then actually log this to the log file, it's been helpful for debugging
|
|
119
|
+
// e2e tests for sure
|
|
120
|
+
// console.log({tunnel, tunnelOptions: getTunnelOptions(connectionOptions), connectionOptions, oidcOptions})
|
|
99
121
|
if (tunnel && logger)
|
|
100
122
|
(0, devtools_proxy_support_1.hookLogger)(tunnel.logger, logger, 'compass-tunnel');
|
|
101
123
|
const tunnelForwardingErrors = [];
|
|
@@ -117,6 +139,8 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
117
139
|
(0, devtools_connect_1.hookLogger)(connectLogger, logger, 'compass', redact_1.redactConnectionString);
|
|
118
140
|
}
|
|
119
141
|
async function connectSingleClient(overrideOptions) {
|
|
142
|
+
// Deep clone because of https://jira.mongodb.org/browse/NODE-4124,
|
|
143
|
+
// the options here are being mutated.
|
|
120
144
|
const connectOptions = lodash_1.default.cloneDeep({ ...options, ...overrideOptions });
|
|
121
145
|
const { client, state } = await (0, devtools_connect_1.connectMongoClient)(url, connectOptions, connectLogger, CompassMongoClient);
|
|
122
146
|
await (0, run_command_1.runCommand)(client.db('admin'), { ping: 1 });
|
|
@@ -138,6 +162,11 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
138
162
|
let state;
|
|
139
163
|
try {
|
|
140
164
|
debug('waiting for MongoClient to connect ...');
|
|
165
|
+
// Create one or two clients, depending on whether CSFLE
|
|
166
|
+
// is enabled. If it is, create one for interacting with
|
|
167
|
+
// server metadata (e.g. build info, instance data, etc.)
|
|
168
|
+
// and one for interacting with the actual CRUD data.
|
|
169
|
+
// If CSFLE is disabled, use a single client for both cases.
|
|
141
170
|
[metadataClient, crudClient, state] = await Promise.race([
|
|
142
171
|
(async () => {
|
|
143
172
|
const { client: metadataClient, state } = await connectSingleClient({
|
|
@@ -145,8 +174,13 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
145
174
|
});
|
|
146
175
|
const parentHandlePromise = state.getStateShareServer();
|
|
147
176
|
parentHandlePromise.catch(() => {
|
|
177
|
+
/* handled below */
|
|
148
178
|
});
|
|
149
179
|
let crudClient;
|
|
180
|
+
// This used to happen in parallel, but since the introduction of OIDC connection
|
|
181
|
+
// state needs to be shared and managed on the longest-lived client instance,
|
|
182
|
+
// so we need to use the DevtoolsConnectionState instance created for the metadata
|
|
183
|
+
// client here.
|
|
150
184
|
if (options.autoEncryption) {
|
|
151
185
|
try {
|
|
152
186
|
crudClient = (await connectSingleClient({
|
|
@@ -159,6 +193,7 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
159
193
|
}
|
|
160
194
|
}
|
|
161
195
|
try {
|
|
196
|
+
// Make sure that if this failed, we clean up properly.
|
|
162
197
|
await parentHandlePromise;
|
|
163
198
|
}
|
|
164
199
|
catch (err) {
|
|
@@ -166,10 +201,12 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
166
201
|
await crudClient?.close();
|
|
167
202
|
throw err;
|
|
168
203
|
}
|
|
204
|
+
// Return the parentHandle here so that it's included in the options that
|
|
205
|
+
// are passed to compass-shell.
|
|
169
206
|
return [metadataClient, crudClient, state];
|
|
170
207
|
})(),
|
|
171
208
|
(0, ssh_tunnel_helpers_1.waitForTunnelError)(tunnel),
|
|
172
|
-
]);
|
|
209
|
+
]); // waitForTunnel always throws, never resolves
|
|
173
210
|
options.parentHandle = await state.getStateShareServer();
|
|
174
211
|
return [
|
|
175
212
|
metadataClient,
|
|
@@ -187,6 +224,7 @@ async function connectMongoClientDataService({ connectionOptions, proxyOptions =
|
|
|
187
224
|
crudClient?.close(),
|
|
188
225
|
metadataClient?.close(),
|
|
189
226
|
]).catch(() => {
|
|
227
|
+
/* ignore errors */
|
|
190
228
|
});
|
|
191
229
|
if (tunnelForwardingErrors.length > 0) {
|
|
192
230
|
err.message = `${err.message} [SSH Tunnel errors: ${tunnelForwardingErrors.map((err) => err.message)}]`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-mongo-client.js","sourceRoot":"","sources":["../src/connect-mongo-client.ts"],"names":[],"mappings":";;;;;;AACA,qCAAsC;AACtC,mEAA8E;AAK9E,+EAI4C;AAK5C,oDAAkC;AAClC,kGAA6D;AAC7D,oDAAuB;AAEvB,qCAA2E;AAE3E,6DAA4E;AAC5E,+CAA2C;AAE3C,qCAA2C;AAE3C,MAAM,KAAK,GAAG,cAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAElC,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"connect-mongo-client.js","sourceRoot":"","sources":["../src/connect-mongo-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,8 @@ class ConnectionAttempt {
|
|
|
69
69
|
this._logger.debug('Connection Attempt', mongoLogId(1001000281), 'close requested', 'disconnected from connection attempt');
|
|
70
70
|
}
|
|
71
71
|
catch (err) {
|
|
72
|
+
// When the disconnect fails, we free up the ui and we can
|
|
73
|
+
// silently wait for the timeout if it's still attempting to connect.
|
|
72
74
|
this._logger.debug('Connection Attempt', mongoLogId(1001000283), 'close requested', 'error while disconnecting from connection attempt', err);
|
|
73
75
|
}
|
|
74
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-attempt.js","sourceRoot":"","sources":["../src/connection-attempt.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAyE;AACzE,iEAA2D;AAG3D,wDAAgC;AAKhC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,8BAAY,EAAC,oBAAoB,CAAC,CAAC;AAE1D,SAAS,kCAAkC,CAAC,GAAU;IACpD,OAAO,GAAG,EAAE,IAAI,KAAK,0BAA0B,CAAC;AAClD,CAAC;AAED,MAAa,iBAAiB;IAQ5B,YAAY,EACV,SAAS,EACT,MAAM,EACN,YAAY,GAKb;QAdD,YAAO,GAAG,KAAK,CAAC;QAEhB,iBAAY,GAAuB,IAAI,CAAC;QAatC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,iBAAoC;QAC1C,OAAO,IAAA,6BAAa,EAClB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAChC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAC7B,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,IAAA,6BAAa,EAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,iBAAoC;QAEpC,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO;SACR;QAED,IAAI;YACF,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;gBACxC,iBAAiB;gBACjB,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM;gBACpC,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,YAAY,EAAE,IAAI,CAAC,aAAa;aACjC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,kCAAkC,CAAC,GAAY,CAAC,EAAE;gBACpD,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,oBAAoB,EACpB,UAAU,CAAC,UAAa,CAAC,EACzB,SAAS,EACT,wCAAwC,EACxC,GAAG,CACJ,CAAC;gBACF,OAAO;aACR;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,oBAAoB,EACpB,UAAU,CAAC,UAAa,CAAC,EACzB,SAAS,EACT,2BAA2B,EAC3B,GAAG,CACJ,CAAC;YACF,MAAM,GAAG,CAAC;SACX;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,oBAAoB,EACpB,UAAU,CAAC,UAAa,CAAC,EACzB,iBAAiB,EACjB,8BAA8B,CAC/B,CAAC;YACF,OAAO;SACR;QAED,IAAI;YACF,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,oBAAoB,EACpB,UAAU,CAAC,UAAa,CAAC,EACzB,iBAAiB,EACjB,sCAAsC,CACvC,CAAC;SACH;QAAC,OAAO,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"connection-attempt.js","sourceRoot":"","sources":["../src/connection-attempt.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,32 @@ export type OIDCOptions = Omit<NonNullable<DevtoolsConnectOptions['oidc']>, 'not
|
|
|
7
7
|
allowedFlows?: ExtractArrayEntryType<NonNullable<DevtoolsConnectOptions['oidc']>['allowedFlows']>[];
|
|
8
8
|
};
|
|
9
9
|
export interface ConnectionOptions {
|
|
10
|
+
/**
|
|
11
|
+
* The connection string to connect to the MongoDB instance including all options set by the user.
|
|
12
|
+
*/
|
|
10
13
|
connectionString: string;
|
|
14
|
+
/**
|
|
15
|
+
* If present the connection should be established via an SSH tunnel according to the provided SSH options.
|
|
16
|
+
*/
|
|
11
17
|
sshTunnel?: ConnectionSshOptions;
|
|
18
|
+
/**
|
|
19
|
+
* Alternative to Socks5 proxying / SSH tunnel: If set, inherit Compass's application-level
|
|
20
|
+
* proxy settings.
|
|
21
|
+
*/
|
|
12
22
|
useApplicationLevelProxy?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* If present the connection should use OIDC authentication.
|
|
25
|
+
*/
|
|
13
26
|
oidc?: OIDCOptions;
|
|
27
|
+
/**
|
|
28
|
+
* Options related to client-side field-level encryption.
|
|
29
|
+
*/
|
|
14
30
|
fleOptions?: ConnectionFleOptions;
|
|
31
|
+
/**
|
|
32
|
+
* Optional, a real net / tls connection callback function option that is only
|
|
33
|
+
* used in Compass as a way to pass extra metadata about an Atlas cluster when
|
|
34
|
+
* connecting in the browser environment through the websocket
|
|
35
|
+
*/
|
|
15
36
|
lookup?: () => {
|
|
16
37
|
wsURL: string;
|
|
17
38
|
projectId?: string;
|
|
@@ -20,15 +41,39 @@ export interface ConnectionOptions {
|
|
|
20
41
|
};
|
|
21
42
|
}
|
|
22
43
|
export interface ConnectionFleOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Whether to store KMS credentials to disk or not.
|
|
46
|
+
*/
|
|
23
47
|
storeCredentials: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Encryption options passed to the driver verbatim.
|
|
50
|
+
*/
|
|
24
51
|
autoEncryption?: AutoEncryptionOptions;
|
|
25
52
|
}
|
|
26
53
|
export interface ConnectionSshOptions {
|
|
54
|
+
/**
|
|
55
|
+
* Host to establish SSH tunnel to.
|
|
56
|
+
*/
|
|
27
57
|
host: string;
|
|
58
|
+
/**
|
|
59
|
+
* Port to establish SSH tunnel to.
|
|
60
|
+
*/
|
|
28
61
|
port: number;
|
|
62
|
+
/**
|
|
63
|
+
* Username of the SSH user.
|
|
64
|
+
*/
|
|
29
65
|
username: string;
|
|
66
|
+
/**
|
|
67
|
+
* Password for SSH authentication.
|
|
68
|
+
*/
|
|
30
69
|
password?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Private key file to use as SSH identity.
|
|
72
|
+
*/
|
|
31
73
|
identityKeyFile?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Password for protected `identitiyFile`.
|
|
76
|
+
*/
|
|
32
77
|
identityKeyPassphrase?: string;
|
|
33
78
|
}
|
|
34
79
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-options.d.ts","sourceRoot":"","sources":["../src/connection-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,KAAK,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,WAAW,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,EAC3C,kBAAkB,GAAG,QAAQ,GAAG,cAAc,CAC/C,GAAG;IAGF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAInC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,YAAY,CAAC,EAAE,qBAAqB,CAClC,WAAW,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAC5D,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,WAAW,iBAAiB;
|
|
1
|
+
{"version":3,"file":"connection-options.d.ts","sourceRoot":"","sources":["../src/connection-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,KAAK,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,WAAW,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,EAC3C,kBAAkB,GAAG,QAAQ,GAAG,cAAc,CAC/C,GAAG;IAGF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAInC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,YAAY,CAAC,EAAE,qBAAqB,CAClC,WAAW,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAC5D,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;IAEjC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC"}
|
|
@@ -2,13 +2,54 @@ import type { MongoClient, Document } from 'mongodb';
|
|
|
2
2
|
import type { DataService } from './data-service';
|
|
3
3
|
import type { CollectionInfo, CollectionInfoNameOnly } from './run-command';
|
|
4
4
|
import type { UnboundDataServiceImplLogger } from './logger';
|
|
5
|
+
/**
|
|
6
|
+
* A list of field paths for a document.
|
|
7
|
+
* For example, ['a', 'b'] refers to the field b of the nested document a.
|
|
8
|
+
* This is used rather than dot-style `a.b` notation to disambiguate
|
|
9
|
+
* cases in which field names contain a literal `.` character.
|
|
10
|
+
*/
|
|
5
11
|
type FieldPath = string[];
|
|
12
|
+
/**
|
|
13
|
+
* A description of the list of encrypted fields for a given collection.
|
|
14
|
+
* Equality-searchable fields are handled separately since they require
|
|
15
|
+
* special treatments in some cases.
|
|
16
|
+
*/
|
|
6
17
|
export interface CSFLEEncryptedFieldsSet {
|
|
7
18
|
readonly encryptedFields: FieldPath[];
|
|
8
19
|
readonly equalityQueryableEncryptedFields: FieldPath[];
|
|
9
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Helper for ensuring that all fields that were decrypted when
|
|
23
|
+
* they were read from the server are also written back as encrypted.
|
|
24
|
+
*/
|
|
10
25
|
export interface CSFLECollectionTracker {
|
|
26
|
+
/**
|
|
27
|
+
* Returns whether performing an update (or replacement) of
|
|
28
|
+
* `originalDocument` from the collection `ns` is allowable
|
|
29
|
+
* with regards to re-encrypting fields that were originally
|
|
30
|
+
* decrypted.
|
|
31
|
+
*
|
|
32
|
+
* The original documents **must** have been received from the
|
|
33
|
+
* server or generated from a HadronDocument instance that
|
|
34
|
+
* was created based on a document received from the server.
|
|
35
|
+
* This is required for ensuring that the tracker properly
|
|
36
|
+
* recognizes fields that were read as decrypted fields.
|
|
37
|
+
*
|
|
38
|
+
* @param ns A MongoDB `database.collection` namespace.
|
|
39
|
+
* @param originalDocument The original document that was received from the server.
|
|
40
|
+
*/
|
|
11
41
|
isUpdateAllowed(ns: string, originalDocument: Document): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Returns whether a collection is known to have a schema
|
|
44
|
+
* description that would prevent unintentional inserts
|
|
45
|
+
* of unencrypted data.
|
|
46
|
+
*
|
|
47
|
+
* This includes the case in which any server schema is
|
|
48
|
+
* present, not just one that indicates that there are fields
|
|
49
|
+
* which should be encrypted.
|
|
50
|
+
*
|
|
51
|
+
* @param ns A MongoDB `database.collection` namespace.
|
|
52
|
+
*/
|
|
12
53
|
knownSchemaForCollection(ns: string): Promise<{
|
|
13
54
|
hasSchema: boolean;
|
|
14
55
|
encryptedFields: CSFLEEncryptedFieldsSet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csfle-collection-tracker.d.ts","sourceRoot":"","sources":["../src/csfle-collection-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,QAAQ,EAET,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EAEvB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"csfle-collection-tracker.d.ts","sourceRoot":"","sources":["../src/csfle-collection-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,9 @@ class CSFLEEncryptedFieldsSetImpl {
|
|
|
22
22
|
addField(path, equalityQueryable) {
|
|
23
23
|
const existingField = this._encryptedFields.find((field) => lodash_1.default.isEqual(field.path, path));
|
|
24
24
|
if (existingField) {
|
|
25
|
+
// Deduplicate field entries. If there already is one for this field,
|
|
26
|
+
// only make sure that the `equalityQueryable` attributes match.
|
|
27
|
+
// If they don't, assume that the field is not equality-queryable.
|
|
25
28
|
existingField.equalityQueryable &&= equalityQueryable;
|
|
26
29
|
}
|
|
27
30
|
else {
|
|
@@ -55,10 +58,12 @@ class CSFLEEncryptedFieldsSetImpl {
|
|
|
55
58
|
return ret;
|
|
56
59
|
}
|
|
57
60
|
}
|
|
61
|
+
// Fetch a list of encrypted fields from a JSON schema document.
|
|
58
62
|
function extractEncryptedFieldsFromSchema(schema) {
|
|
59
63
|
let ret = new CSFLEEncryptedFieldsSetImpl();
|
|
60
64
|
if (schema?.encrypt) {
|
|
61
65
|
const algorithm = schema?.encrypt?.algorithm;
|
|
66
|
+
// Deterministic encryption in CSFLE = Equality-searchable
|
|
62
67
|
return ret.addField([], algorithm === 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic');
|
|
63
68
|
}
|
|
64
69
|
for (const [key, subschema] of Object.entries(schema?.properties ?? {})) {
|
|
@@ -67,6 +72,7 @@ function extractEncryptedFieldsFromSchema(schema) {
|
|
|
67
72
|
}
|
|
68
73
|
return ret;
|
|
69
74
|
}
|
|
75
|
+
// Fetch a list of encrypted fields from a QE EncryptedFieldConfig document.
|
|
70
76
|
function extractEncryptedFieldsFromEncryptedFieldsConfig(encryptedFields) {
|
|
71
77
|
const fields = encryptedFields?.fields ?? [];
|
|
72
78
|
const ret = new CSFLEEncryptedFieldsSetImpl();
|
|
@@ -79,14 +85,18 @@ function extractEncryptedFieldsFromEncryptedFieldsConfig(encryptedFields) {
|
|
|
79
85
|
}
|
|
80
86
|
return ret;
|
|
81
87
|
}
|
|
88
|
+
// Fetch a list of encrypted fields based on client-side driver options.
|
|
82
89
|
function extractEncrytedFieldFromAutoEncryptionOptions(ns, autoEncryption) {
|
|
83
90
|
return CSFLEEncryptedFieldsSetImpl.merge(extractEncryptedFieldsFromSchema(autoEncryption.schemaMap?.[ns]), extractEncryptedFieldsFromEncryptedFieldsConfig(autoEncryption?.encryptedFieldsMap?.[ns]));
|
|
84
91
|
}
|
|
92
|
+
// Fetch a list of encrypted fields based on the server-side collection info.
|
|
85
93
|
function extractEncryptedFieldsFromListCollectionsResult(options) {
|
|
86
94
|
const schema = options?.validator?.$jsonSchema;
|
|
87
95
|
const encryptedFieldsConfig = options?.encryptedFields;
|
|
88
96
|
return CSFLEEncryptedFieldsSetImpl.merge(extractEncryptedFieldsFromSchema(schema), extractEncryptedFieldsFromEncryptedFieldsConfig(encryptedFieldsConfig));
|
|
89
97
|
}
|
|
98
|
+
// Fetch a list of encrypted fields based on a document received from the server.
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
100
|
function extractEncryptedFieldsFromDocument(doc) {
|
|
91
101
|
const decryptedFields = (doc?.[Symbol.for('@@mdb.decryptedKeys')] ?? []).map((field) => [field]);
|
|
92
102
|
for (const [key, value] of Object.entries(doc)) {
|
|
@@ -111,15 +121,24 @@ class CSFLECollectionTrackerImpl {
|
|
|
111
121
|
const { autoEncrypter } = this._crudClient;
|
|
112
122
|
if (autoEncrypter) {
|
|
113
123
|
this._logger?.info('COMPASS-DATA-SERVICE', (0, logger_1.mongoLogId)(1001000118), 'CSFLECollectionTracker', 'Hooking AutoEncrypter metaDataClient property');
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
114
125
|
autoEncrypter._metaDataClient = this._createHookedMetadataClient(autoEncrypter._metaDataClient);
|
|
115
126
|
}
|
|
116
127
|
}
|
|
117
128
|
async isUpdateAllowed(ns, originalDocument) {
|
|
118
129
|
const originalDocEncryptedFields = extractEncryptedFieldsFromDocument(originalDocument);
|
|
119
130
|
if (originalDocEncryptedFields.length === 0) {
|
|
131
|
+
// Shortcut: If no fields were encrypted when we got them
|
|
132
|
+
// from the server, then we also do not need to worry
|
|
133
|
+
// about writing them back unencrypted.
|
|
120
134
|
return true;
|
|
121
135
|
}
|
|
122
136
|
const { encryptedFields } = await this.knownSchemaForCollection(ns);
|
|
137
|
+
// Updates are allowed if there is a guarantee that all fields that
|
|
138
|
+
// were decrypted in the original document will also be written back
|
|
139
|
+
// as encrypted fields. To that end, the server or client configuration
|
|
140
|
+
// must contain entries that are picked up by libmongocrypt as indicators
|
|
141
|
+
// for encrypted fields.
|
|
123
142
|
for (const originalDocPath of originalDocEncryptedFields) {
|
|
124
143
|
if (!CSFLEEncryptedFieldsSetImpl.isEncryptedField(encryptedFields, originalDocPath)) {
|
|
125
144
|
return false;
|
|
@@ -134,6 +153,7 @@ class CSFLECollectionTrackerImpl {
|
|
|
134
153
|
return { hasSchema, encryptedFields };
|
|
135
154
|
}
|
|
136
155
|
_processClientSchemaDefinitions() {
|
|
156
|
+
// Process client-side options available at instantiation time.
|
|
137
157
|
const { autoEncryption } = this._crudClient.options;
|
|
138
158
|
for (const ns of [
|
|
139
159
|
...Object.keys(autoEncryption?.schemaMap ?? {}),
|
|
@@ -152,6 +172,11 @@ class CSFLECollectionTrackerImpl {
|
|
|
152
172
|
!info.lastUpdated ||
|
|
153
173
|
isOlderThan1Minute(info.lastUpdated)) {
|
|
154
174
|
this._logger?.info('COMPASS-DATA-SERVICE', (0, logger_1.mongoLogId)(1001000120), 'CSFLECollectionTracker', 'Refreshing listCollections cache', { ns });
|
|
175
|
+
// Let the data service fetch new collection infos.
|
|
176
|
+
// We installed a listener earlier which picks up the results,
|
|
177
|
+
// and additionally also fetches the results from unrelated
|
|
178
|
+
// listCollections calls so that explicitly fetching them
|
|
179
|
+
// becomes necessary less often.
|
|
155
180
|
await this._dataService.listCollections(parsedNs.database, {
|
|
156
181
|
name: parsedNs.collection,
|
|
157
182
|
});
|
|
@@ -159,6 +184,7 @@ class CSFLECollectionTrackerImpl {
|
|
|
159
184
|
return info;
|
|
160
185
|
}
|
|
161
186
|
_getCSFLECollectionInfo(ns) {
|
|
187
|
+
// Look up the internally stored CSFLE collection info for a specific namespace.
|
|
162
188
|
const existing = this._nsToInfo.get(ns);
|
|
163
189
|
if (existing)
|
|
164
190
|
return existing;
|
|
@@ -169,12 +195,24 @@ class CSFLECollectionTrackerImpl {
|
|
|
169
195
|
updateCollectionInfo(ns, result) {
|
|
170
196
|
this._logger?.info('COMPASS-DATA-SERVICE', (0, logger_1.mongoLogId)(1001000121), 'CSFLECollectionTracker', 'Processing listCollections update', { ns });
|
|
171
197
|
const info = this._getCSFLECollectionInfo(ns);
|
|
198
|
+
// Store the updated list of encrypted fields.
|
|
199
|
+
// This list can be empty if no server-side validation existed or was removed.
|
|
172
200
|
info.serverEnforcedEncryptedFields =
|
|
173
201
|
extractEncryptedFieldsFromListCollectionsResult(result.options);
|
|
174
202
|
info.hasServerSchema = !!result.options?.validator?.$jsonSchema;
|
|
175
203
|
info.lastUpdated = new Date();
|
|
176
204
|
}
|
|
177
205
|
_createHookedMetadataClient(wrappedClient) {
|
|
206
|
+
// The AutoEncrypter instance used by the MongoClient will
|
|
207
|
+
// use listCollections to look up metadata for a given collection.
|
|
208
|
+
// We hook into this process to verify that this listCollections
|
|
209
|
+
// call does not return looser restrictions than those that
|
|
210
|
+
// Compass knows about and relies on.
|
|
211
|
+
// This listCollections call will only be made in a specific way,
|
|
212
|
+
// with specific arguments. If this ever changes at some point,
|
|
213
|
+
// we may need to work out e.g. a good semi-official hook with the
|
|
214
|
+
// driver team, similar to what we have for the @@mdb.decryptedFields
|
|
215
|
+
// functionality, but currently no such changes are planned or expected.
|
|
178
216
|
return {
|
|
179
217
|
db: (dbName) => {
|
|
180
218
|
return {
|
|
@@ -200,6 +238,9 @@ class CSFLECollectionTrackerImpl {
|
|
|
200
238
|
}
|
|
201
239
|
_checkListCollectionsForLibmongocryptResult(dbName, filter, collectionInfos) {
|
|
202
240
|
if (typeof filter?.name !== 'string' || collectionInfos.length > 1) {
|
|
241
|
+
// This is an assertion more than an actual error condition.
|
|
242
|
+
// It ensures that we're only getting listCollections requests
|
|
243
|
+
// in the format that we expect them to come in.
|
|
203
244
|
return new Error(`[Compass] Unexpected listCollections request on '${dbName}' with name: '${filter?.name}'`);
|
|
204
245
|
}
|
|
205
246
|
const ns = `${dbName}.${filter.name}`;
|
|
@@ -212,6 +253,8 @@ class CSFLECollectionTrackerImpl {
|
|
|
212
253
|
}
|
|
213
254
|
const [info] = collectionInfos;
|
|
214
255
|
if (filter.name !== info.name) {
|
|
256
|
+
// Also just a consistency check to make sure that things
|
|
257
|
+
// didn't go *terribly* wrong somewhere.
|
|
215
258
|
return new Error(`[Compass] Unexpected listCollections name mismatch: got ${info.name}, expected ${filter.name}`);
|
|
216
259
|
}
|
|
217
260
|
const newInfo = extractEncryptedFieldsFromListCollectionsResult(info.options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csfle-collection-tracker.js","sourceRoot":"","sources":["../src/csfle-collection-tracker.ts"],"names":[],"mappings":";;;;;;AAYA,4DAAwC;AACxC,oDAAuB;AAEvB,qCAAsC;AA+DtC,MAAM,2BAA2B;IAAjC;QACE,qBAAgB,GAAsD,EAAE,CAAC;IAoE3E,CAAC;IAlEC,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,gCAAgC;QAClC,OAAO,IAAI,CAAC,gBAAgB;aACzB,MAAM,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC;aACpD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,IAAyB,EAAE,iBAA0B;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzD,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAC5B,CAAC;QACF,IAAI,aAAa,EAAE;
|
|
1
|
+
{"version":3,"file":"csfle-collection-tracker.js","sourceRoot":"","sources":["../src/csfle-collection-tracker.ts"],"names":[],"mappings":"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"}
|