in src/saslclientio.c [515:592]
static int send_sasl_init(SASL_CLIENT_IO_INSTANCE* sasl_client_io, const char* sasl_mechanism_name)
{
int result;
SASL_INIT_HANDLE sasl_init;
SASL_MECHANISM_BYTES init_bytes;
init_bytes.length = 0;
init_bytes.bytes = NULL;
/* Codes_SRS_SASLCLIENTIO_01_045: [The name of the SASL mechanism used for the SASL exchange.] */
sasl_init = sasl_init_create(sasl_mechanism_name);
if (sasl_init == NULL)
{
/* Codes_SRS_SASLCLIENTIO_01_119: [If any error is encountered when parsing the received frame, the `on_io_open_complete` callback shall be triggered with `IO_OPEN_ERROR`.]*/
LogError("Could not create sasl_init");
result = MU_FAILURE;
}
else
{
/* Codes_SRS_SASLCLIENTIO_01_048: [The contents of this data are defined by the SASL security mechanism.] */
if (saslmechanism_get_init_bytes(sasl_client_io->sasl_mechanism, &init_bytes) != 0)
{
/* Codes_SRS_SASLCLIENTIO_01_119: [If any error is encountered when parsing the received frame, the `on_io_open_complete` callback shall be triggered with `IO_OPEN_ERROR`.]*/
LogError("Could not get SASL init bytes");
result = MU_FAILURE;
}
else
{
amqp_binary creds;
creds.bytes = init_bytes.bytes;
creds.length = init_bytes.length;
if ((init_bytes.length > 0) &&
/* Codes_SRS_SASLCLIENTIO_01_047: [A block of opaque data passed to the security mechanism.] */
(sasl_init_set_initial_response(sasl_init, creds) != 0))
{
/* Codes_SRS_SASLCLIENTIO_01_119: [If any error is encountered when parsing the received frame, the `on_io_open_complete` callback shall be triggered with `IO_OPEN_ERROR`.]*/
LogError("Could not set initial response");
result = MU_FAILURE;
}
else
{
AMQP_VALUE sasl_init_value = amqpvalue_create_sasl_init(sasl_init);
if (sasl_init_value == NULL)
{
/* Codes_SRS_SASLCLIENTIO_01_119: [If any error is encountered when parsing the received frame, the `on_io_open_complete` callback shall be triggered with `IO_OPEN_ERROR`.]*/
LogError("Could not create SASL init");
result = MU_FAILURE;
}
else
{
/* Codes_SRS_SASLCLIENTIO_01_070: [When a frame needs to be sent as part of the SASL handshake frame exchange, the send shall be done by calling `sasl_frame_codec_encode_frame`.]*/
if (sasl_frame_codec_encode_frame(sasl_client_io->sasl_frame_codec, sasl_init_value, on_bytes_encoded, sasl_client_io) != 0)
{
/* Codes_SRS_SASLCLIENTIO_01_071: [If `sasl_frame_codec_encode_frame` fails, then the `on_io_error` callback shall be triggered.]*/
LogError("Could not encode SASL init value");
result = MU_FAILURE;
}
else
{
if (sasl_client_io->is_trace_on != 0)
{
log_outgoing_frame(sasl_init_value);
}
result = 0;
}
amqpvalue_destroy(sasl_init_value);
}
}
}
sasl_init_destroy(sasl_init);
}
return result;
}