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(


Reply via email to