Author: kaushalye
Date: Mon Nov 19 07:03:39 2007
New Revision: 596320
URL: http://svn.apache.org/viewvc?rev=596320&view=rev
Log:
Introduced an especial function to ensure the order of elements of security
header
Modified:
webservices/rampart/trunk/c/include/rampart_sec_header_builder.h
webservices/rampart/trunk/c/src/omxmlsec/axiom.c
webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c
Modified: webservices/rampart/trunk/c/include/rampart_sec_header_builder.h
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/rampart_sec_header_builder.h?rev=596320&r1=596319&r2=596320&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/rampart_sec_header_builder.h (original)
+++ webservices/rampart/trunk/c/include/rampart_sec_header_builder.h Mon Nov 19
07:03:39 2007
@@ -53,6 +53,11 @@
rampart_context_t *context,
axiom_soap_envelope_t *soap_envelope);
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ rampart_shb_ensure_sec_header_order(const axutil_env_t *env,
+ axis2_msg_ctx_t *msg_ctx,
+ rampart_context_t *rampart_context,
+ axiom_node_t* sec_node);
/* @} */
#ifdef __cplusplus
Modified: webservices/rampart/trunk/c/src/omxmlsec/axiom.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/axiom.c?rev=596320&r1=596319&r2=596320&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/axiom.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/axiom.c Mon Nov 19 07:03:39 2007
@@ -438,3 +438,4 @@
return status;
}
+
Modified: webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c?rev=596320&r1=596319&r2=596320&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c Mon Nov
19 07:03:39 2007
@@ -104,6 +104,14 @@
}
}
+ /*Finaly we need to make sure that our security header elements are in
order*/
+ status = rampart_shb_ensure_sec_header_order(env, msg_ctx,
rampart_context, sec_node);
+ if(status != AXIS2_SUCCESS)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,"[rampart][shb]
Security header ordering failed.");
+ return AXIS2_FAILURE;
+ }
+
status = AXIS2_SUCCESS;
return status;
@@ -113,7 +121,62 @@
/*Public functions*/
-
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_shb_ensure_sec_header_order(const axutil_env_t *env,
+ axis2_msg_ctx_t *msg_ctx,
+ rampart_context_t *rampart_context,
+ axiom_node_t* sec_node)
+{
+ axis2_bool_t signature_protection = AXIS2_FALSE;
+ axis2_bool_t is_encrypt_before_sign = AXIS2_FALSE;
+ axiom_node_t *sig_node = NULL;
+ axiom_node_t *enc_key_node = NULL;
+ axiom_node_t *ref_list_node = NULL;
+ /*axiom_node_t *ts_node = NULL;
+ axiom_node_t *un_node = NULL;*/
+ axiom_node_t *h_node = NULL;
+ axutil_array_list_t *dk_list = NULL;
+ int i = 0;
+
+ signature_protection =
rampart_context_is_encrypt_signature(rampart_context, env);
+ is_encrypt_before_sign =
rampart_context_is_encrypt_before_sign(rampart_context, env);
+ enc_key_node = oxs_axiom_get_first_child_node_by_name(env, sec_node,
OXS_NODE_ENCRYPTED_KEY, OXS_ENC_NS, NULL);
+ ref_list_node = oxs_axiom_get_first_child_node_by_name(env, sec_node,
OXS_NODE_REFERENCE_LIST, OXS_ENC_NS, NULL);
+ sig_node = oxs_axiom_get_first_child_node_by_name(env, sec_node,
OXS_NODE_SIGNATURE, OXS_DSIG_NS, NULL);
+
+ /*Ensure the protection order in the header*/
+ if(sig_node && ref_list_node){
+ if(is_encrypt_before_sign){
+ /*Encrypt->Sig <Sig><RefList>*/
+ oxs_axiom_interchange_nodes(env, sig_node, ref_list_node );
+ }else{
+ /*Sig->Encrypt <RefList> <Sig>*/
+ oxs_axiom_interchange_nodes(env, ref_list_node, sig_node );
+ }
+ }
+
+ /*If there are derived keys, make sure they come after the EncryptedKey
+ 1. First we get all the derived keys
+ 2. Then we attach after the EncryptedKey (hidden sessionkey)
+ */
+ dk_list = axutil_array_list_create(env, 5);
+ h_node = axiom_node_get_first_child(sec_node, env);
+ while(h_node){
+ if(0 == axutil_strcmp(OXS_NODE_DERIVED_KEY_TOKEN,
axiom_util_get_localname(h_node, env))){
+ axutil_array_list_add(dk_list, env, h_node);
+ }
+ h_node = axiom_node_get_next_sibling(h_node, env);
+ }
+ for(i = 0; i < axutil_array_list_size(dk_list, env); i++){
+ axiom_node_t *dk_node = NULL;
+ axiom_node_t *tmp_node = NULL;
+
+ dk_node = (axiom_node_t*)axutil_array_list_get(dk_list, env, i);
+ tmp_node = axiom_node_detach(dk_node, env);
+ axiom_node_insert_sibling_after(enc_key_node, env, tmp_node);
+ }
+ return AXIS2_SUCCESS;
+}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
rampart_shb_build_message(