handshake.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. var Packet = require('../packets/packet');
  2. function Handshake(args) {
  3. this.protocolVersion = args.protocolVersion;
  4. this.serverVersion = args.serverVersion;
  5. this.capabilityFlags = args.capabilityFlags;
  6. this.connectionId = args.connectionId;
  7. this.authPluginData1 = args.authPluginData1;
  8. this.authPluginData2 = args.authPluginData2;
  9. this.characterSet = args.characterSet;
  10. this.statusFlags = args.statusFlags;
  11. }
  12. Handshake.fromPacket = function(packet)
  13. {
  14. var args = {};
  15. args.protocolVersion = packet.readInt8();
  16. args.serverVersion = packet.readNullTerminatedString();
  17. args.connectionId = packet.readInt32();
  18. args.authPluginData1 = packet.readBuffer(8);
  19. packet.skip(1);
  20. args.capabilityFlags = packet.readInt16();
  21. if (packet.haveMoreData()) {
  22. args.characterSet = packet.readInt8();
  23. args.statusFlags = packet.readInt16();
  24. // upper 2 bytes
  25. args.capabilityFlags += packet.readInt16() << 16;
  26. args.authPluginDataLength = packet.readInt8();
  27. packet.skip(10);
  28. }
  29. //var len = Math.max(12, args.authPluginDataLength - 8);
  30. args.authPluginData2 = packet.readBuffer(12);
  31. return new Handshake(args);
  32. };
  33. Handshake.prototype.setScrambleData = function(cb) {
  34. var self = this;
  35. require('crypto').randomBytes(20, function(err, data) {
  36. if (err) return cb(err);
  37. self.authPluginData1 = data.slice(0, 8);
  38. self.authPluginData2 = data.slice(8,20);
  39. cb();
  40. });
  41. };
  42. Handshake.prototype.toPacket = function(sequenceId) {
  43. var buffer, packet;
  44. var length = 68 + Buffer.byteLength(this.serverVersion, 'utf8');
  45. buffer = new Buffer(length + 4);
  46. packet = new Packet(sequenceId, buffer, 0, length + 4);
  47. packet.offset = 4;
  48. packet.writeInt8(this.protocolVersion);
  49. packet.writeString(this.serverVersion);
  50. packet.writeInt8(0);
  51. packet.writeInt32(this.connectionId);
  52. packet.writeBuffer(this.authPluginData1);
  53. packet.writeInt8(0);
  54. packet.writeInt16(this.capabilityFlags & 0xffff);
  55. packet.writeInt8(this.characterSet);
  56. packet.writeInt16(this.statusFlags);
  57. packet.writeInt16(this.capabilityFlags >> 16);
  58. packet.writeInt8(21); // authPluginDataLength
  59. var filler = new Buffer(10);
  60. filler.fill(0);
  61. packet.writeBuffer(filler);
  62. packet.writeBuffer(this.authPluginData2);
  63. packet.writeInt8(0);
  64. packet.writeString('mysql_native_password');
  65. packet.writeInt8(0);
  66. return packet;
  67. };
  68. module.exports = Handshake;