3
3
4
4
var common = require ( './common' ) ;
5
5
var _ = require ( 'underscore' ) ;
6
+ var Crypto = require ( 'crypto' ) ;
6
7
var Net = require ( 'net' ) ;
8
+ var tls = require ( 'tls' ) ;
7
9
var Packets = require ( '../lib/protocol/packets' ) ;
8
10
var PacketWriter = require ( '../lib/protocol/PacketWriter' ) ;
9
11
var Parser = require ( '../lib/protocol/Parser' ) ;
@@ -102,11 +104,10 @@ FakeConnection.prototype._handleData = function(buffer) {
102
104
} ;
103
105
104
106
FakeConnection . prototype . _parsePacket = function ( header ) {
105
- var Packet = this . _determinePacket ( header ) ;
106
- var packet = new Packet ( { protocol41 : true } ) ;
107
- var parser = this . _parser ;
107
+ var Packet = this . _determinePacket ( header ) ;
108
+ var packet = new Packet ( { protocol41 : true } ) ;
108
109
109
- packet . parse ( parser ) ;
110
+ packet . parse ( this . _parser ) ;
110
111
111
112
switch ( Packet ) {
112
113
case Packets . ClientAuthenticationPacket :
@@ -120,29 +121,11 @@ FakeConnection.prototype._parsePacket = function(header) {
120
121
throw new Error ( 'not implemented' ) ;
121
122
} else {
122
123
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
123
- parser . resetPacketNumber ( ) ;
124
+ this . _parser . resetPacketNumber ( ) ;
124
125
}
125
126
break ;
126
127
case Packets . SSLRequestPacket :
127
- // halt parser
128
- parser . pause ( ) ;
129
- this . _socket . removeAllListeners ( 'data' ) ;
130
-
131
- // inject secure pair
132
- var securePair = common . createSecurePair ( ) ;
133
- this . _socket . pipe ( securePair . encrypted ) ;
134
- this . _stream = securePair . cleartext ;
135
- securePair . cleartext . on ( 'data' , this . _handleData . bind ( this ) ) ;
136
- securePair . encrypted . pipe ( this . _socket ) ;
137
-
138
- // resume
139
- process . nextTick ( function ( ) {
140
- var buffer = parser . _buffer . slice ( parser . _offset ) ;
141
- parser . _offset = parser . _buffer . length ;
142
- parser . resume ( ) ;
143
- securePair . encrypted . write ( buffer ) ;
144
- } ) ;
145
-
128
+ this . _startTLS ( ) ;
146
129
break ;
147
130
case Packets . OldPasswordPacket :
148
131
this . _oldPasswordPacket = packet ;
@@ -156,7 +139,7 @@ FakeConnection.prototype._parsePacket = function(header) {
156
139
break ;
157
140
case Packets . ComPingPacket :
158
141
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
159
- parser . resetPacketNumber ( ) ;
142
+ this . _parser . resetPacketNumber ( ) ;
160
143
break ;
161
144
case Packets . ComChangeUserPacket :
162
145
this . _clientAuthenticationPacket = new Packets . ClientAuthenticationPacket ( {
@@ -170,7 +153,7 @@ FakeConnection.prototype._parsePacket = function(header) {
170
153
user : packet . user
171
154
} ) ;
172
155
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
173
- parser . resetPacketNumber ( ) ;
156
+ this . _parser . resetPacketNumber ( ) ;
174
157
break ;
175
158
case Packets . ComQuitPacket :
176
159
this . emit ( 'quit' , packet ) ;
@@ -211,3 +194,56 @@ FakeConnection.prototype._determinePacket = function(header) {
211
194
FakeConnection . prototype . destroy = function ( ) {
212
195
this . _socket . destroy ( ) ;
213
196
} ;
197
+
198
+ if ( tls . TLSSocket ) {
199
+ // 0.11+ environment
200
+ FakeConnection . prototype . _startTLS = function _startTLS ( ) {
201
+ // halt parser
202
+ this . _parser . pause ( ) ;
203
+ this . _socket . removeAllListeners ( 'data' ) ;
204
+
205
+ // socket <-> encrypted
206
+ var secureContext = tls . createSecureContext ( common . getSSLConfig ( ) ) ;
207
+ var secureSocket = new tls . TLSSocket ( this . _socket , {
208
+ secureContext : secureContext ,
209
+ isServer : true
210
+ } ) ;
211
+
212
+ // cleartext <-> protocol
213
+ secureSocket . on ( 'data' , this . _handleData . bind ( this ) ) ;
214
+ this . _stream = secureSocket ;
215
+
216
+ // resume
217
+ var parser = this . _parser ;
218
+ process . nextTick ( function ( ) {
219
+ var buffer = parser . _buffer . slice ( parser . _offset ) ;
220
+ parser . _offset = parser . _buffer . length ;
221
+ parser . resume ( ) ;
222
+ secureSocket . ssl . receive ( buffer ) ;
223
+ } ) ;
224
+ } ;
225
+ } else {
226
+ // pre-0.11 environment
227
+ FakeConnection . prototype . _startTLS = function _startTLS ( ) {
228
+ // halt parser
229
+ this . _parser . pause ( ) ;
230
+ this . _socket . removeAllListeners ( 'data' ) ;
231
+
232
+ // inject secure pair
233
+ var credentials = Crypto . createCredentials ( common . getSSLConfig ( ) ) ;
234
+ var securePair = tls . createSecurePair ( credentials , true ) ;
235
+ this . _socket . pipe ( securePair . encrypted ) ;
236
+ this . _stream = securePair . cleartext ;
237
+ securePair . cleartext . on ( 'data' , this . _handleData . bind ( this ) ) ;
238
+ securePair . encrypted . pipe ( this . _socket ) ;
239
+
240
+ // resume
241
+ var parser = this . _parser ;
242
+ process . nextTick ( function ( ) {
243
+ var buffer = parser . _buffer . slice ( parser . _offset ) ;
244
+ parser . _offset = parser . _buffer . length ;
245
+ parser . resume ( ) ;
246
+ securePair . encrypted . write ( buffer ) ;
247
+ } ) ;
248
+ } ;
249
+ }
0 commit comments