From d25ceadf4aff632bec6db99d63b070990330acc8 Mon Sep 17 00:00:00 2001 From: tigerbot Date: Wed, 17 May 2017 17:12:04 -0600 Subject: [PATCH] changed how TLS sockets are wrapped --- lib/modules/tls.js | 71 ++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/lib/modules/tls.js b/lib/modules/tls.js index a292c93..db642fd 100644 --- a/lib/modules/tls.js +++ b/lib/modules/tls.js @@ -9,38 +9,61 @@ module.exports.create = function (deps, config, netHandler) { function extractSocketProp(socket, propName) { // remoteAddress, remotePort... ugh... https://github.com/nodejs/node/issues/8854 - return socket[propName] - || socket['_' + propName] - || socket._handle._parent.owner.stream[propName] - ; + var value = socket[propName] || socket['_' + propName]; + try { + value = value || socket._handle._parent.owner.stream[propName]; + } catch (e) {} + + try { + value = value || socket._handle._parentWrap[propName]; + value = value || socket._handle._parentWrap._handle.owner.stream[propName]; + } catch (e) {} + + return value || ''; } + var addressNames = [ + 'remoteAddress' + , 'remotePort' + , 'remoteFamily' + , 'localAddress' + , 'localPort' + ]; function wrapSocket(socket, opts) { - var myDuplex = require('tunnel-packer').Stream.create(socket); - myDuplex.remoteFamily = opts.remoteFamily || myDuplex.remoteFamily; - myDuplex.remoteAddress = opts.remoteAddress || myDuplex.remoteAddress; - myDuplex.remotePort = opts.remotePort || myDuplex.remotePort; + var reader = require('socket-pair').create(function (err, writer) { + if (err) { + reader.emit('error', err); + return; + } - socket.on('data', function (chunk) { - console.log('[' + Date.now() + '] tls socket data', chunk.byteLength); - myDuplex.push(chunk); - }); - socket.on('error', function (err) { - console.error('[error] httpsTunnel (Admin) TODO close'); - console.error(err); - myDuplex.emit('error', err); - }); - socket.on('close', function () { - myDuplex.end(); + process.nextTick(function () { + socket.unshift(opts.firstChunk); + }); + + socket.pipe(writer); + writer.pipe(socket); + + socket.on('error', function (err) { + console.log('wrapped TLS socket error', err); + reader.emit('error', err); + }); + writer.on('error', function (err) { + console.error('socket-pair writer error', err); + // If the writer had an error the reader probably did too, and I don't think we'll + // get much out of emitting this on the original socket, so logging is enough. + }); }); - process.nextTick(function () { - // this must happen after the socket is emitted to the next in the chain, - // but before any more data comes in via the network - socket.unshift(opts.firstChunk); + // We can't set these properties the normal way because there is a getter without a setter, + // but we can use defineProperty. We reuse the descriptor even though we will be manipulating + // it because we will only ever set the value and we set it every time. + var descriptor = {enumerable: true, configurable: true, writable: true}; + addressNames.forEach(function (name) { + descriptor.value = opts[name] || extractSocketProp(socket, name); + Object.defineProperty(reader, name, descriptor); }); - return myDuplex; + return reader; } var le = greenlock.create({