/// <summary> /// Server receives the client init that may contain the initial response message. /// </summary> void OnSaslInit(SaslInit init) { if (this.state != SaslState.WaitingForInit) { throw new AmqpException(AmqpError.IllegalState, SRClient.AmqpIllegalOperationState("R:SASL-INIT", this.state)); } Utils.Trace(TraceLevel.Verbose, "{0}: on sasl init. mechanism: {1}", this.transport, init.Mechanism.Value); this.state = SaslState.Negotiating; this.saslHandler = this.provider.GetHandler(init.Mechanism.Value, true); this.saslHandler.Start(this, init, false); }
protected void TransitState(string operation, StateTransition[] states, out StateTransition state) { state = null; lock (this.ThisLock) { foreach (StateTransition st in states) { if (st.From == this.State) { this.State = st.To; state = st; break; } } } if (state == null) { throw new AmqpException(AmqpError.IllegalState, SRClient.AmqpIllegalOperationState(operation, this.State)); } Utils.Trace(TraceLevel.Info, "{0}: {1} {2} -> {3}", this, operation, state.From, state.To); }
/// <summary> /// Client receives the announced server mechanisms. /// </summary> void OnSaslServerMechanisms(SaslMechanisms mechanisms) { if (this.state != SaslState.WaitingForServerMechanisms) { throw new AmqpException(AmqpError.IllegalState, SRClient.AmqpIllegalOperationState("R:SASL-MECH", this.state)); } Utils.Trace(TraceLevel.Verbose, "{0}: on sasl server mechanisms", this.transport); string mechanismToUse = null; foreach (string mechanism in this.provider.Mechanisms) { if (mechanisms.SaslServerMechanisms.Contains(new AmqpSymbol(mechanism))) { mechanismToUse = mechanism; break; } if (mechanismToUse != null) { break; } } if (mechanismToUse == null) { throw new AmqpException(AmqpError.NotFound, SRClient.AmqpNotSupportMechanism); } this.state = SaslState.Negotiating; this.saslHandler = this.provider.GetHandler(mechanismToUse, false); SaslInit init = new SaslInit(); init.Mechanism = mechanismToUse; this.saslHandler.Start(this, init, true); }