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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mysql2",
3
- "version": "3.24.3",
3
+ "version": "3.24.4-canary.9178c82",
4
4
  "description": "fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS",
5
5
  "main": "index.js",
6
6
  "typings": "typings/mysql/index",