Author: shankar Date: Wed Jun 25 03:24:48 2008 New Revision: 671499 URL: http://svn.apache.org/viewvc?rev=671499&view=rev Log: serialise and deserialize method to security context token
Modified: webservices/rampart/trunk/c/include/secconv_security_context_token.h webservices/rampart/trunk/c/src/secconv/security_context_token.c Modified: webservices/rampart/trunk/c/include/secconv_security_context_token.h URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/secconv_security_context_token.h?rev=671499&r1=671498&r2=671499&view=diff ============================================================================== --- webservices/rampart/trunk/c/include/secconv_security_context_token.h (original) +++ webservices/rampart/trunk/c/include/secconv_security_context_token.h Wed Jun 25 03:24:48 2008 @@ -127,6 +127,17 @@ security_context_token_increment_ref( security_context_token_t *sct, const axutil_env_t * env); + + AXIS2_EXTERN axis2_char_t * AXIS2_CALL + security_context_token_serialize( + security_context_token_t *sct, + const axutil_env_t *env); + + AXIS2_EXTERN axis2_status_t AXIS2_CALL + security_context_token_deserialize( + security_context_token_t *sct, + const axutil_env_t *env, + axis2_char_t *serialised_node); #ifdef __cplusplus } Modified: webservices/rampart/trunk/c/src/secconv/security_context_token.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/secconv/security_context_token.c?rev=671499&r1=671498&r2=671499&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/secconv/security_context_token.c (original) +++ webservices/rampart/trunk/c/src/secconv/security_context_token.c Wed Jun 25 03:24:48 2008 @@ -19,6 +19,7 @@ #include <oxs_buffer.h> #include <oxs_tokens.h> #include <trust_constants.h> +#include <trust_util.h> struct security_context_token_t { @@ -424,5 +425,197 @@ return AXIS2_SUCCESS; } +AXIS2_EXTERN axis2_char_t * AXIS2_CALL +security_context_token_serialize( + security_context_token_t *sct, + const axutil_env_t *env) +{ + axiom_node_t *sct_node = NULL; + axiom_node_t *proof_node = NULL; + axiom_node_t *attached_ref_node = NULL; + axiom_node_t *unattached_ref_node = NULL; + axiom_node_t *parent_attached_ref_node = NULL; + axiom_node_t *parent_unattached_ref_node = NULL; + axis2_char_t *serialised_node = NULL; + + sct_node = security_context_token_get_token(sct, env); + if(!sct_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Cannot serialise security context token."); + return NULL; + } + + proof_node = security_context_token_get_requested_proof_token(sct, env); + attached_ref_node = security_context_token_get_attached_reference(sct, env); + unattached_ref_node = security_context_token_get_unattached_reference(sct, env); + + if(!proof_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Cannot serialise proof token of security context token."); + axiom_node_free_tree(sct_node, env); + return NULL; + } + axiom_node_add_child(sct_node, env, proof_node); + + /* attached reference is optional */ + if(attached_ref_node) + { + parent_attached_ref_node = trust_util_create_req_attached_reference_element( + env, TRUST_WST_XMLNS, sct_node); + if(!parent_attached_ref_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Cannot serialise attached reference of security context token."); + axiom_node_free_tree(sct_node, env); + return NULL; + } + axiom_node_add_child(parent_attached_ref_node, env, attached_ref_node); + } + + /* unattached reference is optional */ + if(unattached_ref_node) + { + parent_unattached_ref_node = trust_util_create_req_unattached_reference_element( + env, TRUST_WST_XMLNS, sct_node); + if(!parent_unattached_ref_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Cannot serialise unattached reference of security context token."); + axiom_node_free_tree(sct_node, env); + return NULL; + } + axiom_node_add_child(parent_unattached_ref_node, env, unattached_ref_node); + } + + serialised_node = axiom_node_sub_tree_to_string(sct_node, env); + axiom_node_free_tree(sct_node, env); + + return serialised_node; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +security_context_token_deserialize( + security_context_token_t *sct, + const axutil_env_t *env, + axis2_char_t *serialised_node) +{ + axiom_xml_reader_t *reader = NULL; + axiom_document_t *doc = NULL; + axiom_stax_builder_t *builder = NULL; + axiom_node_t *sct_node = NULL; + axiom_node_t *proof_node = NULL; + axiom_node_t *attached_ref_node = NULL; + axiom_node_t *unattached_ref_node = NULL; + axiom_node_t *parent_attached_ref_node = NULL; + axiom_node_t *parent_unattached_ref_node = NULL; + axiom_node_t *parent_proof_node = NULL; + + reader = axiom_xml_reader_create_for_memory( + env, serialised_node, axutil_strlen(serialised_node), NULL, AXIS2_XML_PARSER_TYPE_BUFFER); + + if(!reader) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Cannot create xml reader. Security context token deserialize failed."); + return AXIS2_FAILURE; + } + + builder = axiom_stax_builder_create(env, reader); + doc = axiom_document_create(env, NULL, builder); + sct_node = axiom_document_build_all(doc, env); + if(!sct_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Security context token deserialize failed."); + return AXIS2_FAILURE; + } + + parent_proof_node = oxs_axiom_get_node_by_local_name( + env, sct_node, TRUST_REQUESTED_PROOF_TOKEN); + if(!parent_proof_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Proof not could not be found. Security context token deserialize failed."); + return AXIS2_FAILURE; + } + + axiom_node_detach(parent_proof_node, env); + proof_node = oxs_axiom_get_node_by_local_name(env, parent_proof_node, TRUST_BINARY_SECRET); + if(!proof_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Proof not could not be found. Security context token deserialize failed."); + return AXIS2_FAILURE; + } + + if(security_context_token_set_requested_proof_token(sct, env, proof_node) != AXIS2_SUCCESS) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Deserializing proof token node failed. " + "Security context token deserialize failed."); + return AXIS2_FAILURE; + } + + parent_attached_ref_node = oxs_axiom_get_node_by_local_name( + env, sct_node, TRUST_REQUESTED_ATTACHED_REFERENCE); + if(parent_attached_ref_node) + { + axiom_node_detach(parent_attached_ref_node, env); + attached_ref_node = oxs_axiom_get_node_by_local_name( + env, parent_attached_ref_node, OXS_NODE_SECURITY_TOKEN_REFRENCE); + if(!attached_ref_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Attached reference node could not be found. " + "Security context token deserialize failed."); + return AXIS2_FAILURE; + } + if (security_context_token_set_attached_reference(sct, env, attached_ref_node) + != AXIS2_SUCCESS) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Deserializing attached reference node failed. " + "Security context token deserialize failed."); + return AXIS2_FAILURE; + } + } + + parent_unattached_ref_node = oxs_axiom_get_node_by_local_name( + env, sct_node, TRUST_REQUESTED_UNATTACHED_REFERENCE); + if(parent_unattached_ref_node) + { + axiom_node_detach(parent_unattached_ref_node, env); + unattached_ref_node = oxs_axiom_get_node_by_local_name( + env, parent_unattached_ref_node, OXS_NODE_SECURITY_TOKEN_REFRENCE); + if(!unattached_ref_node) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Unattached reference node could not be found. " + "Security context token deserialize failed."); + return AXIS2_FAILURE; + } + if (security_context_token_set_unattached_reference(sct, env, unattached_ref_node) + != AXIS2_SUCCESS) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Deserializing unattached reference node failed. " + "Security context token deserialize failed."); + return AXIS2_FAILURE; + } + } + + if(security_context_token_set_token(sct, env, sct_node) != AXIS2_SUCCESS) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart]Deserializing security context token failed." ); + return AXIS2_FAILURE; + } + + axiom_xml_reader_xml_free(reader, env, NULL); + + return AXIS2_SUCCESS; +}