public static AMQPHeader getSASL(IByteBuffer buf) { TLVAmqp list = TLVFactory.getTlv(buf); if (list.Code != AMQPType.LIST_0 && list.Code != AMQPType.LIST_8 && list.Code != AMQPType.LIST_32) { throw new MalformedMessageException("Received amqp-header with malformed arguments"); } AMQPHeader header = null; Byte byteCode = list.Constructor.getDescriptorCode().Value; HeaderCodes code = (HeaderCodes)byteCode; switch (code) { case HeaderCodes.CHALLENGE: header = new SASLChallenge(); break; case HeaderCodes.INIT: header = new SASLInit(); break; case HeaderCodes.MECHANISMS: header = new SASLMechanisms(); break; case HeaderCodes.OUTCOME: header = new SASLOutcome(); break; case HeaderCodes.RESPONSE: header = new SASLResponse(); break; default: throw new MalformedMessageException("Received sasl-header with unrecognized arguments code"); } header.fillArguments((TLVList)list); return(header); }
public void ProcessSASLMechanism(List <AMQPSymbol> _mechanisms, int channel, int headerType) { AMQPSymbol plainMechanism = null; foreach (AMQPSymbol mechanism in _mechanisms) { if (mechanism.Value.ToLower() == "plain") { plainMechanism = mechanism; break; } } //currently supporting only plain if (plainMechanism == null) { _timers.StopAllTimers(); _client.Shutdown(); SetState(ConnectionState.CONNECTION_FAILED); return; } SASLInit saslInit = new SASLInit(); saslInit.HeaderType = headerType; saslInit.Channel = channel; saslInit.Mechanism = plainMechanism.Value; byte[] userBytes = Encoding.UTF8.GetBytes(_username); byte[] passwordBytes = Encoding.UTF8.GetBytes(_password); byte[] challenge = new byte[userBytes.Length + 1 + userBytes.Length + 1 + passwordBytes.Length]; Array.Copy(userBytes, 0, challenge, 0, userBytes.Length); challenge[userBytes.Length] = 0x00; Array.Copy(userBytes, 0, challenge, userBytes.Length + 1, userBytes.Length); challenge[userBytes.Length + 1 + userBytes.Length] = 0x00; Array.Copy(passwordBytes, 0, challenge, userBytes.Length + 1 + userBytes.Length + 1, passwordBytes.Length); saslInit.InitialResponse = challenge; _client.Send(saslInit); }