in source/credentials_provider_sts_web_identity.c [264:325]
static bool s_on_creds_node_encountered_fn(struct aws_xml_parser *parser, struct aws_xml_node *node, void *user_data) {
struct aws_byte_cursor node_name;
AWS_ZERO_STRUCT(node_name);
if (aws_xml_node_get_name(node, &node_name)) {
AWS_LOGF_ERROR(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"(id=%p): While parsing credentials xml response for sts web identity credentials provider, could not get "
"xml node name for function s_on_creds_node_encountered_fn.",
user_data);
return false;
}
if (aws_byte_cursor_eq_c_str_ignore_case(&node_name, "AssumeRoleWithWebIdentityResponse") ||
aws_byte_cursor_eq_c_str_ignore_case(&node_name, "AssumeRoleWithWebIdentityResult") ||
aws_byte_cursor_eq_c_str_ignore_case(&node_name, "Credentials")) {
return aws_xml_node_traverse(parser, node, s_on_creds_node_encountered_fn, user_data);
}
struct sts_web_identity_user_data *query_user_data = user_data;
struct aws_byte_cursor credential_data;
AWS_ZERO_STRUCT(credential_data);
if (aws_byte_cursor_eq_c_str_ignore_case(&node_name, "AccessKeyId")) {
aws_xml_node_as_body(parser, node, &credential_data);
query_user_data->access_key_id =
aws_string_new_from_array(query_user_data->allocator, credential_data.ptr, credential_data.len);
}
if (aws_byte_cursor_eq_c_str_ignore_case(&node_name, "SecretAccessKey")) {
aws_xml_node_as_body(parser, node, &credential_data);
query_user_data->secret_access_key =
aws_string_new_from_array(query_user_data->allocator, credential_data.ptr, credential_data.len);
}
if (aws_byte_cursor_eq_c_str_ignore_case(&node_name, "SessionToken")) {
aws_xml_node_as_body(parser, node, &credential_data);
query_user_data->session_token =
aws_string_new_from_array(query_user_data->allocator, credential_data.ptr, credential_data.len);
}
/* As long as we parsed an usable expiration, use it, otherwise use
* the existing one: now + 900s, initialized before parsing.
*/
if (aws_byte_cursor_eq_c_str_ignore_case(&node_name, "Expiration")) {
aws_xml_node_as_body(parser, node, &credential_data);
if (credential_data.len != 0) {
struct aws_date_time expiration;
if (aws_date_time_init_from_str_cursor(&expiration, &credential_data, AWS_DATE_FORMAT_ISO_8601) ==
AWS_OP_SUCCESS) {
query_user_data->expiration_timepoint_in_seconds = (uint64_t)aws_date_time_as_epoch_secs(&expiration);
} else {
query_user_data->error_code = aws_last_error();
AWS_LOGF_ERROR(
AWS_LS_AUTH_CREDENTIALS_PROVIDER,
"Failed to parse time string from sts web identity xml response: %s",
aws_error_str(query_user_data->error_code));
}
}
}
return true;
}