summaryrefslogtreecommitdiffstats
path: root/neethi/src/assertion.c
diff options
context:
space:
mode:
Diffstat (limited to 'neethi/src/assertion.c')
-rw-r--r--neethi/src/assertion.c424
1 files changed, 424 insertions, 0 deletions
diff --git a/neethi/src/assertion.c b/neethi/src/assertion.c
new file mode 100644
index 0000000..29c70be
--- /dev/null
+++ b/neethi/src/assertion.c
@@ -0,0 +1,424 @@
+/*
+ * 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 <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);
+ }
+ }
+ 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;
+}