mysql2 3.24.3 → 3.24.4-canary.9178c82
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/base/connection.js +25 -1
- package/lib/tls_session_cache.js +73 -0
- package/package.json +1 -1
package/lib/base/connection.js
CHANGED
|
@@ -27,6 +27,7 @@ const PacketParser = require('../packet_parser.js');
|
|
|
27
27
|
const Packets = require('../packets/index.js');
|
|
28
28
|
const Commands = require('../commands/index.js');
|
|
29
29
|
const ConnectionConfig = require('../connection_config.js');
|
|
30
|
+
const TlsSessionSlot = require('../tls_session_cache.js');
|
|
30
31
|
const CharsetToEncoding = require('../constants/charset_encodings.js');
|
|
31
32
|
const {
|
|
32
33
|
traceCallback,
|
|
@@ -396,7 +397,16 @@ class BaseConnection extends EventEmitter {
|
|
|
396
397
|
? undefined
|
|
397
398
|
: this.config.host;
|
|
398
399
|
|
|
400
|
+
const sessionSlot = new TlsSessionSlot(
|
|
401
|
+
this.config.ssl,
|
|
402
|
+
this.config.host,
|
|
403
|
+
this.config.port,
|
|
404
|
+
rejectUnauthorized,
|
|
405
|
+
verifyIdentity
|
|
406
|
+
);
|
|
399
407
|
let secureEstablished = false;
|
|
408
|
+
let peerAccepted = false;
|
|
409
|
+
let issuedSession = null;
|
|
400
410
|
this.stream.removeAllListeners('data');
|
|
401
411
|
const secureSocket = Tls.connect(
|
|
402
412
|
{
|
|
@@ -408,13 +418,14 @@ class BaseConnection extends EventEmitter {
|
|
|
408
418
|
return undefined;
|
|
409
419
|
},
|
|
410
420
|
secureContext,
|
|
421
|
+
session: sessionSlot.get(),
|
|
411
422
|
isServer: false,
|
|
412
423
|
socket: this.stream,
|
|
413
424
|
servername,
|
|
414
425
|
},
|
|
415
426
|
() => {
|
|
416
427
|
secureEstablished = true;
|
|
417
|
-
if (rejectUnauthorized) {
|
|
428
|
+
if (rejectUnauthorized && !secureSocket.isSessionReused()) {
|
|
418
429
|
if (typeof servername === 'string' && verifyIdentity) {
|
|
419
430
|
const cert = secureSocket.getPeerCertificate(true);
|
|
420
431
|
const serverIdentityCheckError = Tls.checkServerIdentity(
|
|
@@ -422,19 +433,32 @@ class BaseConnection extends EventEmitter {
|
|
|
422
433
|
cert
|
|
423
434
|
);
|
|
424
435
|
if (serverIdentityCheckError) {
|
|
436
|
+
sessionSlot.delete();
|
|
425
437
|
onSecure(serverIdentityCheckError);
|
|
426
438
|
return;
|
|
427
439
|
}
|
|
428
440
|
}
|
|
429
441
|
}
|
|
442
|
+
peerAccepted = true;
|
|
443
|
+
if (issuedSession !== null) {
|
|
444
|
+
sessionSlot.set(issuedSession);
|
|
445
|
+
}
|
|
430
446
|
onSecure();
|
|
431
447
|
}
|
|
432
448
|
);
|
|
449
|
+
secureSocket.on('session', (session) => {
|
|
450
|
+
if (peerAccepted) {
|
|
451
|
+
sessionSlot.set(session);
|
|
452
|
+
} else {
|
|
453
|
+
issuedSession = session;
|
|
454
|
+
}
|
|
455
|
+
});
|
|
433
456
|
// error handler for secure socket
|
|
434
457
|
secureSocket.on('error', (err) => {
|
|
435
458
|
if (secureEstablished) {
|
|
436
459
|
this._handleNetworkError(err);
|
|
437
460
|
} else {
|
|
461
|
+
sessionSlot.delete();
|
|
438
462
|
onSecure(err);
|
|
439
463
|
}
|
|
440
464
|
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { createLRU } = require('lru.min');
|
|
4
|
+
|
|
5
|
+
const MAX_PEERS_PER_SSL_CONFIG = 100;
|
|
6
|
+
|
|
7
|
+
const caches = new WeakMap();
|
|
8
|
+
|
|
9
|
+
function snapshotMaterial(ssl) {
|
|
10
|
+
return {
|
|
11
|
+
ca: ssl.ca,
|
|
12
|
+
cert: ssl.cert,
|
|
13
|
+
ciphers: ssl.ciphers,
|
|
14
|
+
key: ssl.key,
|
|
15
|
+
passphrase: ssl.passphrase,
|
|
16
|
+
minVersion: ssl.minVersion,
|
|
17
|
+
maxVersion: ssl.maxVersion,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function sameMaterial(a, b) {
|
|
22
|
+
return (
|
|
23
|
+
a.ca === b.ca &&
|
|
24
|
+
a.cert === b.cert &&
|
|
25
|
+
a.ciphers === b.ciphers &&
|
|
26
|
+
a.key === b.key &&
|
|
27
|
+
a.passphrase === b.passphrase &&
|
|
28
|
+
a.minVersion === b.minVersion &&
|
|
29
|
+
a.maxVersion === b.maxVersion
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class TlsSessionSlot {
|
|
34
|
+
constructor(ssl, host, port, rejectUnauthorized, verifyIdentity) {
|
|
35
|
+
this.ssl = ssl;
|
|
36
|
+
this.material = snapshotMaterial(ssl);
|
|
37
|
+
this.key = `${host}:${port}:${Boolean(rejectUnauthorized)}:${Boolean(verifyIdentity)}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
_sessions() {
|
|
41
|
+
const cache = caches.get(this.ssl);
|
|
42
|
+
if (cache !== undefined && sameMaterial(cache.material, this.material)) {
|
|
43
|
+
return cache.sessions;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get() {
|
|
49
|
+
const sessions = this._sessions();
|
|
50
|
+
return sessions === undefined ? undefined : sessions.get(this.key);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
set(session) {
|
|
54
|
+
let sessions = this._sessions();
|
|
55
|
+
if (sessions === undefined) {
|
|
56
|
+
if (!sameMaterial(this.material, snapshotMaterial(this.ssl))) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
sessions = createLRU({ max: MAX_PEERS_PER_SSL_CONFIG });
|
|
60
|
+
caches.set(this.ssl, { material: this.material, sessions });
|
|
61
|
+
}
|
|
62
|
+
sessions.set(this.key, session);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
delete() {
|
|
66
|
+
const sessions = this._sessions();
|
|
67
|
+
if (sessions !== undefined) {
|
|
68
|
+
sessions.delete(this.key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = TlsSessionSlot;
|
package/package.json
CHANGED