1
1
// An experimental fake MySQL server for tricky integration tests. Expanded
2
2
// as needed.
3
3
4
+ var common = require ( './common' ) ;
4
5
var _ = require ( 'underscore' ) ;
5
6
var Net = require ( 'net' ) ;
6
7
var Packets = require ( '../lib/protocol/packets' ) ;
@@ -42,6 +43,7 @@ function FakeConnection(socket) {
42
43
EventEmitter . call ( this ) ;
43
44
44
45
this . _socket = socket ;
46
+ this . _stream = socket ;
45
47
this . _parser = new Parser ( { onPacket : this . _parsePacket . bind ( this ) } ) ;
46
48
47
49
this . _handshakeInitializationPacket = null ;
@@ -92,7 +94,7 @@ FakeConnection.prototype._sendAuthResponse = function(packet, expected) {
92
94
FakeConnection . prototype . _sendPacket = function ( packet ) {
93
95
var writer = new PacketWriter ( ) ;
94
96
packet . write ( writer ) ;
95
- this . _socket . write ( writer . toBuffer ( this . _parser ) ) ;
97
+ this . _stream . write ( writer . toBuffer ( this . _parser ) ) ;
96
98
} ;
97
99
98
100
FakeConnection . prototype . _handleData = function ( buffer ) {
@@ -102,13 +104,13 @@ FakeConnection.prototype._handleData = function(buffer) {
102
104
FakeConnection . prototype . _parsePacket = function ( header ) {
103
105
var Packet = this . _determinePacket ( header ) ;
104
106
var packet = new Packet ( { protocol41 : true } ) ;
107
+ var parser = this . _parser ;
105
108
106
- packet . parse ( this . _parser ) ;
109
+ packet . parse ( parser ) ;
107
110
108
111
switch ( Packet ) {
109
112
case Packets . ClientAuthenticationPacket :
110
113
this . _clientAuthenticationPacket = packet ;
111
-
112
114
if ( this . _handshakeOptions . oldPassword ) {
113
115
this . _sendPacket ( new Packets . UseOldPasswordPacket ( ) ) ;
114
116
} else if ( this . _handshakeOptions . password === 'passwd' ) {
@@ -118,8 +120,29 @@ FakeConnection.prototype._parsePacket = function(header) {
118
120
throw new Error ( 'not implemented' ) ;
119
121
} else {
120
122
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
121
- this . _parser . resetPacketNumber ( ) ;
123
+ parser . resetPacketNumber ( ) ;
122
124
}
125
+ break ;
126
+ 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
+
123
146
break ;
124
147
case Packets . OldPasswordPacket :
125
148
this . _oldPasswordPacket = packet ;
@@ -133,7 +156,7 @@ FakeConnection.prototype._parsePacket = function(header) {
133
156
break ;
134
157
case Packets . ComPingPacket :
135
158
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
136
- this . _parser . resetPacketNumber ( ) ;
159
+ parser . resetPacketNumber ( ) ;
137
160
break ;
138
161
case Packets . ComChangeUserPacket :
139
162
this . _clientAuthenticationPacket = new Packets . ClientAuthenticationPacket ( {
@@ -147,7 +170,7 @@ FakeConnection.prototype._parsePacket = function(header) {
147
170
user : packet . user
148
171
} ) ;
149
172
this . _sendPacket ( new Packets . OkPacket ( ) ) ;
150
- this . _parser . resetPacketNumber ( ) ;
173
+ parser . resetPacketNumber ( ) ;
151
174
break ;
152
175
case Packets . ComQuitPacket :
153
176
this . emit ( 'quit' , packet ) ;
@@ -158,10 +181,18 @@ FakeConnection.prototype._parsePacket = function(header) {
158
181
}
159
182
} ;
160
183
161
- FakeConnection . prototype . _determinePacket = function ( ) {
184
+ FakeConnection . prototype . _determinePacket = function ( header ) {
162
185
if ( ! this . _clientAuthenticationPacket ) {
186
+ // first packet phase
187
+
188
+ if ( header . length === 32 ) {
189
+ return Packets . SSLRequestPacket ;
190
+ }
191
+
163
192
return Packets . ClientAuthenticationPacket ;
164
- } else if ( this . _handshakeOptions . oldPassword && ! this . _oldPasswordPacket ) {
193
+ }
194
+
195
+ if ( this . _handshakeOptions . oldPassword && ! this . _oldPasswordPacket ) {
165
196
return Packets . OldPasswordPacket ;
166
197
}
167
198
0 commit comments