mongodb 5.0.1 → 5.2.0
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/README.md +25 -22
- package/lib/bson.js +3 -1
- package/lib/bson.js.map +1 -1
- package/lib/change_stream.js +3 -2
- package/lib/change_stream.js.map +1 -1
- package/lib/cmap/auth/auth_provider.js +21 -10
- package/lib/cmap/auth/auth_provider.js.map +1 -1
- package/lib/cmap/auth/gssapi.js +71 -116
- package/lib/cmap/auth/gssapi.js.map +1 -1
- package/lib/cmap/auth/mongo_credentials.js +17 -0
- package/lib/cmap/auth/mongo_credentials.js.map +1 -1
- package/lib/cmap/auth/mongocr.js +20 -29
- package/lib/cmap/auth/mongocr.js.map +1 -1
- package/lib/cmap/auth/mongodb_aws.js +126 -140
- package/lib/cmap/auth/mongodb_aws.js.map +1 -1
- package/lib/cmap/auth/mongodb_oidc/aws_service_workflow.js +28 -0
- package/lib/cmap/auth/mongodb_oidc/aws_service_workflow.js.map +1 -0
- package/lib/cmap/auth/mongodb_oidc/callback_workflow.js +178 -0
- package/lib/cmap/auth/mongodb_oidc/callback_workflow.js.map +1 -0
- package/lib/cmap/auth/mongodb_oidc/service_workflow.js +41 -0
- package/lib/cmap/auth/mongodb_oidc/service_workflow.js.map +1 -0
- package/lib/cmap/auth/mongodb_oidc/token_entry_cache.js +115 -0
- package/lib/cmap/auth/mongodb_oidc/token_entry_cache.js.map +1 -0
- package/lib/cmap/auth/mongodb_oidc/workflow.js +3 -0
- package/lib/cmap/auth/mongodb_oidc/workflow.js.map +1 -0
- package/lib/cmap/auth/mongodb_oidc.js +62 -0
- package/lib/cmap/auth/mongodb_oidc.js.map +1 -0
- package/lib/cmap/auth/plain.js +4 -5
- package/lib/cmap/auth/plain.js.map +1 -1
- package/lib/cmap/auth/providers.js +4 -1
- package/lib/cmap/auth/providers.js.map +1 -1
- package/lib/cmap/auth/scram.js +45 -73
- package/lib/cmap/auth/scram.js.map +1 -1
- package/lib/cmap/auth/x509.js +8 -11
- package/lib/cmap/auth/x509.js.map +1 -1
- package/lib/cmap/command_monitoring_events.js +8 -5
- package/lib/cmap/command_monitoring_events.js.map +1 -1
- package/lib/cmap/commands.js +9 -1
- package/lib/cmap/commands.js.map +1 -1
- package/lib/cmap/connect.js +72 -86
- package/lib/cmap/connect.js.map +1 -1
- package/lib/cmap/connection.js +68 -74
- package/lib/cmap/connection.js.map +1 -1
- package/lib/cmap/connection_pool.js +51 -13
- package/lib/cmap/connection_pool.js.map +1 -1
- package/lib/cmap/message_stream.js.map +1 -1
- package/lib/cmap/wire_protocol/shared.js +1 -16
- package/lib/cmap/wire_protocol/shared.js.map +1 -1
- package/lib/collection.js +10 -10
- package/lib/connection_string.js +47 -33
- package/lib/connection_string.js.map +1 -1
- package/lib/cursor/abstract_cursor.js +13 -7
- package/lib/cursor/abstract_cursor.js.map +1 -1
- package/lib/cursor/find_cursor.js +1 -1
- package/lib/db.js +3 -2
- package/lib/db.js.map +1 -1
- package/lib/error.js +2 -1
- package/lib/error.js.map +1 -1
- package/lib/mongo_client.js +22 -2
- package/lib/mongo_client.js.map +1 -1
- package/lib/mongo_logger.js +17 -1
- package/lib/mongo_logger.js.map +1 -1
- package/lib/operations/aggregate.js +4 -1
- package/lib/operations/aggregate.js.map +1 -1
- package/lib/operations/create_collection.js +1 -0
- package/lib/operations/create_collection.js.map +1 -1
- package/lib/operations/execute_operation.js +8 -27
- package/lib/operations/execute_operation.js.map +1 -1
- package/lib/operations/find.js +3 -2
- package/lib/operations/find.js.map +1 -1
- package/lib/operations/indexes.js +2 -1
- package/lib/operations/indexes.js.map +1 -1
- package/lib/operations/list_collections.js +2 -1
- package/lib/operations/list_collections.js.map +1 -1
- package/lib/read_concern.js +1 -1
- package/lib/read_preference.js +2 -2
- package/lib/sdam/monitor.js +1 -0
- package/lib/sdam/monitor.js.map +1 -1
- package/lib/sdam/server.js +4 -2
- package/lib/sdam/server.js.map +1 -1
- package/lib/sdam/topology.js +3 -26
- package/lib/sdam/topology.js.map +1 -1
- package/lib/sessions.js +2 -1
- package/lib/sessions.js.map +1 -1
- package/lib/utils.js +15 -70
- package/lib/utils.js.map +1 -1
- package/lib/write_concern.js +1 -1
- package/mongodb.d.ts +137 -68
- package/package.json +30 -30
- package/src/bson.ts +3 -1
- package/src/bulk/common.ts +1 -1
- package/src/change_stream.ts +16 -8
- package/src/cmap/auth/auth_provider.ts +29 -16
- package/src/cmap/auth/gssapi.ts +102 -149
- package/src/cmap/auth/mongo_credentials.ts +47 -1
- package/src/cmap/auth/mongocr.ts +31 -36
- package/src/cmap/auth/mongodb_aws.ts +167 -189
- package/src/cmap/auth/mongodb_oidc/aws_service_workflow.ts +26 -0
- package/src/cmap/auth/mongodb_oidc/callback_workflow.ts +259 -0
- package/src/cmap/auth/mongodb_oidc/service_workflow.ts +47 -0
- package/src/cmap/auth/mongodb_oidc/token_entry_cache.ts +166 -0
- package/src/cmap/auth/mongodb_oidc/workflow.ts +21 -0
- package/src/cmap/auth/mongodb_oidc.ts +123 -0
- package/src/cmap/auth/plain.ts +6 -6
- package/src/cmap/auth/providers.ts +5 -2
- package/src/cmap/auth/scram.ts +56 -90
- package/src/cmap/auth/x509.ts +12 -18
- package/src/cmap/command_monitoring_events.ts +5 -2
- package/src/cmap/commands.ts +11 -1
- package/src/cmap/connect.ts +90 -114
- package/src/cmap/connection.ts +92 -90
- package/src/cmap/connection_pool.ts +77 -16
- package/src/cmap/message_stream.ts +0 -2
- package/src/cmap/wire_protocol/compression.ts +1 -1
- package/src/cmap/wire_protocol/shared.ts +1 -23
- package/src/collection.ts +11 -11
- package/src/connection_string.ts +52 -35
- package/src/cursor/abstract_cursor.ts +13 -6
- package/src/cursor/change_stream_cursor.ts +5 -5
- package/src/cursor/find_cursor.ts +1 -1
- package/src/db.ts +3 -2
- package/src/deps.ts +56 -38
- package/src/error.ts +3 -2
- package/src/index.ts +7 -0
- package/src/mongo_client.ts +35 -10
- package/src/mongo_logger.ts +20 -2
- package/src/mongo_types.ts +4 -3
- package/src/operations/aggregate.ts +4 -2
- package/src/operations/create_collection.ts +2 -1
- package/src/operations/execute_operation.ts +8 -25
- package/src/operations/find.ts +13 -4
- package/src/operations/find_and_modify.ts +4 -4
- package/src/operations/indexes.ts +12 -4
- package/src/operations/list_collections.ts +11 -3
- package/src/operations/set_profiling_level.ts +1 -1
- package/src/operations/stats.ts +1 -1
- package/src/read_concern.ts +2 -2
- package/src/read_preference.ts +3 -3
- package/src/sdam/common.ts +2 -2
- package/src/sdam/monitor.ts +1 -0
- package/src/sdam/server.ts +4 -1
- package/src/sdam/topology.ts +4 -33
- package/src/sessions.ts +2 -1
- package/src/transactions.ts +1 -1
- package/src/utils.ts +24 -98
- package/src/write_concern.ts +1 -1
package/lib/cmap/auth/mongocr.js
CHANGED
|
@@ -6,38 +6,29 @@ const error_1 = require("../../error");
|
|
|
6
6
|
const utils_1 = require("../../utils");
|
|
7
7
|
const auth_provider_1 = require("./auth_provider");
|
|
8
8
|
class MongoCR extends auth_provider_1.AuthProvider {
|
|
9
|
-
auth(authContext
|
|
9
|
+
async auth(authContext) {
|
|
10
10
|
const { connection, credentials } = authContext;
|
|
11
11
|
if (!credentials) {
|
|
12
|
-
|
|
12
|
+
throw new error_1.MongoMissingCredentialsError('AuthContext must provide credentials.');
|
|
13
13
|
}
|
|
14
|
-
const username = credentials
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
const authenticateCommand = {
|
|
34
|
-
authenticate: 1,
|
|
35
|
-
user: username,
|
|
36
|
-
nonce,
|
|
37
|
-
key
|
|
38
|
-
};
|
|
39
|
-
connection.command((0, utils_1.ns)(`${source}.$cmd`), authenticateCommand, undefined, callback);
|
|
40
|
-
});
|
|
14
|
+
const { username, password, source } = credentials;
|
|
15
|
+
const { nonce } = await connection.commandAsync((0, utils_1.ns)(`${source}.$cmd`), { getnonce: 1 }, undefined);
|
|
16
|
+
const hashPassword = crypto
|
|
17
|
+
.createHash('md5')
|
|
18
|
+
.update(`${username}:mongo:${password}`, 'utf8')
|
|
19
|
+
.digest('hex');
|
|
20
|
+
// Final key
|
|
21
|
+
const key = crypto
|
|
22
|
+
.createHash('md5')
|
|
23
|
+
.update(`${nonce}${username}${hashPassword}`, 'utf8')
|
|
24
|
+
.digest('hex');
|
|
25
|
+
const authenticateCommand = {
|
|
26
|
+
authenticate: 1,
|
|
27
|
+
user: username,
|
|
28
|
+
nonce,
|
|
29
|
+
key
|
|
30
|
+
};
|
|
31
|
+
await connection.commandAsync((0, utils_1.ns)(`${source}.$cmd`), authenticateCommand, undefined);
|
|
41
32
|
}
|
|
42
33
|
}
|
|
43
34
|
exports.MongoCR = MongoCR;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongocr.js","sourceRoot":"","sources":["../../../src/cmap/auth/mongocr.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,uCAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"mongocr.js","sourceRoot":"","sources":["../../../src/cmap/auth/mongocr.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,uCAA2D;AAC3D,uCAAiC;AACjC,mDAA4D;AAE5D,MAAa,OAAQ,SAAQ,4BAAY;IAC9B,KAAK,CAAC,IAAI,CAAC,WAAwB;QAC1C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAChD,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,oCAA4B,CAAC,uCAAuC,CAAC,CAAC;SACjF;QAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;QAEnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC,YAAY,CAC7C,IAAA,UAAE,EAAC,GAAG,MAAM,OAAO,CAAC,EACpB,EAAE,QAAQ,EAAE,CAAC,EAAE,EACf,SAAS,CACV,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM;aACxB,UAAU,CAAC,KAAK,CAAC;aACjB,MAAM,CAAC,GAAG,QAAQ,UAAU,QAAQ,EAAE,EAAE,MAAM,CAAC;aAC/C,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjB,YAAY;QACZ,MAAM,GAAG,GAAG,MAAM;aACf,UAAU,CAAC,KAAK,CAAC;aACjB,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,GAAG,YAAY,EAAE,EAAE,MAAM,CAAC;aACpD,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,mBAAmB,GAAG;YAC1B,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,QAAQ;YACd,KAAK;YACL,GAAG;SACJ,CAAC;QAEF,MAAM,UAAU,CAAC,YAAY,CAAC,IAAA,UAAE,EAAC,GAAG,MAAM,OAAO,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACtF,CAAC;CACF;AAnCD,0BAmCC"}
|
|
@@ -4,6 +4,7 @@ exports.MongoDBAWS = void 0;
|
|
|
4
4
|
const crypto = require("crypto");
|
|
5
5
|
const http = require("http");
|
|
6
6
|
const url = require("url");
|
|
7
|
+
const util_1 = require("util");
|
|
7
8
|
const BSON = require("../../bson");
|
|
8
9
|
const deps_1 = require("../../deps");
|
|
9
10
|
const error_1 = require("../../error");
|
|
@@ -16,34 +17,33 @@ const AWS_RELATIVE_URI = 'http://169.254.170.2';
|
|
|
16
17
|
const AWS_EC2_URI = 'http://169.254.169.254';
|
|
17
18
|
const AWS_EC2_PATH = '/latest/meta-data/iam/security-credentials';
|
|
18
19
|
const bsonOptions = {
|
|
20
|
+
useBigInt64: false,
|
|
19
21
|
promoteLongs: true,
|
|
20
22
|
promoteValues: true,
|
|
21
23
|
promoteBuffers: false,
|
|
22
24
|
bsonRegExp: false
|
|
23
25
|
};
|
|
24
26
|
class MongoDBAWS extends auth_provider_1.AuthProvider {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
constructor() {
|
|
28
|
+
super();
|
|
29
|
+
this.randomBytesAsync = (0, util_1.promisify)(crypto.randomBytes);
|
|
30
|
+
}
|
|
31
|
+
async auth(authContext) {
|
|
32
|
+
const { connection } = authContext;
|
|
33
|
+
if (!authContext.credentials) {
|
|
34
|
+
throw new error_1.MongoMissingCredentialsError('AuthContext must provide credentials.');
|
|
29
35
|
}
|
|
30
36
|
if ('kModuleError' in deps_1.aws4) {
|
|
31
|
-
|
|
37
|
+
throw deps_1.aws4['kModuleError'];
|
|
32
38
|
}
|
|
33
39
|
const { sign } = deps_1.aws4;
|
|
34
40
|
if ((0, utils_1.maxWireVersion)(connection) < 9) {
|
|
35
|
-
|
|
36
|
-
return;
|
|
41
|
+
throw new error_1.MongoCompatibilityError('MONGODB-AWS authentication requires MongoDB version 4.4 or later');
|
|
37
42
|
}
|
|
38
|
-
if (!credentials.username) {
|
|
39
|
-
makeTempCredentials(credentials
|
|
40
|
-
if (err || !tempCredentials)
|
|
41
|
-
return callback(err);
|
|
42
|
-
authContext.credentials = tempCredentials;
|
|
43
|
-
this.auth(authContext, callback);
|
|
44
|
-
});
|
|
45
|
-
return;
|
|
43
|
+
if (!authContext.credentials.username) {
|
|
44
|
+
authContext.credentials = await makeTempCredentials(authContext.credentials);
|
|
46
45
|
}
|
|
46
|
+
const { credentials } = authContext;
|
|
47
47
|
const accessKeyId = credentials.username;
|
|
48
48
|
const secretAccessKey = credentials.password;
|
|
49
49
|
const sessionToken = credentials.mechanismProperties.AWS_SESSION_TOKEN;
|
|
@@ -54,80 +54,67 @@ class MongoDBAWS extends auth_provider_1.AuthProvider {
|
|
|
54
54
|
? { accessKeyId, secretAccessKey }
|
|
55
55
|
: undefined;
|
|
56
56
|
const db = credentials.source;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
};
|
|
110
|
-
if (sessionToken) {
|
|
111
|
-
payload.t = sessionToken;
|
|
112
|
-
}
|
|
113
|
-
const saslContinue = {
|
|
114
|
-
saslContinue: 1,
|
|
115
|
-
conversationId: 1,
|
|
116
|
-
payload: BSON.serialize(payload, bsonOptions)
|
|
117
|
-
};
|
|
118
|
-
connection.command((0, utils_1.ns)(`${db}.$cmd`), saslContinue, undefined, callback);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
57
|
+
const nonce = await this.randomBytesAsync(32);
|
|
58
|
+
const saslStart = {
|
|
59
|
+
saslStart: 1,
|
|
60
|
+
mechanism: 'MONGODB-AWS',
|
|
61
|
+
payload: BSON.serialize({ r: nonce, p: ASCII_N }, bsonOptions)
|
|
62
|
+
};
|
|
63
|
+
const saslStartResponse = await connection.commandAsync((0, utils_1.ns)(`${db}.$cmd`), saslStart, undefined);
|
|
64
|
+
const serverResponse = BSON.deserialize(saslStartResponse.payload.buffer, bsonOptions);
|
|
65
|
+
const host = serverResponse.h;
|
|
66
|
+
const serverNonce = serverResponse.s.buffer;
|
|
67
|
+
if (serverNonce.length !== 64) {
|
|
68
|
+
// TODO(NODE-3483)
|
|
69
|
+
throw new error_1.MongoRuntimeError(`Invalid server nonce length ${serverNonce.length}, expected 64`);
|
|
70
|
+
}
|
|
71
|
+
if (!utils_1.ByteUtils.equals(serverNonce.subarray(0, nonce.byteLength), nonce)) {
|
|
72
|
+
// throw because the serverNonce's leading 32 bytes must equal the client nonce's 32 bytes
|
|
73
|
+
// https://github.com/mongodb/specifications/blob/875446db44aade414011731840831f38a6c668df/source/auth/auth.rst#id11
|
|
74
|
+
// TODO(NODE-3483)
|
|
75
|
+
throw new error_1.MongoRuntimeError('Server nonce does not begin with client nonce');
|
|
76
|
+
}
|
|
77
|
+
if (host.length < 1 || host.length > 255 || host.indexOf('..') !== -1) {
|
|
78
|
+
// TODO(NODE-3483)
|
|
79
|
+
throw new error_1.MongoRuntimeError(`Server returned an invalid host: "${host}"`);
|
|
80
|
+
}
|
|
81
|
+
const body = 'Action=GetCallerIdentity&Version=2011-06-15';
|
|
82
|
+
const options = sign({
|
|
83
|
+
method: 'POST',
|
|
84
|
+
host,
|
|
85
|
+
region: deriveRegion(serverResponse.h),
|
|
86
|
+
service: 'sts',
|
|
87
|
+
headers: {
|
|
88
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
89
|
+
'Content-Length': body.length,
|
|
90
|
+
'X-MongoDB-Server-Nonce': utils_1.ByteUtils.toBase64(serverNonce),
|
|
91
|
+
'X-MongoDB-GS2-CB-Flag': 'n'
|
|
92
|
+
},
|
|
93
|
+
path: '/',
|
|
94
|
+
body
|
|
95
|
+
}, awsCredentials);
|
|
96
|
+
const payload = {
|
|
97
|
+
a: options.headers.Authorization,
|
|
98
|
+
d: options.headers['X-Amz-Date']
|
|
99
|
+
};
|
|
100
|
+
if (sessionToken) {
|
|
101
|
+
payload.t = sessionToken;
|
|
102
|
+
}
|
|
103
|
+
const saslContinue = {
|
|
104
|
+
saslContinue: 1,
|
|
105
|
+
conversationId: 1,
|
|
106
|
+
payload: BSON.serialize(payload, bsonOptions)
|
|
107
|
+
};
|
|
108
|
+
await connection.commandAsync((0, utils_1.ns)(`${db}.$cmd`), saslContinue, undefined);
|
|
121
109
|
}
|
|
122
110
|
}
|
|
123
111
|
exports.MongoDBAWS = MongoDBAWS;
|
|
124
|
-
function makeTempCredentials(credentials
|
|
125
|
-
function
|
|
112
|
+
async function makeTempCredentials(credentials) {
|
|
113
|
+
function makeMongoCredentialsFromAWSTemp(creds) {
|
|
126
114
|
if (!creds.AccessKeyId || !creds.SecretAccessKey || !creds.Token) {
|
|
127
|
-
|
|
128
|
-
return;
|
|
115
|
+
throw new error_1.MongoMissingCredentialsError('Could not obtain temporary MONGODB-AWS credentials');
|
|
129
116
|
}
|
|
130
|
-
|
|
117
|
+
return new mongo_credentials_1.MongoCredentials({
|
|
131
118
|
username: creds.AccessKeyId,
|
|
132
119
|
password: creds.SecretAccessKey,
|
|
133
120
|
source: credentials.source,
|
|
@@ -135,7 +122,7 @@ function makeTempCredentials(credentials, callback) {
|
|
|
135
122
|
mechanismProperties: {
|
|
136
123
|
AWS_SESSION_TOKEN: creds.Token
|
|
137
124
|
}
|
|
138
|
-
})
|
|
125
|
+
});
|
|
139
126
|
}
|
|
140
127
|
const credentialProvider = (0, deps_1.getAwsCredentialProvider)();
|
|
141
128
|
// Check if the AWS credential provider from the SDK is present. If not,
|
|
@@ -144,30 +131,25 @@ function makeTempCredentials(credentials, callback) {
|
|
|
144
131
|
// If the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
|
|
145
132
|
// is set then drivers MUST assume that it was set by an AWS ECS agent
|
|
146
133
|
if (process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) {
|
|
147
|
-
request(`${AWS_RELATIVE_URI}${process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}
|
|
148
|
-
if (err)
|
|
149
|
-
return callback(err);
|
|
150
|
-
done(res);
|
|
151
|
-
});
|
|
152
|
-
return;
|
|
134
|
+
return makeMongoCredentialsFromAWSTemp(await request(`${AWS_RELATIVE_URI}${process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}`));
|
|
153
135
|
}
|
|
154
136
|
// Otherwise assume we are on an EC2 instance
|
|
155
137
|
// get a token
|
|
156
|
-
request(`${AWS_EC2_URI}/latest/api/token`, {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
});
|
|
138
|
+
const token = await request(`${AWS_EC2_URI}/latest/api/token`, {
|
|
139
|
+
method: 'PUT',
|
|
140
|
+
json: false,
|
|
141
|
+
headers: { 'X-aws-ec2-metadata-token-ttl-seconds': 30 }
|
|
142
|
+
});
|
|
143
|
+
// get role name
|
|
144
|
+
const roleName = await request(`${AWS_EC2_URI}/${AWS_EC2_PATH}`, {
|
|
145
|
+
json: false,
|
|
146
|
+
headers: { 'X-aws-ec2-metadata-token': token }
|
|
147
|
+
});
|
|
148
|
+
// get temp credentials
|
|
149
|
+
const creds = await request(`${AWS_EC2_URI}/${AWS_EC2_PATH}/${roleName}`, {
|
|
150
|
+
headers: { 'X-aws-ec2-metadata-token': token }
|
|
170
151
|
});
|
|
152
|
+
return makeMongoCredentialsFromAWSTemp(creds);
|
|
171
153
|
}
|
|
172
154
|
else {
|
|
173
155
|
/*
|
|
@@ -182,18 +164,18 @@ function makeTempCredentials(credentials, callback) {
|
|
|
182
164
|
*/
|
|
183
165
|
const { fromNodeProviderChain } = credentialProvider;
|
|
184
166
|
const provider = fromNodeProviderChain();
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
167
|
+
try {
|
|
168
|
+
const creds = await provider();
|
|
169
|
+
return makeMongoCredentialsFromAWSTemp({
|
|
188
170
|
AccessKeyId: creds.accessKeyId,
|
|
189
171
|
SecretAccessKey: creds.secretAccessKey,
|
|
190
172
|
Token: creds.sessionToken,
|
|
191
173
|
Expiration: creds.expiration
|
|
192
174
|
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new error_1.MongoAWSError(error.message);
|
|
178
|
+
}
|
|
197
179
|
}
|
|
198
180
|
}
|
|
199
181
|
function deriveRegion(host) {
|
|
@@ -203,35 +185,39 @@ function deriveRegion(host) {
|
|
|
203
185
|
}
|
|
204
186
|
return parts[1];
|
|
205
187
|
}
|
|
206
|
-
function request(uri,
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
188
|
+
async function request(uri, options = {}) {
|
|
189
|
+
return new Promise((resolve, reject) => {
|
|
190
|
+
const requestOptions = {
|
|
191
|
+
method: 'GET',
|
|
192
|
+
timeout: 10000,
|
|
193
|
+
json: true,
|
|
194
|
+
...url.parse(uri),
|
|
195
|
+
...options
|
|
196
|
+
};
|
|
197
|
+
const req = http.request(requestOptions, res => {
|
|
198
|
+
res.setEncoding('utf8');
|
|
199
|
+
let data = '';
|
|
200
|
+
res.on('data', d => {
|
|
201
|
+
data += d;
|
|
202
|
+
});
|
|
203
|
+
res.once('end', () => {
|
|
204
|
+
if (options.json === false) {
|
|
205
|
+
resolve(data);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
const parsed = JSON.parse(data);
|
|
210
|
+
resolve(parsed);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// TODO(NODE-3483)
|
|
214
|
+
reject(new error_1.MongoRuntimeError(`Invalid JSON response: "${data}"`));
|
|
215
|
+
}
|
|
216
|
+
});
|
|
229
217
|
});
|
|
218
|
+
req.once('timeout', () => req.destroy(new error_1.MongoAWSError(`AWS request to ${uri} timed out after ${options.timeout} ms`)));
|
|
219
|
+
req.once('error', error => reject(error));
|
|
220
|
+
req.end();
|
|
230
221
|
});
|
|
231
|
-
req.on('timeout', () => {
|
|
232
|
-
req.destroy(new error_1.MongoAWSError(`AWS request to ${uri} timed out after ${options.timeout} ms`));
|
|
233
|
-
});
|
|
234
|
-
req.on('error', err => callback(err));
|
|
235
|
-
req.end();
|
|
236
222
|
}
|
|
237
223
|
//# sourceMappingURL=mongodb_aws.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb_aws.js","sourceRoot":"","sources":["../../../src/cmap/auth/mongodb_aws.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,2BAA2B;
|
|
1
|
+
{"version":3,"file":"mongodb_aws.js","sourceRoot":"","sources":["../../../src/cmap/auth/mongodb_aws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsServiceWorkflow = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const error_1 = require("../../../error");
|
|
6
|
+
const service_workflow_1 = require("./service_workflow");
|
|
7
|
+
/**
|
|
8
|
+
* Device workflow implementation for AWS.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
class AwsServiceWorkflow extends service_workflow_1.ServiceWorkflow {
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the token from the environment.
|
|
18
|
+
*/
|
|
19
|
+
async getToken() {
|
|
20
|
+
const tokenFile = process.env.AWS_WEB_IDENTITY_TOKEN_FILE;
|
|
21
|
+
if (!tokenFile) {
|
|
22
|
+
throw new error_1.MongoAWSError('AWS_WEB_IDENTITY_TOKEN_FILE must be set in the environment.');
|
|
23
|
+
}
|
|
24
|
+
return (0, promises_1.readFile)(tokenFile, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.AwsServiceWorkflow = AwsServiceWorkflow;
|
|
28
|
+
//# sourceMappingURL=aws_service_workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws_service_workflow.js","sourceRoot":"","sources":["../../../../src/cmap/auth/mongodb_oidc/aws_service_workflow.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AAEvC,0CAA+C;AAC/C,yDAAqD;AAErD;;;;GAIG;AACH,MAAa,kBAAmB,SAAQ,kCAAe;IACrD;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;QAC1D,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,qBAAa,CAAC,6DAA6D,CAAC,CAAC;SACxF;QACD,OAAO,IAAA,mBAAQ,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;CACF;AAfD,gDAeC"}
|