module EventMachine::Protocols::SASLauthclient

def post_init

def post_init
  @sasl_data = ""
  @queries = []
end

def receive_data data

def receive_data data
  @sasl_data << data
  while @sasl_data.length > 2
    len = (@sasl_data[0,2].unpack("n")).first
    raise "SASL Max Field Length exceeded" if len > MaxFieldSize
    if @sasl_data.length >= (len + 2)
      val = @sasl_data[2,len]
      @sasl_data.slice!(0...(2+len))
      q = @queries.pop
      (val == "NO") ? q.fail : q.succeed
    else
      break
    end
  end
end

def validate? username, psw, sysname=nil, realm=nil

def validate? username, psw, sysname=nil, realm=nil
  str = [username, psw, sysname, realm].map {|m|
    [(m || "").length, (m || "")]
  }.flatten.pack( "nA*" * 4 )
  send_data str
  d = EM::DefaultDeferrable.new
  @queries.unshift d
  d
end