blob: 86597dc103eb3a8aaa7be5cc1860af083e162916 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <neethi_assertion.h>
#include <axiom_util.h>
#include <axiom_node.h>
#include <rp_x509_token.h>
#include <rp_property.h>
#include <rp_layout.h>
#include <rp_algorithmsuite.h>
#include <rp_wss10.h>
#include <rp_wss11.h>
#include <rp_trust10.h>
#include <rp_supporting_tokens.h>
#include <rp_username_token.h>
#include <rp_asymmetric_binding.h>
#include <rp_rampart_config.h>
#include <rp_signed_encrypted_parts.h>
#include <rp_symmetric_binding.h>
#include <rp_transport_binding.h>
#include <rp_saml_token.h>
#include <rp_issued_token.h>
struct neethi_assertion_t
{
void *value;
neethi_assertion_type_t type;
axutil_array_list_t *policy_components;
axiom_element_t *element;
axiom_node_t *node;
axis2_bool_t is_optional;
AXIS2_FREE_VOID_ARG free_func;
};
AXIS2_EXTERN neethi_assertion_t *AXIS2_CALL
neethi_assertion_create(
const axutil_env_t *env)
{
neethi_assertion_t *neethi_assertion = NULL;
AXIS2_ENV_CHECK(env, NULL);
neethi_assertion = (neethi_assertion_t *)AXIS2_MALLOC(env->allocator,
sizeof(neethi_assertion_t));
if(neethi_assertion == NULL)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Out of memory");
return NULL;
}
neethi_assertion->policy_components = NULL;
neethi_assertion->policy_components = axutil_array_list_create(env, 0);
if(!(neethi_assertion->policy_components))
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Out of memory");
return NULL;
}
neethi_assertion->value = NULL;
neethi_assertion->type = ASSERTION_TYPE_UNKNOWN;
neethi_assertion->element = NULL;
neethi_assertion->is_optional = AXIS2_FALSE;
neethi_assertion->node = NULL;
neethi_assertion->free_func = 0;
return neethi_assertion;
}
neethi_assertion_t *AXIS2_CALL
neethi_assertion_create_with_args(
const axutil_env_t *env,
AXIS2_FREE_VOID_ARG free_func,
void *value,
neethi_assertion_type_t type)
{
neethi_assertion_t *neethi_assertion = NULL;
neethi_assertion = (neethi_assertion_t *)AXIS2_MALLOC(env->allocator,
sizeof(neethi_assertion_t));
if(!neethi_assertion)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Neethi assertion creation failed. Out of memory");
return NULL;
}
neethi_assertion->policy_components = NULL;
neethi_assertion->policy_components = axutil_array_list_create(env, 0);
if(!(neethi_assertion->policy_components))
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Neethi assertion policy components creation failed.");
return NULL;
}
/* This ref count is for asertions which are represented from a struct.
* These assertion structs are more probably referenced from some other
* struct. So we need to increment the ref count in order to prevent
* unnecessary memory freeing */
if(type == ASSERTION_TYPE_X509_TOKEN)
{
rp_x509_token_increment_ref((rp_x509_token_t *)value, env);
}
else if(type == ASSERTION_TYPE_SECURITY_CONTEXT_TOKEN)
{
rp_security_context_token_increment_ref((rp_security_context_token_t *)value, env);
}
else if(type == ASSERTION_TYPE_INITIATOR_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_RECIPIENT_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_PROTECTION_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_ENCRYPTION_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_TRANSPORT_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_SIGNATURE_TOKEN)
{
rp_property_increment_ref((rp_property_t *)value, env);
}
else if(type == ASSERTION_TYPE_LAYOUT)
{
rp_layout_increment_ref((rp_layout_t *)value, env);
}
else if(type == ASSERTION_TYPE_ALGORITHM_SUITE)
{
rp_algorithmsuite_increment_ref((rp_algorithmsuite_t *)value, env);
}
else if(type == ASSERTION_TYPE_WSS10)
{
rp_wss10_increment_ref((rp_wss10_t *)value, env);
}
else if(type == ASSERTION_TYPE_WSS11)
{
rp_wss11_increment_ref((rp_wss11_t *)value, env);
}
else if(type == ASSERTION_TYPE_TRUST10)
{
rp_trust10_increment_ref((rp_trust10_t *)value, env);
}
else if(type == ASSERTION_TYPE_SUPPORTING_TOKENS)
{
rp_supporting_tokens_increment_ref((rp_supporting_tokens_t *)value, env);
}
else if(type == ASSERTION_TYPE_USERNAME_TOKEN)
{
rp_username_token_increment_ref((rp_username_token_t *)value, env);
}
else if(type == ASSERTION_TYPE_ASSYMMETRIC_BINDING)
{
rp_asymmetric_binding_increment_ref((rp_asymmetric_binding_t *)value, env);
}
else if(type == ASSERTION_TYPE_SYMMETRIC_BINDING)
{
rp_symmetric_binding_increment_ref((rp_symmetric_binding_t *)value, env);
}
else if(type == ASSERTION_TYPE_TRANSPORT_BINDING)
{
rp_transport_binding_increment_ref((rp_transport_binding_t *)value, env);
}
else if(type == ASSERTION_TYPE_SIGNED_ENCRYPTED_PARTS)
{
rp_signed_encrypted_parts_increment_ref((rp_signed_encrypted_parts_t *)value, env);
}
else if(type == ASSERTION_TYPE_RAMPART_CONFIG)
{
rp_rampart_config_increment_ref((rp_rampart_config_t *)value, env);
}
else if(type == ASSERTION_TYPE_ISSUED_TOKEN)
{
rp_issued_token_increment_ref((rp_issued_token_t *)value, env);
}
else if(type == ASSERTION_TYPE_SAML_TOKEN)
{
rp_saml_token_increment_ref((rp_saml_token_t *)value, env);
}
neethi_assertion->value = value;
neethi_assertion->type = type;
neethi_assertion->element = NULL;
neethi_assertion->is_optional = AXIS2_FALSE;
neethi_assertion->node = NULL;
neethi_assertion->free_func = free_func;
return neethi_assertion;
}
AXIS2_EXTERN void AXIS2_CALL
neethi_assertion_free(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
if(neethi_assertion)
{
if(neethi_assertion->policy_components)
{
int i = 0;
for(i = 0; i < axutil_array_list_size(neethi_assertion->policy_components, env); i++)
{
neethi_operator_t *operator = NULL;
operator = (neethi_operator_t *)axutil_array_list_get(
neethi_assertion->policy_components, env, i);
if(operator)
neethi_operator_free(operator, env);
operator = NULL;
}
axutil_array_list_free(neethi_assertion->policy_components, env);
neethi_assertion->policy_components = NULL;
}
if(neethi_assertion->value)
{
if(neethi_assertion->free_func)
{
neethi_assertion->free_func(neethi_assertion->value, env);
}
}
if(neethi_assertion->node)
{
axiom_node_free_tree(neethi_assertion->node, env);
neethi_assertion->node = NULL;
}
AXIS2_FREE(env->allocator, neethi_assertion);
neethi_assertion = NULL;
}
return;
}
/* Implementations */
AXIS2_EXTERN neethi_assertion_type_t AXIS2_CALL
neethi_assertion_get_type(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return neethi_assertion->type;
}
AXIS2_EXTERN void *AXIS2_CALL
neethi_assertion_get_value(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return neethi_assertion->value;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_set_value(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env,
void *value,
neethi_assertion_type_t type)
{
neethi_assertion->type = type;
if(type == ASSERTION_TYPE_X509_TOKEN)
{
rp_x509_token_increment_ref((rp_x509_token_t *)value, env);
}
neethi_assertion->value = (void *)value;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axiom_element_t *AXIS2_CALL
neethi_assertion_get_element(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
return neethi_assertion->element;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_set_element(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env,
axiom_element_t *element)
{
neethi_assertion->element = element;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axiom_node_t *AXIS2_CALL
neethi_assertion_get_node(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return neethi_assertion->node;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_set_node(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env,
axiom_node_t * node)
{
if(neethi_assertion->node)
{
axiom_node_free_tree(neethi_assertion->node, env);
neethi_assertion->node = NULL;
}
if(node)
{
neethi_assertion->node = axiom_util_clone_node(env, node);
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
neethi_assertion_get_is_optional(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return neethi_assertion->is_optional;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_set_is_optional(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env,
axis2_bool_t is_optional)
{
neethi_assertion->is_optional = is_optional;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
neethi_assertion_get_policy_components(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return neethi_assertion->policy_components;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_add_policy_components(
neethi_assertion_t *neethi_assertion,
axutil_array_list_t *arraylist,
const axutil_env_t *env)
{
int size = axutil_array_list_size(arraylist, env);
int i = 0;
if(axutil_array_list_ensure_capacity(neethi_assertion->policy_components, env, size + 1)
!= AXIS2_SUCCESS)
return AXIS2_FAILURE;
for(i = 0; i < size; i++)
{
void *value = NULL;
value = axutil_array_list_get(arraylist, env, i);
neethi_operator_increment_ref((neethi_operator_t *)value, env);
axutil_array_list_add(neethi_assertion->policy_components, env, value);
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_add_operator(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env,
neethi_operator_t *operator)
{
neethi_operator_increment_ref(operator, env);
axutil_array_list_add(neethi_assertion->policy_components, env, operator);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
neethi_assertion_is_empty(
neethi_assertion_t *neethi_assertion,
const axutil_env_t *env)
{
return axutil_array_list_is_empty(neethi_assertion->policy_components, env);
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
neethi_assertion_serialize(
neethi_assertion_t *assertion,
axiom_node_t *parent,
const axutil_env_t *env)
{
axiom_node_t *node = NULL;
if(assertion->node)
{
node = axiom_util_clone_node(env, assertion->node);
}
if(!node)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"assertion node creation failed. Cannot serialize assertion");
return AXIS2_FAILURE;
}
axiom_node_add_child(parent, env, node);
return AXIS2_SUCCESS;
}