Author: milinda Date: Wed Nov 14 20:35:52 2007 New Revision: 595202 URL: http://svn.apache.org/viewvc?rev=595202&view=rev Log: Adding WS-Trust library implementation.
Added: webservices/rampart/trunk/c/src/trust/ webservices/rampart/trunk/c/src/trust/Makefile.am webservices/rampart/trunk/c/src/trust/context.c webservices/rampart/trunk/c/src/trust/policy_util.c webservices/rampart/trunk/c/src/trust/sts_client.c webservices/rampart/trunk/c/src/trust/token.c webservices/rampart/trunk/c/src/trust/util.c Modified: webservices/rampart/trunk/c/src/Makefile.am Modified: webservices/rampart/trunk/c/src/Makefile.am URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/Makefile.am?rev=595202&r1=595201&r2=595202&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/Makefile.am (original) +++ webservices/rampart/trunk/c/src/Makefile.am Wed Nov 14 20:35:52 2007 @@ -1 +1 @@ -SUBDIRS = omxmlsec handlers util core data +SUBDIRS = omxmlsec handlers util core data trust Added: webservices/rampart/trunk/c/src/trust/Makefile.am URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/trust/Makefile.am?rev=595202&view=auto ============================================================================== --- webservices/rampart/trunk/c/src/trust/Makefile.am (added) +++ webservices/rampart/trunk/c/src/trust/Makefile.am Wed Nov 14 20:35:52 2007 @@ -0,0 +1,16 @@ +lib_LTLIBRARIES = libtrust.la + +libtrust_la_SOURCES = context.c \ + util.c \ + sts_client.c \ + policy_util.c \ + token.c + +INCLUDES = -I$(top_builddir)/include \ + -I ../../../../util/include \ + -I ../../../../include \ + -I ../../../../axiom/include \ + @OPENSSLINC@ \ + @UTILINC@ \ + @AXIOMINC@ \ + @AXIS2INC@ Added: webservices/rampart/trunk/c/src/trust/context.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/trust/context.c?rev=595202&view=auto ============================================================================== --- webservices/rampart/trunk/c/src/trust/context.c (added) +++ webservices/rampart/trunk/c/src/trust/context.c Wed Nov 14 20:35:52 2007 @@ -0,0 +1,603 @@ +/* + * 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 <trust_context.h> + +struct trust_context +{ + /* in message context of STS */ + axis2_msg_ctx_t *in_msg_ctx; + + /* Axiom node which holds payload of RST message */ + axiom_node_t *rst_node; + + /** Request Type + * e.g. wsse:ReqIssue/Validate/Renew etc + */ + axis2_char_t *request_type; + + /** Required Token Type + * e.g. wsse:X509v3 + */ + axis2_char_t *token_type; + + /*optional element specifies the scope for which this security token is desired */ + axiom_node_t *applies_to_epr_node; + + axis2_char_t *applies_to_address; + + /** RST Context attribute + * This optional URI specifies an identifier/context for this request + */ + axis2_char_t *rst_context_attr; + + /* KeyType element of the RST */ + axis2_char_t *key_type; + + int key_size; + + axis2_char_t *request_entropy; + + axis2_char_t *response_entropy; + + /*optional element for specific set of requested claims */ + axiom_node_t *claims_node; + + /**wst:RequestSecurityToken/wst:[EMAIL PROTECTED] + *Attribute specifies a URI to indicate the syntax of the claims + */ + axis2_char_t *claims_dialect; + + /* SOAP Namespace */ + axis2_char_t *soap_namespace; + + /* WS-Trust Namespace */ + axis2_char_t *wst_namespace; + + /*Addressing NS */ + axis2_char_t *addressing_namespace; +}; + +AXIS2_EXTERN trust_context_t *AXIS2_CALL +trust_context_create( + const axutil_env_t * env, + axis2_msg_ctx_t * in_msg_ctx) +{ + axiom_soap_envelope_t *soap_env = NULL; + axiom_soap_body_t *soap_body = NULL; + axiom_namespace_t *soap_ns = NULL; + axiom_namespace_t *wst_ns = NULL; + axiom_node_t *body_base_node = NULL; + axiom_element_t *rst_ele = NULL; + + trust_context_t *trust_context = NULL; + trust_context = (trust_context_t *) AXIS2_MALLOC(env->allocator, sizeof(trust_context_t)); + + /* Processing Message Context*/ + soap_env = axis2_msg_ctx_get_soap_envelope(in_msg_ctx, env); + soap_body = axiom_soap_envelope_get_body(soap_env, env); + body_base_node = axiom_soap_body_get_base_node(soap_body, env); + trust_context->rst_node = axiom_node_get_first_child(body_base_node, env); + + /* rocessing SOAP Namespace */ + soap_ns = axiom_soap_envelope_get_namespace(soap_env, env); + trust_context->soap_namespace = axiom_namespace_get_uri(soap_ns, env); + + /* Processing WS-Trust namespace*/ + rst_ele = (axiom_element_t *) axiom_node_get_data_element(trust_context->rst_node, env); + wst_ns = axiom_element_get_namespace(rst_ele, env, trust_context->rst_node); + + trust_context->wst_namespace = axiom_namespace_get_uri(wst_ns, env); + + trust_context_process_request_context(trust_context, env); + trust_context_process_request_type(trust_context, env); + trust_context_process_token_type(trust_context, env); + trust_context_process_applies_to(trust_context, env); + trust_context_process_claims(trust_context, env); + trust_context_process_entropy(trust_context, env); + trust_context_process_key_type(trust_context, env); + trust_context_process_key_size(trust_context, env); + + return trust_context; +} + +AXIS2_EXTERN void AXIS2_CALL +trust_context_free( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + if (trust_context) + { + AXIS2_FREE(env->allocator, trust_context); + } +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_applies_to( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + axutil_qname_t *applies_to_qname = NULL; + axutil_qname_t *addr_qname = NULL; + axiom_node_t *appliesto_node = NULL; + axiom_node_t *rst_node = NULL; + axiom_node_t *epr_node = NULL; + axiom_node_t *addr_node = NULL; + axiom_element_t *appliesto_ele = NULL; + axiom_element_t *rst_ele = NULL; + axiom_element_t *epr_ele = NULL; + axiom_element_t *addr_ele = NULL; + axiom_namespace_t *addr_namespace = NULL; + + + rst_node = trust_context->rst_node; + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(rst_node, env)); + + applies_to_qname = axutil_qname_create(env, TRUST_APPLIES_TO, TRUST_WSP_XMLNS, TRUST_WSP); + + appliesto_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, applies_to_qname, rst_node, + &appliesto_node); + if (appliesto_ele) + { + epr_ele = axiom_element_get_first_element(appliesto_ele, env, appliesto_node, &epr_node); + + trust_context->applies_to_epr_node = epr_node; + + if (!trust_context->addressing_namespace) + { + addr_namespace = axiom_element_find_namespace(epr_ele, env, epr_node, "http://schemas.xmlsoap.org/ws/2004/08/addressing", NULL); + if(!addr_namespace) + { + addr_namespace = axiom_element_find_namespace(epr_ele, env, epr_node, "http://www.w3.org/2005/08/addressing", NULL); + } + if(addr_namespace) + { + trust_context->addressing_namespace = axiom_namespace_get_uri(addr_namespace, env); + } + } + + if (epr_ele && addr_namespace) + { + addr_qname = + axutil_qname_create(env, EPR_ADDRESS, trust_context->addressing_namespace, NULL); + addr_ele = + axiom_element_get_first_child_with_qname(epr_ele, env, addr_qname, epr_node, + &addr_node); + if (addr_ele && axiom_element_get_text(addr_ele, env, addr_node)) + { + trust_context->applies_to_address = axiom_element_get_text(addr_ele, env, addr_node); + } + } + else + { + AXIS2_FREE(env->allocator, applies_to_qname); + return AXIS2_FAILURE; + } + + } + else + { + AXIS2_FREE(env->allocator, applies_to_qname); + return AXIS2_FAILURE; + } + AXIS2_FREE(env->allocator, applies_to_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_request_context( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + axiom_element_t *rst_ele = NULL; + axutil_qname_t *attr_ctx_qname = NULL; + axis2_char_t *context = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + attr_ctx_qname = axutil_qname_create(env, TRUST_RST_CONTEXT, TRUST_WST_XMLNS, TRUST_WST); + if (!attr_ctx_qname) + return AXIS2_FAILURE; + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(trust_context->rst_node, env)); + context = axiom_element_get_attribute_value(rst_ele, env, attr_ctx_qname); + + if (context) + { + trust_context->rst_context_attr = context; + AXIS2_FREE(env->allocator, attr_ctx_qname); + return AXIS2_SUCCESS; + } + AXIS2_FREE(env->allocator, attr_ctx_qname); + return AXIS2_FAILURE; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_request_type( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + axiom_element_t *req_type_ele = NULL; + axiom_element_t *rst_ele = NULL; + axiom_node_t *rst_node = NULL; + axiom_node_t *req_type_node = NULL; + axutil_qname_t *req_type_qname = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + rst_node = trust_context->rst_node; + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(rst_node, env)); + + req_type_qname = + axutil_qname_create(env, TRUST_REQUEST_TYPE, trust_context->wst_namespace, TRUST_WST); + + req_type_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, req_type_qname, rst_node, + &req_type_node); + if (!req_type_ele) + { + AXIS2_FREE(env->allocator, req_type_qname); + return AXIS2_FAILURE; + } + + trust_context->request_type = axiom_element_get_text(req_type_ele, env, req_type_node); + + AXIS2_FREE(env->allocator, req_type_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_token_type( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + axiom_node_t *token_type_node = NULL; + axiom_element_t *token_type_ele = NULL; + axiom_element_t *rst_ele = NULL; + axutil_qname_t *token_type_qname = NULL; + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(trust_context->rst_node, env)); + + token_type_qname = + axutil_qname_create(env, TRUST_TOKEN_TYPE, trust_context->wst_namespace, TRUST_WST); + + token_type_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, token_type_qname, + trust_context->rst_node, &token_type_node); + if (!token_type_ele) + { + AXIS2_FREE(env->allocator, token_type_qname); + return AXIS2_FAILURE; + } + + trust_context->token_type = axiom_element_get_text(token_type_ele, env, token_type_node); + + AXIS2_FREE(env->allocator, token_type_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_claims( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + axiom_node_t *claims_node = NULL; + axiom_element_t *claims_ele = NULL; + axiom_element_t *rst_ele = NULL; + axutil_qname_t *claims_qname = NULL; + axutil_qname_t *attr_dialect_qname = NULL; + axis2_char_t *dialect = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(trust_context->rst_node, env)); + + claims_qname = axutil_qname_create(env, TRUST_CLAIMS, trust_context->wst_namespace, TRUST_WST); + + claims_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, claims_qname, trust_context->rst_node, + &claims_node); + if (!claims_ele) + { + AXIS2_FREE(env->allocator, claims_qname); + return AXIS2_FAILURE; + } + + trust_context->claims_node = claims_node; + + attr_dialect_qname = + axutil_qname_create(env, TRUST_CLAIMS_DIALECT, trust_context->wst_namespace, TRUST_WST); + if (!attr_dialect_qname) + { + AXIS2_FREE(env->allocator, claims_qname); + return AXIS2_FAILURE; + } + + dialect = axiom_element_get_attribute_value(claims_ele, env, attr_dialect_qname); + + if (!dialect) + { + AXIS2_FREE(env->allocator, claims_qname); + AXIS2_FREE(env->allocator, attr_dialect_qname); + return AXIS2_FAILURE; + } + trust_context->claims_dialect = dialect; + + AXIS2_FREE(env->allocator, claims_qname); + AXIS2_FREE(env->allocator, attr_dialect_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_entropy( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + /* TO DO: Complete the entropy processing */ + axiom_node_t *entropy_node = NULL; + axiom_node_t *binary_secret_node = NULL; + axiom_element_t *entropy_ele = NULL; + axiom_element_t *rst_ele = NULL; + axiom_element_t *binary_secret_ele = NULL; + axutil_qname_t *entropy_qname = NULL; + axis2_char_t *bin_sec_str = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(trust_context->rst_node, env)); + + entropy_qname = axutil_qname_create(env, TRUST_ENTROPY, trust_context->wst_namespace, TRUST_WST); + + entropy_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, entropy_qname, trust_context->rst_node, + &entropy_node); + if (!entropy_ele) + { + AXIS2_FREE(env->allocator, entropy_qname); + return AXIS2_FAILURE; + } + + binary_secret_ele = + axiom_element_get_first_element(entropy_ele, env, entropy_node, &binary_secret_node); + bin_sec_str = axiom_element_get_text(binary_secret_ele, env, binary_secret_node); + + if (binary_secret_ele && bin_sec_str && (axutil_strcmp("", bin_sec_str) != 0)) + { + /*axutil_base64_decode(trust_context->request_entropy, bin_sec_str);*/ + trust_context->request_entropy = bin_sec_str; + } + else + { + AXIS2_FREE(env->allocator, entropy_qname); + return AXIS2_FAILURE; + } + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_key_type( + trust_context_t * data, + const axutil_env_t * env) +{ + axiom_node_t *key_type_node = NULL; + axiom_element_t *key_type_ele = NULL; + axiom_element_t *rst_ele = NULL; + axutil_qname_t *key_type_qname = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(data->rst_node, env)); + + key_type_qname = axutil_qname_create(env, TRUST_KEY_TYPE, data->wst_namespace, TRUST_WST); + + key_type_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, key_type_qname, data->rst_node, + &key_type_node); + if (!key_type_ele) + { + AXIS2_FREE(env->allocator, key_type_qname); + return AXIS2_FAILURE; + } + + data->key_type = axiom_element_get_text(key_type_ele, env, key_type_node); + + AXIS2_FREE(env->allocator, key_type_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_process_key_size( + trust_context_t * data, + const axutil_env_t * env) +{ + axiom_node_t *key_size_node = NULL; + axiom_element_t *key_size_ele = NULL; + axiom_element_t *rst_ele = NULL; + axutil_qname_t *key_size_qname = NULL; + axis2_char_t *size_str = NULL; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + rst_ele = (axiom_element_t *) (axiom_node_get_data_element(data->rst_node, env)); + + key_size_qname = axutil_qname_create(env, TRUST_KEY_SIZE, data->wst_namespace, TRUST_WST); + + key_size_ele = + axiom_element_get_first_child_with_qname(rst_ele, env, key_size_qname, data->rst_node, + &key_size_node); + if (!key_size_ele) + { + AXIS2_FREE(env->allocator, key_size_qname); + return AXIS2_FAILURE; + } + + size_str = axiom_element_get_text(key_size_ele, env, key_size_node); + + if (!size_str) + { + AXIS2_FREE(env->allocator, key_size_qname); + return AXIS2_FAILURE; + } + + data->key_size = atoi(size_str); + AXIS2_FREE(env->allocator, key_size_qname); + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_context_get_request_type( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + return trust_context->request_type; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_set_request_type( + trust_context_t * trust_context, + const axutil_env_t * env, + axis2_char_t *request_type) +{ + if(request_type) + { + trust_context->request_type = request_type; + return AXIS2_SUCCESS; + } + + return AXIS2_FAILURE; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_context_get_token_type( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + return trust_context->token_type; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_set_token_type( + trust_context_t * trust_context, + const axutil_env_t * env, + axis2_char_t *token_type) +{ + if(token_type) + { + trust_context->token_type = token_type; + return AXIS2_SUCCESS; + } + return AXIS2_FAILURE; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +trust_context_get_rst_node( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + return trust_context->rst_node; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_context_set_rst_node( + trust_context_t * trust_context, + const axutil_env_t * env, + axiom_node_t *rst_node) +{ + if(rst_node) + { + trust_context->rst_node = rst_node; + return AXIS2_SUCCESS; + } + + return AXIS2_FAILURE; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_context_get_wst_ns( + trust_context_t * trust_context, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return trust_context->wst_namespace; +} + +AXIS2_EXTERN axis2_char_t * AXIS2_CALL +trust_context_get_appliesto_address( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->applies_to_address; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +trust_context_get_appliesto_epr_node( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->applies_to_epr_node; +} + +AXIS2_EXTERN axis2_char_t * AXIS2_CALL +trust_context_get_rst_context_attr( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->rst_context_attr; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_context_get_key_type( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->key_type; +} + +AXIS2_EXTERN int AXIS2_CALL +trust_context_get_key_size( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->key_size; +} + +AXIS2_EXTERN axis2_char_t * AXIS2_CALL +trust_context_get_request_entropy( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->request_entropy; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +trust_context_get_claims_node( + trust_context_t *trust_context, + const axutil_env_t *env) +{ + return trust_context->claims_node; +} + +AXIS2_EXTERN axis2_char_t * AXIS2_CALL +trust_context_get_claims_dialect( + trust_context_t * trust_context, + const axutil_env_t *env) +{ + return trust_context->claims_dialect; +} + Added: webservices/rampart/trunk/c/src/trust/policy_util.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/trust/policy_util.c?rev=595202&view=auto ============================================================================== --- webservices/rampart/trunk/c/src/trust/policy_util.c (added) +++ webservices/rampart/trunk/c/src/trust/policy_util.c Wed Nov 14 20:35:52 2007 @@ -0,0 +1,110 @@ +/* +* 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 <trust_policy_util.h> + +AXIS2_EXTERN rp_algorithmsuite_t *AXIS2_CALL +trust_policy_util_get_algorithmsuite( + const axutil_env_t * env, + neethi_policy_t * policy) +{ + rp_secpolicy_t *secpolicy = NULL; + rp_binding_commons_t *binding_commons = NULL; + + AXIS2_ENV_CHECK(env, NULL); + + secpolicy = rp_secpolicy_builder_build(env, policy); + if (!secpolicy) + { + return NULL; + } + + binding_commons = trust_policy_util_get_binding_commons(env, secpolicy); + + return rp_binding_commons_get_algorithmsuite(binding_commons, env); +} + +AXIS2_EXTERN rp_trust10_t *AXIS2_CALL +trust_policy_util_get_trust10( + const axutil_env_t * env, + neethi_policy_t * policy) +{ + rp_secpolicy_t *secpolicy = NULL; + + AXIS2_ENV_CHECK(env, NULL); + + secpolicy = rp_secpolicy_builder_build(env, policy); + if (!secpolicy) + { + return NULL; + } + + return rp_secpolicy_get_trust10(secpolicy, env); +} + +AXIS2_EXTERN rp_binding_commons_t *AXIS2_CALL +trust_policy_util_get_binding_commons( + const axutil_env_t * env, + rp_secpolicy_t * secpolicy) +{ + rp_property_t *property = NULL; + property = rp_secpolicy_get_binding(secpolicy, env); + if (!property) + return NULL; + + if (rp_property_get_type(property, env) == RP_PROPERTY_ASYMMETRIC_BINDING) + { + rp_asymmetric_binding_t *asymmetric_binding = NULL; + rp_symmetric_asymmetric_binding_commons_t *sym_asym_commons = NULL; + asymmetric_binding = (rp_asymmetric_binding_t *) rp_property_get_value(property, env); + if (!asymmetric_binding) + return NULL; + + sym_asym_commons = + rp_asymmetric_binding_get_symmetric_asymmetric_binding_commons(asymmetric_binding, env); + if (!sym_asym_commons) + return NULL; + + return rp_symmetric_asymmetric_binding_commons_get_binding_commons(sym_asym_commons, env); + } + else if (rp_property_get_type(property, env) == RP_PROPERTY_SYMMETRIC_BINDING) + { + rp_symmetric_binding_t *symmetric_binding = NULL; + rp_symmetric_asymmetric_binding_commons_t *sym_asym_commons = NULL; + symmetric_binding = (rp_symmetric_binding_t *) rp_property_get_value(property, env); + if (!symmetric_binding) + return NULL; + + sym_asym_commons = + rp_symmetric_binding_get_symmetric_asymmetric_binding_commons(symmetric_binding, env); + if (!sym_asym_commons) + return NULL; + + return rp_symmetric_asymmetric_binding_commons_get_binding_commons(sym_asym_commons, env); + + } + else if (rp_property_get_type(property, env) == RP_PROPERTY_TRANSPORT_BINDING) + { + rp_transport_binding_t *transport_binding = NULL; + transport_binding = (rp_transport_binding_t *) rp_property_get_value(property, env); + if (!transport_binding) + return NULL; + + return rp_transport_binding_get_binding_commons(transport_binding, env); + } + else + return NULL; +} Added: webservices/rampart/trunk/c/src/trust/sts_client.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/trust/sts_client.c?rev=595202&view=auto ============================================================================== --- webservices/rampart/trunk/c/src/trust/sts_client.c (added) +++ webservices/rampart/trunk/c/src/trust/sts_client.c Wed Nov 14 20:35:52 2007 @@ -0,0 +1,623 @@ +/* + * 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 <trust_sts_client.h> + +#ifndef TRUST_COMPUTED_KEY_PSHA1 +#define TRUST_COMPUTED_KEY_PSHA1 "P-SHA1" +#endif + +struct trust_sts_client +{ + + /*WS Trust version */ + int version; + + /* Key size */ + int key_size; + + /* Algorithm Suite for Entropy */ + rp_algorithmsuite_t *algo_suite; + + /* Trust 1.0 Assertions */ + rp_trust10_t *trust10; + + /* Requestor Entropy */ + axis2_char_t *requestor_entropy; + + axis2_char_t *appliesto; + + axis2_char_t *token_type; + + /* Time To Live */ + int ttl; + + /* Issuer Address */ + axis2_char_t *issuer_address; + + /* STS Client Home Directory */ + axis2_char_t *home_dir; + + /* Location of the issuer's policy file */ + axis2_char_t *issuer_policy_location; + + /* Location of the service's (relying party's) policy file */ + axis2_char_t *service_policy_location; +}; + +AXIS2_EXTERN trust_sts_client_t *AXIS2_CALL +trust_sts_client_create( + const axutil_env_t * env) +{ + trust_sts_client_t *sts_client = NULL; + + sts_client = (trust_sts_client_t *) AXIS2_MALLOC(env->allocator, sizeof(trust_sts_client_t)); + + sts_client->version = TRUST_VERSION_05_02; + sts_client->key_size = 0; + sts_client->ttl = 0; + sts_client->requestor_entropy = NULL; + sts_client->trust10 = NULL; + sts_client->appliesto = NULL; + sts_client->token_type = NULL; + sts_client->home_dir = NULL; + sts_client->issuer_address = NULL; + sts_client->issuer_policy_location = NULL; + sts_client->service_policy_location = NULL; + + return sts_client; +} + +AXIS2_EXTERN void AXIS2_CALL +trust_sts_client_free( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if (sts_client) + { + AXIS2_FREE(env->allocator, sts_client); + } + +} + +AXIS2_EXTERN void AXIS2_CALL +trust_sts_client_request_security_token( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * applies_to, + axis2_char_t * token_type) +{ + axis2_svc_client_t *svc_client = NULL; + neethi_policy_t *issuer_policy = NULL; + neethi_policy_t *service_policy = NULL; + axis2_status_t status = AXIS2_SUCCESS; + axiom_node_t *return_node = NULL; + + sts_client->appliesto = applies_to; + sts_client->token_type = token_type; + + issuer_policy = neethi_util_create_policy_from_file(env, sts_client->issuer_policy_location); + + service_policy = neethi_util_create_policy_from_file(env, sts_client->service_policy_location); + + if (!issuer_policy || !service_policy) + { + status = AXIS2_FAILURE; + } + else + { + trust_sts_client_process_policies(sts_client, env, issuer_policy, service_policy); + } + + /* TODO : Fix action logic */ + svc_client = + trust_sts_client_get_svc_client(sts_client, env, + "http://schemas.xmlsoap.org/ws/2005/02/RST/issue"); + + if (status == AXIS2_SUCCESS) + { + status = axis2_svc_client_set_policy(svc_client, env, issuer_policy); + if (status == AXIS2_FAILURE) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Policy setting failed."); + } + + return_node = + axis2_svc_client_send_receive(svc_client, env, + trust_sts_client_create_issue_request(sts_client, env, + "/Issue", + applies_to, + token_type)); + } + if (svc_client) + { + axis2_svc_client_free(svc_client, env); + svc_client = NULL; + } + + return; +} + +AXIS2_EXTERN axis2_svc_client_t *AXIS2_CALL +trust_sts_client_get_svc_client( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * action) +{ + axis2_endpoint_ref_t *endpoint_ref = NULL; + axis2_options_t *options = NULL; + axis2_svc_client_t *svc_client = NULL; + + endpoint_ref = axis2_endpoint_ref_create(env, sts_client->issuer_address); + + options = axis2_options_create(env); + axis2_options_set_to(options, env, endpoint_ref); + axis2_options_set_action(options, env, action); + + svc_client = axis2_svc_client_create(env, sts_client->home_dir); + if (!svc_client) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error code:" " %d :: %s", + env->error->error_number, AXIS2_ERROR_GET_MESSAGE(env->error)); + return NULL; + } + + /* Set service client options */ + axis2_svc_client_set_options(svc_client, env, options); + + /* Engage addressing module */ + axis2_svc_client_engage_module(svc_client, env, AXIS2_MODULE_ADDRESSING); + + return svc_client; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_process_policies( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + neethi_policy_t * issuer_policy, + neethi_policy_t * service_policy) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if (issuer_policy) + { + sts_client->algo_suite = trust_policy_util_get_algorithmsuite(env, issuer_policy); + } + + if (service_policy) + { + sts_client->trust10 = trust_policy_util_get_trust10(env, service_policy); + } + + return AXIS2_SUCCESS; +} +AXIS2_EXTERN axiom_node_t *AXIS2_CALL +trust_sts_client_create_issue_request( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * request_type, + axis2_char_t * applies_to, + axis2_char_t * token_type) +{ + axiom_node_t *rst_node = NULL; + axiom_node_t *entropy_node = NULL; + axiom_node_t *binsec_node = NULL; + int maxkey_len = 0; + + rst_node = trust_util_create_rst_element(env, sts_client->version, NULL); + + /* Setting up the request type */ + trust_util_create_request_type_element(env, sts_client->version, rst_node, request_type); + + /* Setting up the token type */ + if (token_type) + { + trust_util_create_token_type_element(env, sts_client->version, rst_node, token_type); + } + + if (applies_to) + trust_util_create_applies_to_element(env, rst_node, applies_to, TRUST_WSA_XMLNS); + + if (sts_client->trust10 && sts_client->algo_suite) + { + if (rp_trust10_get_require_client_entropy(sts_client->trust10, env) == AXIS2_TRUE) + { + entropy_node = trust_util_create_entropy_element(env, sts_client->version, rst_node); + maxkey_len = rp_algorithmsuite_get_max_symmetric_keylength(sts_client->algo_suite, env); + sts_client->requestor_entropy = + (axis2_char_t *) rampart_generate_nonce(env, maxkey_len); + + binsec_node = + trust_util_create_binary_secret_element(env, sts_client->version, entropy_node, + sts_client->requestor_entropy, + TRUST_BIN_SEC_TYPE_NONCE); + + trust_util_create_computed_key_algo_element(env, sts_client->version, rst_node, + TRUST_COMPUTED_KEY_PSHA1); + } + } + else + { + printf("Algo Suite or Trust10 Error!\n"); + } + + trust_sts_client_free(sts_client, env); + + return rst_node; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +trust_sts_client_create_renew_request( + trust_sts_client_t *sts_client, + const axutil_env_t *env, + axis2_char_t *token_type, + axis2_char_t *request_type, + axiom_node_t *renew_target, + axis2_bool_t allow_postdating, + trust_allow_t renew_allow, + trust_ok_t ok_flag) +{ + axiom_node_t *rst_node = NULL; + + rst_node = trust_util_create_rst_element(env, sts_client->version, NULL); + + if(token_type) + { + trust_util_create_token_type_element(env, sts_client->version, rst_node, token_type); + } + trust_util_create_request_type_element(env, sts_client->version, rst_node, request_type); + + if(renew_target) + { + trust_util_create_renew_traget_element(env, sts_client->version, rst_node, renew_target); + } + else + { + return NULL; + } + + if(allow_postdating) + { + trust_util_create_allow_postdating_element(env, sts_client->version, rst_node); + } + + trust_util_create_renewing_element(env, sts_client->version, rst_node, renew_allow, ok_flag); + + return rst_node; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +tust_sts_client_create_cancel_request( + trust_sts_client_t *sts_client, + const axutil_env_t *env, + axis2_char_t *request_type, + axiom_node_t *cancel_target) +{ + axiom_node_t *rst_node = NULL; + + rst_node = trust_util_create_rst_element(env, sts_client->version, NULL); + + trust_util_create_request_type_element(env, sts_client->version, rst_node, request_type); + + if(cancel_target) + { + if(!trust_util_create_cancel_target_element(env, sts_client->version, rst_node, cancel_target)) + { + return NULL; + } + } + else + { + return NULL; + } + + return rst_node; +} + +AXIS2_EXTERN axiom_node_t * AXIS2_CALL +trust_sts_client_create_validate_request( + trust_sts_client_t *sts_client, + const axutil_env_t *env, + axis2_char_t *token_type, + axis2_char_t *request_type) +{ + axiom_node_t *rst_node = NULL; + + rst_node = trust_util_create_rst_element(env, sts_client->version, NULL); + + if(token_type) + { + trust_util_create_token_type_element(env, sts_client->version, rst_node, token_type); + } + + if(request_type) + { + trust_util_create_request_type_element(env, sts_client->version, rst_node, request_type); + } + + return rst_node; +} +/* Process ISSUE RESPONSE */ +AXIS2_EXTERN trust_token_t *AXIS2_CALL +trust_sts_client_process_issue_response( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + int wst_version, + axiom_node_t * response_node, + axiom_node_t * payload_sent) +{ + /* Token */ + trust_token_t *token = NULL; + + /* RSTR */ + axiom_node_t *rstr_node = NULL; + axiom_element_t *rstr_ele = NULL; + + axis2_char_t *wst_ns_uri = NULL; + + /* Attached Reference */ + axiom_node_t *attached_ref_node = NULL; + axiom_element_t *attached_ref_ele = NULL; + axutil_qname_t *attached_ref_qname = NULL; + axiom_node_t *req_attached_ref_node = NULL; + + /* Unattached Reference */ + axiom_node_t *unattached_ref_node = NULL; + axiom_element_t *unattached_ref_ele = NULL; + axutil_qname_t *unattached_ref_qname = NULL; + axiom_node_t *req_unattached_ref_node = NULL; + + /*Requsted Security Token */ + axiom_node_t *req_sec_token_node = NULL; + axiom_element_t *req_sec_token_ele = NULL; + axutil_qname_t *req_sec_token_qname = NULL; + axiom_node_t *sec_token = NULL; + + /* Life Time */ + axiom_node_t *life_time_node = NULL; + axiom_element_t *life_time_ele = NULL; + axutil_qname_t *life_time_qname = NULL; + + rstr_node = response_node; + + if (TRUST_VERSION_05_12 == wst_version) + { + rstr_node = axiom_node_get_first_element(rstr_node, env); + } + + wst_ns_uri = trust_util_get_wst_ns(env, wst_version); + rstr_ele = axiom_node_get_data_element(rstr_node, env); + + /* Extract Attached Reference */ + + attached_ref_qname = + axutil_qname_create(env, TRUST_REQUESTED_ATTACHED_REFERENCE, wst_ns_uri, TRUST_WST); + + attached_ref_ele = + axiom_element_get_first_child_with_qname(rstr_ele, env, attached_ref_qname, rstr_node, + &attached_ref_node); + + if (attached_ref_ele) + { + req_attached_ref_node = axiom_node_get_first_element(attached_ref_node, env); + } + + /* Extract unattached Reference */ + unattached_ref_qname = + axutil_qname_create(env, TRUST_REQUESTED_UNATTACHED_REFERENCE, wst_ns_uri, TRUST_WST); + + unattached_ref_ele = + axiom_element_get_first_child_with_qname(rstr_ele, env, unattached_ref_qname, rstr_node, + &unattached_ref_node); + if (unattached_ref_ele) + { + req_unattached_ref_node = axiom_node_get_first_element(unattached_ref_node, env); + } + + /* Extract Requested Security Token */ + req_sec_token_qname = + axutil_qname_create(env, TRUST_REQUESTED_SECURITY_TOKEN, wst_ns_uri, TRUST_WST); + req_sec_token_ele = + axiom_element_get_first_child_with_qname(rstr_ele, env, req_sec_token_qname, rstr_node, + &req_sec_token_node); + + if (req_sec_token_node) + { + sec_token = axiom_node_get_first_element(req_sec_token_node, env); + } + else + { + /*Requsted Token Missing - Handle */ + } + + /* Extract Life Time */ + life_time_qname = axutil_qname_create(env, TRUST_LIFE_TIME, wst_ns_uri, TRUST_WST); + life_time_ele = + axiom_element_get_first_child_with_qname(rstr_ele, env, life_time_qname, rstr_node, + &life_time_node); + + if (NULL == life_time_ele) + { + /* Handle NULL - life time ele */ + } + + /* TOKEN Creation */ + /* FIX id- NULL :-> ID should be computed here */ + token = trust_token_create(env, NULL, sec_token, life_time_node); + + return token; + +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_find_identifier( + trust_sts_client_t * sts_client, + axiom_node_t * req_att_ref_node, + axiom_node_t * req_unatt_ref_node, + axiom_node_t * sec_token_node, + const axutil_env_t * env) +{ + axis2_char_t *id_str = NULL; + + if (req_att_ref_node) + { + id_str = trust_sts_client_get_id_from_str(sts_client, req_att_ref_node, env); + } + else if (req_unatt_ref_node) + { + id_str = trust_sts_client_get_id_from_str(sts_client, req_unatt_ref_node, env); + } + else + { + /* FIX : WSConstants based wsu:Id */ + + } + return id_str; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_get_id_from_str( + trust_sts_client_t * sts_client, + axiom_node_t * ref_node, + const axutil_env_t * env) +{ + /*FIX : implementation requires WS.Consatants paramaters */ + return NULL; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_set_ttl( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + int ttl) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, ttl, AXIS2_FAILURE); + + sts_client->ttl = ttl; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN int AXIS2_CALL +trust_sts_client_get_ttl( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return sts_client->ttl; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_set_issuer_address( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * address) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, address, AXIS2_FAILURE); + + sts_client->issuer_address = address; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_get_issuer_address( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return sts_client->issuer_address; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_set_home_dir( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * directory) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, directory, AXIS2_FAILURE); + + sts_client->home_dir = directory; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_get_home_dir( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return sts_client->home_dir; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_set_issuer_policy_location( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * file_path) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, file_path, AXIS2_FAILURE); + + sts_client->issuer_policy_location = file_path; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_get_issuer_policy_location( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return sts_client->issuer_policy_location; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_sts_client_set_service_policy_location( + trust_sts_client_t * sts_client, + const axutil_env_t * env, + axis2_char_t * file_path) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, file_path, AXIS2_FAILURE); + + sts_client->service_policy_location = file_path; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t *AXIS2_CALL +trust_sts_client_get_service_policy_location( + trust_sts_client_t * sts_client, + const axutil_env_t * env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + return sts_client->service_policy_location; +} Added: webservices/rampart/trunk/c/src/trust/token.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/trust/token.c?rev=595202&view=auto ============================================================================== --- webservices/rampart/trunk/c/src/trust/token.c (added) +++ webservices/rampart/trunk/c/src/trust/token.c Wed Nov 14 20:35:52 2007 @@ -0,0 +1,470 @@ +/* + * 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 <trust_token.h> + +struct trust_token { + + /*Token identifier*/ + axis2_char_t *id; + + /*Current state of the token*/ + trust_token_state_t state; + + /*The actual token in its current state <RequstedSecurityToken*/ + axiom_node_t *token; + + /*The token in its previous state*/ + axiom_node_t *previous_token; + + axiom_node_t *proof_token; + + /** + *Store the RSTR's modifications of the requested parameters. + *These RSTR parameters sholud be compare with the RST parameter and should take + *the proprietary actions + **/ + axis2_char_t *applies_to_uri; + axis2_char_t *token_type_uri; + + /* Entropy */ + axiom_node_t* entropy; + + /* Entropy - BinarySecret */ + axis2_char_t *binary_secret; + + /** + * The RequestedAttachedReference element + * NOTE : The oasis-200401-wss-soap-message-security-1.0 spec allows + * an extensibility mechanism for wsse:SecurityTokenReference and + * wsse:Reference. Hence we cannot limit to the + * wsse:SecurityTokenReference\wsse:Reference case and only hold the URI and + * the ValueType values. + */ + axiom_node_t *attached_reference; + + /** + * The RequestedUnattachedReference element + * NOTE : The oasis-200401-wss-soap-message-security-1.0 spec allows + * an extensibility mechanism for wsse:SecurityTokenRefence and + * wsse:Reference. Hence we cannot limit to the + * wsse:SecurityTokenReference\wsse:Reference case and only hold the URI and + * the ValueType values. + */ + axiom_node_t *unattached_reference; + + /*A bag to hold any other properties*/ + /*trust_properties_t *properties;*/ + + /*A flag to assist the TokenStorage*/ + axis2_bool_t changed; + + /*The secret associated with the Token*/ + unsigned char *secret; + + /*Created time*/ + axutil_date_time_t *created; + + /*Expiration Time*/ + axutil_date_time_t *expire; + + /*issuer end point address*/ + axis2_char_t* issuer_address; +}; + +AXIS2_EXTERN trust_token_t* AXIS2_CALL +trust_token_create( + const axutil_env_t *env, + axis2_char_t *id, + axiom_node_t *token_node, + axiom_node_t *life_node) +{ + trust_token_t *token = NULL; + axis2_status_t status; + + token = AXIS2_MALLOC(env->allocator, sizeof(trust_token_t)); + + if(id) + { + token->id = id; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null id!"); + return NULL; + } + + if(token_node) + { + token->token = token_node; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null token element!"); + return NULL; + } + + if(life_node) + { + status = trust_token_process_life_elem(env, life_node, token); + if(status == AXIS2_FAILURE) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Lifetime element processing failed."); + } + + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null life element!"); + return NULL; + } + + return token; + +} + +AXIS2_EXTERN trust_token_t* AXIS2_CALL +trust_token_create_with_dates(const axutil_env_t *env, + axis2_char_t *id, + axiom_node_t *token_node, + axutil_date_time_t *created, + axutil_date_time_t *expire) +{ + trust_token_t *token = NULL; + + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + token = AXIS2_MALLOC(env->allocator, sizeof(trust_token_t)); + + if(id) + { + token->id = id; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null id!"); + return NULL; + } + + if(token_node) + { + token->token = token_node; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null token element!"); + return NULL; + } + + if(created) + { + token->created = created; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null create date!"); + return NULL; + } + + if(expire) + { + token->expire = expire; + } else + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[trust] Cannot create trust token with null expired date!"); + return NULL; + } + return token; + +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_process_life_elem(const axutil_env_t *env, + axiom_node_t *life_node, + trust_token_t *token) +{ + axiom_element_t *created_ele = NULL; + axiom_element_t *expire_ele = NULL; + axiom_node_t *created_node = NULL; + axiom_node_t *expire_node = NULL; + axiom_element_t *life_ele = NULL; + axutil_date_time_t *created_dt = NULL; + axutil_date_time_t *expire_dt = NULL; + axutil_qname_t *created_qn = NULL; + axutil_qname_t *expire_qn = NULL; + axis2_status_t status = AXIS2_SUCCESS; + axis2_char_t *created_str = NULL; + axis2_char_t *expire_str = NULL; + + if(!life_node){ + return AXIS2_FAILURE; + } + + life_ele = axiom_node_get_data_element(life_node, env); + + created_dt = axutil_date_time_create(env); + created_qn = axutil_qname_create(env, TRUST_LIFE_TIME_CREATED, TRUST_WSU_XMLNS, TRUST_WSU); + created_ele = axiom_element_get_first_child_with_qname(life_ele, env, created_qn, life_node, &created_node); + created_str = axiom_element_get_text(created_ele, env, created_node); + status = axutil_date_time_deserialize_date_time(created_dt, env, created_str); + + if(status == AXIS2_FAILURE){ + return status; + } + + token->created = created_dt; + + + expire_dt = axutil_date_time_create(env); + expire_qn = axutil_qname_create(env, TRUST_LIFE_TIME_EXPIRES, TRUST_WSU_XMLNS, TRUST_WSU); + expire_ele = axiom_element_get_first_child_with_qname(life_ele, env, expire_qn, life_node, &expire_node); + expire_str = axiom_element_get_text(expire_ele, env, expire_node); + status = axutil_date_time_deserialize_date_time(expire_dt, env, expire_str); + + if(status == AXIS2_FAILURE){ + return status; + } + + token->expire = expire_dt; + + return status; +} + +AXIS2_EXTERN axis2_bool_t AXIS2_CALL +trust_token_is_changed( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + return (token->changed); +} + + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_changed( + const axutil_env_t *env, + trust_token_t *token, + axis2_bool_t changed) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return AXIS2_FAILURE; + + token->changed = changed; + + return AXIS2_SUCCESS; +} + + +AXIS2_EXTERN trust_token_state_t AXIS2_CALL +trust_token_get_state(const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return AXIS2_FAILURE; + + return token->state; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_state(const axutil_env_t *env, + trust_token_t *token, + trust_token_state_t state) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return AXIS2_FAILURE; + token->state = state; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axiom_node_t* AXIS2_CALL +trust_token_get_token( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return NULL; + + return token->token; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_token( + const axutil_env_t *env, + trust_token_t *token, + axiom_node_t *token_node) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return AXIS2_FAILURE; + token->token = token_node; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axiom_node_t* AXIS2_CALL +trust_token_get_previous_token( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + if(!token) + return NULL; + + return token->previous_token; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_previous_token( + const axutil_env_t *env, + trust_token_t *token, + axiom_node_t *prev_token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return AXIS2_FAILURE; + token->previous_token = prev_token; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t* AXIS2_CALL +trust_token_get_id( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->id; +} + +AXIS2_EXTERN axiom_node_t* AXIS2_CALL +trust_token_get_attached_reference( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->attached_reference; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_attached_reference( + const axutil_env_t *env, + trust_token_t *token, + axiom_node_t *attached_reference) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return AXIS2_FAILURE; + + token->attached_reference = attached_reference; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axiom_node_t* AXIS2_CALL +trust_token_get_unattached_reference( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->unattached_reference; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_unattached_reference( + const axutil_env_t *env, + trust_token_t *token, + axiom_node_t *unattached_reference) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return AXIS2_FAILURE; + + token->unattached_reference = unattached_reference; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axutil_date_time_t* AXIS2_CALL +trust_token_get_created( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->created; +} + +AXIS2_EXTERN axutil_date_time_t* AXIS2_CALL +trust_token_get_expires( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->expire; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +trust_token_set_expires( + const axutil_env_t *env, + trust_token_t *token, + axutil_date_time_t *expire) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return AXIS2_FAILURE; + + token->expire = expire; + + return AXIS2_SUCCESS; +} + +AXIS2_EXTERN axis2_char_t* AXIS2_CALL +trust_token_get_issuer_address( + const axutil_env_t *env, + trust_token_t *token) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if(!token) + return NULL; + + return token->issuer_address; +} +