AXIS2_EXTERN int AXIS2_CALL saml_request_build()

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;


}