in src/omxmlsec/saml/request.c [157:316]
AXIS2_EXTERN int AXIS2_CALL saml_request_build(saml_request_t *request,
axiom_node_t *node,
const axutil_env_t *env)
{
/*populate the saml request struct from the axiom om node struct*/
axutil_hash_t *attr_hash = NULL;
axiom_element_t *element = NULL;
axutil_hash_index_t *hi = NULL;
axiom_child_element_iterator_t *iterator = NULL;
axiom_node_t *child_node = NULL;
axis2_char_t *element_local_name = NULL;
saml_artifact_t *artifact = NULL;
if (axiom_node_get_node_type(node, env) != AXIOM_ELEMENT)
{
return AXIS2_FAILURE;
}
if ((element = axiom_node_get_data_element(node, env)) == NULL)
{
return AXIS2_FAILURE;
}
/* Get all the the attributes */
attr_hash = axiom_element_get_all_attributes(element, env);
request->original_xml = node;
if(attr_hash)
{
/*for each attribute*/
for (hi = axutil_hash_first(attr_hash, env); hi; hi = axutil_hash_next(env, hi))
{
void *v = NULL;
axutil_hash_this(hi, NULL, NULL, &v);
if (v)
{
axis2_char_t *attr_val = NULL;
axiom_attribute_t *attr = (axiom_attribute_t*)v;
attr_val = axiom_attribute_get_value(attr, env);
if(!axutil_strcmp(axiom_attribute_get_localname(attr, env), SAML_REQUEST_ID))
{
request->request_id = attr_val;
}
else if(!axutil_strcmp(axiom_attribute_get_localname(attr, env), SAML_MAJORVERSION))
{
request->major_version = attr_val;
}
else if(!axutil_strcmp(axiom_attribute_get_localname(attr, env), SAML_MINORVERSION))
{
request->minor_version = attr_val;
}
else if(!axutil_strcmp(axiom_attribute_get_localname(attr, env), SAML_ISSUE_INSTANT))
{
request->issue_instant = axutil_date_time_create(env);
axutil_date_time_deserialize_date(request->issue_instant, env, attr_val);
}
}
}
}
/* Get all child elements of <samlp:Request>*/
iterator = axiom_element_get_child_elements(element, env, node);
if(iterator)
{
while(axiom_child_element_iterator_has_next(iterator, env))
{
child_node = axiom_child_element_iterator_next(iterator, env);
element = (axiom_element_t *)axiom_node_get_data_element(child_node, env);
if(element)
element_local_name = axiom_element_get_localname(element, env);
if(element != NULL && !(axutil_strcmp(element_local_name, SAML_RESPOND_WITH)))
{
axutil_array_list_add(request->saml_responds,
env,
axiom_element_get_qname(element, env, child_node));
}
else if(element != NULL && !(axutil_strcmp(element_local_name,SAML_SIGNATURE)))
{
/*Set the reference of the <ds:Signature> of the request struct to verify*/
request->signature = child_node;
}
/* Check for the saml queries*/
else if(element != NULL && !(axutil_strcmp(element_local_name, SAML_SUBJECT_QUERY)))
{
request->query = saml_query_create(env);
if(request->query)
{
/*populate the saml subject query*/
request->query->type = element_local_name;
if(saml_query_build(request->query, child_node, env)== AXIS2_FAILURE)
{
saml_query_free(request->query, env);
}
}
}
else if(element != NULL && !(axutil_strcmp(element_local_name,SAML_AUTHENTICATION_QUERY)))
{
request->query = saml_query_create(env);
if(request->query)
{
/*populate the saml authentication query*/
request->query->type = axutil_strdup(env, element_local_name);
if(saml_query_build(request->query, child_node, env)== AXIS2_FAILURE)
{
saml_query_free(request->query, env);
}
}
}
else if(element != NULL && !(axutil_strcmp(element_local_name,SAML_AUTHORIZATION_DECISION_QUERY)))
{
request->query = saml_query_create(env);
if(request->query)
{
/*populate the saml authorization decision query*/
request->query->type = axutil_strdup(env, element_local_name);;
if(saml_query_build(request->query, child_node, env)== AXIS2_FAILURE)
{
saml_query_free(request->query, env);
}
}
}
else if(element != NULL && !(axutil_strcmp(element_local_name, SAML_ATTRIBUTE_QUERY)))
{
request->query = saml_query_create(env);
if(request->query)
{
/*populate the saml attribute query*/
request->query->type = axutil_strdup(env, element_local_name);;
if(saml_query_build(request->query, child_node, env)== AXIS2_FAILURE)
{
saml_query_free(request->query, env);
}
}
}
else if(element != NULL && !(axutil_strcmp(element_local_name,SAML_ASSERTION_ID_REFERENCE)))
{
axutil_array_list_add(request->saml_asserion_id_ref,
env,
axiom_element_get_text(element, env, child_node));
}
else if(element != NULL && !(axutil_strcmp(element_local_name, SAML_ASSERTION_ARTIFACT)))
{
artifact = saml_artifact_create(env);
if(artifact)
{
/*populate the saml artifacts*/
artifact->artifact = axiom_element_get_text(element, env, child_node);
axutil_array_list_add(request->saml_artifacts,
env,
artifact);
}
}
}
}
return AXIS2_SUCCESS;
}