12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- module.exports = HandshakeInitializationPacket;
- function HandshakeInitializationPacket(options) {
- options = options || {};
- this.protocolVersion = options.protocolVersion;
- this.serverVersion = options.serverVersion;
- this.threadId = options.threadId;
- this.scrambleBuff1 = options.scrambleBuff1;
- this.filler1 = options.filler1;
- this.serverCapabilities1 = options.serverCapabilities1;
- this.serverLanguage = options.serverLanguage;
- this.serverStatus = options.serverStatus;
- this.serverCapabilities2 = options.serverCapabilities2;
- this.scrambleLength = options.scrambleLength;
- this.filler2 = options.filler2;
- this.scrambleBuff2 = options.scrambleBuff2;
- this.filler3 = options.filler3;
- this.pluginData = options.pluginData;
- }
- HandshakeInitializationPacket.prototype.parse = function(parser) {
- this.protocolVersion = parser.parseUnsignedNumber(1);
- this.serverVersion = parser.parseNullTerminatedString();
- this.threadId = parser.parseUnsignedNumber(4);
- this.scrambleBuff1 = parser.parseBuffer(8);
- this.filler1 = parser.parseFiller(1);
- this.serverCapabilities1 = parser.parseUnsignedNumber(2);
- this.serverLanguage = parser.parseUnsignedNumber(1);
- this.serverStatus = parser.parseUnsignedNumber(2);
- this.serverCapabilities2 = parser.parseUnsignedNumber(2);
- this.scrambleLength = parser.parseUnsignedNumber(1);
- this.filler2 = parser.parseFiller(10);
- // scrambleBuff2 should be 0x00 terminated, but sphinx does not do this
- // so we assume scrambleBuff2 to be 12 byte and treat the next byte as a
- // filler byte.
- this.scrambleBuff2 = parser.parseBuffer(12);
- this.filler3 = parser.parseFiller(1);
- if (parser.reachedPacketEnd()) {
- return;
- }
- // According to the docs this should be 0x00 terminated, but MariaDB does
- // not do this, so we assume this string to be packet terminated.
- this.pluginData = parser.parsePacketTerminatedString();
- // However, if there is a trailing '\0', strip it
- var lastChar = this.pluginData.length - 1;
- if (this.pluginData[lastChar] === '\0') {
- this.pluginData = this.pluginData.substr(0, lastChar);
- }
- };
- HandshakeInitializationPacket.prototype.write = function(writer) {
- writer.writeUnsignedNumber(1, this.protocolVersion);
- writer.writeNullTerminatedString(this.serverVersion);
- writer.writeUnsignedNumber(4, this.threadId);
- writer.writeBuffer(this.scrambleBuff1);
- writer.writeFiller(1);
- writer.writeUnsignedNumber(2, this.serverCapabilities1);
- writer.writeUnsignedNumber(1, this.serverLanguage);
- writer.writeUnsignedNumber(2, this.serverStatus);
- writer.writeUnsignedNumber(2, this.serverCapabilities2);
- writer.writeUnsignedNumber(1, this.scrambleLength);
- writer.writeFiller(10);
- writer.writeNullTerminatedBuffer(this.scrambleBuff2);
- if (this.pluginData !== undefined) {
- writer.writeNullTerminatedString(this.pluginData);
- }
- };
- HandshakeInitializationPacket.prototype.scrambleBuff = function() {
- var buffer = new Buffer(this.scrambleBuff1.length + this.scrambleBuff2.length);
- this.scrambleBuff1.copy(buffer);
- this.scrambleBuff2.copy(buffer, this.scrambleBuff1.length);
- return buffer;
- };
|