| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | var Sequence        = require('./Sequence');var Util            = require('util');var Packets         = require('../packets');var Auth            = require('../Auth');var ClientConstants = require('../constants/client');module.exports = Handshake;Util.inherits(Handshake, Sequence);function Handshake(options, callback) {  Sequence.call(this, options, callback);  options = options || {};  this._config                        = options.config;  this._handshakeInitializationPacket = null;}Handshake.prototype.determinePacket = function determinePacket(firstByte, parser) {  if (firstByte === 0xff) {    return Packets.ErrorPacket;  }  if (!this._handshakeInitializationPacket) {    return Packets.HandshakeInitializationPacket;  }  if (firstByte === 0xfe) {    return (parser.packetLength() === 1)      ? Packets.UseOldPasswordPacket      : Packets.AuthSwitchRequestPacket;  }  return undefined;};Handshake.prototype['AuthSwitchRequestPacket'] = function (packet) {  var name = packet.authMethodName;  var data = Auth.auth(name, packet.authMethodData, {    password: this._config.password  });  if (data !== undefined) {    this.emit('packet', new Packets.AuthSwitchResponsePacket({      data: data    }));  } else {    var err   = new Error('MySQL is requesting the ' + name + ' authentication method, which is not supported.');    err.code  = 'UNSUPPORTED_AUTH_METHOD';    err.fatal = true;    this.end(err);  }};Handshake.prototype['HandshakeInitializationPacket'] = function(packet) {  this._handshakeInitializationPacket = packet;  this._config.protocol41 = packet.protocol41;  var serverSSLSupport = packet.serverCapabilities1 & ClientConstants.CLIENT_SSL;  if (this._config.ssl) {    if (!serverSSLSupport) {      var err = new Error('Server does not support secure connection');      err.code = 'HANDSHAKE_NO_SSL_SUPPORT';      err.fatal = true;      this.end(err);      return;    }    this._config.clientFlags |= ClientConstants.CLIENT_SSL;    this.emit('packet', new Packets.SSLRequestPacket({      clientFlags   : this._config.clientFlags,      maxPacketSize : this._config.maxPacketSize,      charsetNumber : this._config.charsetNumber    }));    this.emit('start-tls');  } else {    this._sendCredentials();  }};Handshake.prototype._tlsUpgradeCompleteHandler = function() {  this._sendCredentials();};Handshake.prototype._sendCredentials = function() {  var packet = this._handshakeInitializationPacket;  this.emit('packet', new Packets.ClientAuthenticationPacket({    clientFlags   : this._config.clientFlags,    maxPacketSize : this._config.maxPacketSize,    charsetNumber : this._config.charsetNumber,    user          : this._config.user,    database      : this._config.database,    protocol41    : packet.protocol41,    scrambleBuff  : (packet.protocol41)      ? Auth.token(this._config.password, packet.scrambleBuff())      : Auth.scramble323(packet.scrambleBuff(), this._config.password)  }));};Handshake.prototype['UseOldPasswordPacket'] = function() {  if (!this._config.insecureAuth) {    var err = new Error(      'MySQL server is requesting the old and insecure pre-4.1 auth mechanism. ' +      'Upgrade the user password or use the {insecureAuth: true} option.'    );    err.code = 'HANDSHAKE_INSECURE_AUTH';    err.fatal = true;    this.end(err);    return;  }  this.emit('packet', new Packets.OldPasswordPacket({    scrambleBuff: Auth.scramble323(this._handshakeInitializationPacket.scrambleBuff(), this._config.password)  }));};Handshake.prototype['ErrorPacket'] = function(packet) {  var err = this._packetToError(packet, true);  err.fatal = true;  this.end(err);};
 |