Created
July 5, 2012 22:39
-
-
Save Rush/3056914 to your computer and use it in GitHub Desktop.
Testcase for Node.JS #3638
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var crypto = require('crypto'); | |
var tls = require('tls'); | |
var net = require('net'); | |
function starttls(socket, options, isServer, cb) { | |
var credentials = crypto.createCredentials(options); | |
var pair = tls.createSecurePair(credentials, isServer, false, !isServer); | |
var cleartext = pipe(pair, socket); | |
pair.on('secure', function() { | |
try { | |
var ssl = pair._ssl || pair.ssl; | |
var verifyError = ssl.verifyError(); | |
console.log("Secure!"); | |
if(verifyError) { | |
cleartext.authorized = false; | |
cleartext.authorizationError = verifyError; | |
} else { | |
cleartext.authorized = true; | |
} | |
} catch(err) { | |
if(cb) | |
cb(err, undefined); | |
} | |
if(cb) | |
cb(undefined, cleartext); | |
}); | |
cleartext._controlReleased = true; | |
return cleartext; | |
}; | |
function pipe(pair, socket) { | |
pair.encrypted.pipe(socket); | |
socket.pipe(pair.encrypted); | |
pair.fd = socket.fd; | |
var cleartext = pair.cleartext; | |
cleartext.socket = socket; | |
cleartext.encrypted = pair.encrypted; | |
cleartext.authorized = false; | |
function onerror(e) { | |
if(cleartext._controlReleased) { | |
cleartext.emit('error', e); | |
} | |
} | |
function onclose() { | |
socket.removeListener('error', onerror); | |
socket.removeListener('close', onclose); | |
} | |
socket.on('error', onerror); | |
socket.on('close', onclose); | |
return cleartext; | |
} | |
var fs = require('fs'); | |
var options = { | |
key: fs.readFileSync('server-key.pem'), | |
cert: fs.readFileSync('server-cert.pem'), | |
// This is necessary only if using the client certificate authentication. | |
requestCert: true, | |
// This is necessary only if the client uses the self-signed certificate. | |
ca: [ fs.readFileSync('client-cert.pem') ] | |
}; | |
var server = net.createServer(function(s) { | |
console.log("Server received connection"); | |
cleartextStream = starttls(s, options, true, function(err, cleartextStream) { | |
cleartextStream.write("welcome!\n", cleartextStream.authorized); | |
console.log("Welcome ", cleartextStream.authorized); | |
cleartextStream.setEncoding('utf8'); | |
cleartextStream.pipe(cleartextStream); | |
console.log(""); | |
}); | |
}); | |
server.listen(8000, function() { | |
console.log('server bound'); | |
}); | |
var s = net.connect(8000, '127.0.0.1'); | |
s.on('connect', function() { | |
console.log("Client connected"); | |
setInterval(function(){ | |
s.write("dupa"); | |
}, 1000); | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment