Topicbar usability improvements
[KiwiIRC.git] / server / lib / starttls.js
CommitLineData
4136eb38
JA
1// Target API:
2//
3// var s = require('net').createStream(25, 'smtp.example.com');
4// s.on('connect', function() {
5// require('starttls')(s, options, function() {
6// if (!s.authorized) {
7// s.destroy();
8// return;
9// }
10//
11// s.end("hello world\n");
12// });
13// });
14//
15//
16module.exports = function starttls(socket, options, cb) {
17
18 var sslcontext = require('crypto').createCredentials(options);
19
20 var pair = require('tls').createSecurePair(sslcontext, false);
21
22 var cleartext = pipe(pair, socket);
23
24 pair.on('secure', function() {
25 var verifyError = pair.ssl.verifyError();
26
27 if (verifyError) {
28 cleartext.authorized = false;
29 cleartext.authorizationError = verifyError;
30 } else {
31 cleartext.authorized = true;
32 }
33
34 if (cb) cb();
35 });
36
37 cleartext._controlReleased = true;
38 return cleartext;
39};
40
41
42function pipe(pair, socket) {
43 pair.encrypted.pipe(socket);
44 socket.pipe(pair.encrypted);
45
46 pair.fd = socket.fd;
47 var cleartext = pair.cleartext;
48 cleartext.socket = socket;
49 cleartext.encrypted = pair.encrypted;
50 cleartext.authorized = false;
51
52 function onerror(e) {
53 if (cleartext._controlReleased) {
54 cleartext.emit('error', e);
55 }
56 }
57
58 function onclose() {
59 socket.removeListener('error', onerror);
60 socket.removeListener('close', onclose);
61 }
62
63 socket.on('error', onerror);
64 socket.on('close', onclose);
65
66 return cleartext;
67}
68