mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
PR-URL: https://github.com/nodejs-private/node-private/pull/904 Refs: https://hackerone.com/reports/3811980 CVE-ID: CVE-2026-58040
114 lines
2.6 KiB
JavaScript
114 lines
2.6 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
if (!common.hasCrypto)
|
|
common.skip('missing crypto');
|
|
|
|
const assert = require('assert');
|
|
const fixtures = require('../common/fixtures');
|
|
const https = require('https');
|
|
const { once } = require('events');
|
|
|
|
const key = fixtures.readKey('agent1-key.pem');
|
|
const cert = fixtures.readKey('agent1-cert.pem');
|
|
const ca = fixtures.readKey('ca1-cert.pem');
|
|
const expectedError = /rejected by callback/;
|
|
|
|
function request(options) {
|
|
return new Promise((resolve, reject) => {
|
|
const req = https.get({
|
|
host: '127.0.0.1',
|
|
servername: 'agent1',
|
|
ca: [ca],
|
|
...options,
|
|
}, (res) => {
|
|
const socket = res.socket;
|
|
res.resume();
|
|
res.on('end', () => resolve({
|
|
socket,
|
|
reusedSocket: req.reusedSocket,
|
|
}));
|
|
});
|
|
|
|
req.on('error', reject);
|
|
});
|
|
}
|
|
|
|
const server = https.createServer({
|
|
key,
|
|
cert,
|
|
minVersion: 'TLSv1.2',
|
|
maxVersion: 'TLSv1.2',
|
|
}, (req, res) => {
|
|
res.end('ok');
|
|
});
|
|
|
|
(async function() {
|
|
server.listen(0);
|
|
await once(server, 'listening');
|
|
|
|
const port = server.address().port;
|
|
let acceptCalls = 0;
|
|
let rejectCalls = 0;
|
|
const acceptingCheck = () => {
|
|
acceptCalls++;
|
|
};
|
|
const rejectingCheck = () => {
|
|
rejectCalls++;
|
|
return new Error('rejected by callback');
|
|
};
|
|
|
|
const sessionAgent = new https.Agent();
|
|
const keepAliveAgent = new https.Agent({
|
|
keepAlive: true,
|
|
maxCachedSessions: 0,
|
|
});
|
|
const agentLevelAgent = new https.Agent({
|
|
checkServerIdentity: acceptingCheck,
|
|
});
|
|
|
|
try {
|
|
await request({
|
|
port,
|
|
agent: sessionAgent,
|
|
checkServerIdentity: acceptingCheck,
|
|
});
|
|
assert.deepStrictEqual(sessionAgent._sessionCache.map, {});
|
|
await assert.rejects(request({
|
|
port,
|
|
agent: sessionAgent,
|
|
checkServerIdentity: rejectingCheck,
|
|
}), expectedError);
|
|
|
|
await request({
|
|
port,
|
|
agent: keepAliveAgent,
|
|
checkServerIdentity: acceptingCheck,
|
|
});
|
|
await assert.rejects(request({
|
|
port,
|
|
agent: keepAliveAgent,
|
|
checkServerIdentity: rejectingCheck,
|
|
}), expectedError);
|
|
|
|
const first = await request({
|
|
port,
|
|
agent: agentLevelAgent,
|
|
});
|
|
assert.strictEqual(first.socket.isSessionReused(), false);
|
|
const second = await request({
|
|
port,
|
|
agent: agentLevelAgent,
|
|
});
|
|
assert.strictEqual(second.socket.isSessionReused(), true);
|
|
|
|
assert.strictEqual(acceptCalls, 3);
|
|
assert.strictEqual(rejectCalls, 2);
|
|
} finally {
|
|
sessionAgent.destroy();
|
|
keepAliveAgent.destroy();
|
|
agentLevelAgent.destroy();
|
|
server.close();
|
|
await once(server, 'close');
|
|
}
|
|
})().then(common.mustCall());
|