handshake_response.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. var ClientConstants = require('../constants/client.js');
  2. var Charsets = require('../constants/charsets.js');
  3. var Packet = require('../packets/packet.js');
  4. var auth41 = require('../auth_41.js');
  5. function HandshakeResponse(handshake)
  6. {
  7. this.user = handshake.user || '';
  8. this.database = handshake.database || '';
  9. this.password = handshake.password || '';
  10. this.passwordSha1 = handshake.passwordSha1;
  11. this.authPluginData1 = handshake.authPluginData1;
  12. this.authPluginData2 = handshake.authPluginData2;
  13. this.compress = handshake.compress;
  14. this.clientFlags = handshake.flags;
  15. // TODO: pre-4.1 auth support
  16. var authToken;
  17. if (this.passwordSha1)
  18. authToken = auth41.calculateTokenFromPasswordSha(this.passwordSha1, this.authPluginData1, this.authPluginData2);
  19. else
  20. authToken = auth41.calculateToken(this.password, this.authPluginData1, this.authPluginData2);
  21. this.authToken = authToken;
  22. this.charsetNumber = handshake.charsetNumber;
  23. }
  24. HandshakeResponse.fromPacket = function(packet)
  25. {
  26. var args = {};
  27. //packet.skip(4);
  28. args.clientFlags = packet.readInt32();
  29. args.maxPacketSize = packet.readInt32();
  30. args.charsetNumber = packet.readInt8();
  31. packet.skip(23);
  32. args.user = packet.readNullTerminatedString();
  33. var authTokenLength = packet.readInt8();
  34. args.authToken = packet.readBuffer(authTokenLength);
  35. args.database = packet.readNullTerminatedString();
  36. //return new HandshakeResponse(args);
  37. return args;
  38. };
  39. HandshakeResponse.prototype.toPacket = function()
  40. {
  41. if (typeof this.user != 'string')
  42. throw new Error('"user" connection config prperty must be a string');
  43. if (typeof this.database != 'string')
  44. throw new Error('"database" connection config prperty must be a string');
  45. var length = 36 + 23 + this.user.length + this.database.length;
  46. var buffer = new Buffer(length);
  47. var packet = new Packet(0, buffer, 0, length);
  48. buffer.fill(0);
  49. packet.offset = 4;
  50. packet.writeInt32(this.clientFlags);
  51. packet.writeInt32(0); // max packet size. todo: move to config
  52. packet.writeInt8(this.charsetNumber);
  53. packet.skip(23);
  54. packet.writeNullTerminatedString(this.user);
  55. packet.writeInt8(this.authToken.length);
  56. packet.writeBuffer(this.authToken);
  57. packet.writeNullTerminatedString(this.database);
  58. return packet;
  59. };
  60. module.exports = HandshakeResponse;