Author: supun
Date: Tue Nov 13 02:15:01 2007
New Revision: 594466

URL: http://svn.apache.org/viewvc?rev=594466&view=rev
Log:
Applied the patch RAMPARTC-44

Modified:
    webservices/rampart/trunk/c/include/oxs_sign_part.h
    webservices/rampart/trunk/c/src/omxmlsec/sign_part.c
    webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c
    webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c

Modified: webservices/rampart/trunk/c/include/oxs_sign_part.h
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/oxs_sign_part.h?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/oxs_sign_part.h (original)
+++ webservices/rampart/trunk/c/include/oxs_sign_part.h Tue Nov 13 02:15:01 2007
@@ -32,6 +32,7 @@
 #include <axis2_defines.h>
 #include <axutil_env.h>
 #include <axiom_node.h>
+#include <axiom_namespace.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -77,6 +78,17 @@
         const oxs_sign_part_t *sign_part,
         const axutil_env_t *env);
 
+       AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+       oxs_sign_part_get_id_name(
+               const oxs_sign_part_t *sign_part,
+               const axutil_env_t *env);
+
+       AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
+       oxs_sign_part_get_sign_namespace(
+               const oxs_sign_part_t *sign_part,
+               const axutil_env_t *env);
+
+
     /**********************Setter 
functions******************************************/
     AXIS2_EXTERN axis2_status_t AXIS2_CALL
     oxs_sign_part_set_id(
@@ -108,7 +120,17 @@
         const axutil_env_t *env,
         axutil_array_list_t *transforms);
 
-
+       AXIS2_EXTERN axis2_status_t AXIS2_CALL
+       oxs_sign_part_set_id_name(
+               oxs_sign_part_t *sign_part,
+               const axutil_env_t *env,
+               axis2_char_t *id_name);         
+
+       AXIS2_EXTERN axis2_status_t AXIS2_CALL
+       oxs_sign_part_set_sign_namespace(
+               oxs_sign_part_t *sign_part,
+               const axutil_env_t *env,
+               axiom_namespace_t *sig_ns);
 
     /** @} */
 #ifdef __cplusplus

Modified: webservices/rampart/trunk/c/src/omxmlsec/sign_part.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/sign_part.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/sign_part.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/sign_part.c Tue Nov 13 02:15:01 
2007
@@ -26,8 +26,11 @@
     axis2_char_t *id;
     axis2_char_t *digest_mtd;
     axis2_char_t *digest_val;
+       axiom_namespace_t *sig_ns;
+       axis2_char_t *id_name;
     axiom_node_t *node ; /*Shallow copies*/
     axutil_array_list_t *transforms; /*Shallow copies*/
+
 };
 
 
@@ -165,7 +168,8 @@
     sign_part->digest_val = NULL;
     sign_part->node = NULL;
     sign_part->transforms = NULL;
-
+       sign_part->id_name = NULL;
+       sign_part->sig_ns = NULL;
     return sign_part;
 }
 
@@ -195,6 +199,18 @@
         sign_part->digest_val = NULL;
     }
 
+       if (sign_part->id_name)
+    {
+        AXIS2_FREE(env->allocator, sign_part->id_name);
+        sign_part->id_name = NULL;
+    }
+
+       if (sign_part->sig_ns)
+    {
+        axiom_namespace_free(sign_part->sig_ns, env);
+        sign_part->sig_ns = NULL;
+    }
+
     sign_part->node = NULL;
 
     if(sign_part->transforms){
@@ -219,5 +235,54 @@
 
     return AXIS2_SUCCESS;
 }
+
+
+AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+oxs_sign_part_get_id_name(
+    const oxs_sign_part_t *sign_part,
+    const axutil_env_t *env)
+{
+    return sign_part->id_name;
+}
+
+AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
+oxs_sign_part_get_sign_namespace(
+    const oxs_sign_part_t *sign_part,
+    const axutil_env_t *env)
+{
+    return sign_part->sig_ns;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+oxs_sign_part_set_id_name(
+    oxs_sign_part_t *sign_part,
+    const axutil_env_t *env,
+       axis2_char_t *id_name)
+{
+     if (sign_part->id_name)
+    {
+        AXIS2_FREE(env->allocator, sign_part->id_name);
+        sign_part->id_name = NULL;
+    }
+    sign_part->id_name = axutil_strdup(env, id_name);
+    return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+oxs_sign_part_set_sign_namespace(
+    oxs_sign_part_t *sign_part,
+    const axutil_env_t *env,
+       axiom_namespace_t *sig_ns)
+{
+        if (sign_part->sig_ns)
+    {
+        axiom_namespace_free(sign_part->sig_ns, env);
+        sign_part->sig_ns = NULL;
+    }
+    sign_part->sig_ns = sig_ns;
+    return AXIS2_SUCCESS;
+}
+
+
 
 

Modified: webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c Tue Nov 13 
02:15:01 2007
@@ -51,6 +51,48 @@
     return output_dtype;
 }
 
+oxs_tr_dtype_t AXIS2_CALL
+oxs_transforms_enveloped_xmldsig(const axutil_env_t *env,
+                        axiom_node_t *input,
+                        oxs_tr_dtype_t input_dtype,
+                        axis2_char_t **output)
+{
+    axiom_document_t *doc = NULL;
+    axis2_char_t *algo = NULL;
+    axis2_char_t *c14nized = NULL;
+    oxs_tr_dtype_t output_dtype = OXS_TRANSFORM_TYPE_UNKNOWN;
+       axiom_node_t *sig_node = NULL, *child_node = NULL;
+
+       child_node = axiom_node_get_first_element(input, env);
+       
+       while(child_node)
+       {
+               axis2_char_t *node_local_name = NULL;
+               node_local_name = axiom_util_get_localname(child_node, env);
+               if(!(axutil_strcmp(node_local_name, OXS_NODE_SIGNATURE)))
+               {       
+                       sig_node = axiom_node_detach(child_node, env);
+                       break;
+               }
+               child_node = axiom_node_get_next_sibling(child_node, env);
+       }
+       
+    if(input_dtype != OXS_TRANSFORM_TYPE_NODE){
+        oxs_error(env, ERROR_LOCATION, OXS_ERROR_TRANSFORM_FAILED,"Transform 
expects a NODE.");
+        return OXS_TRANSFORM_TYPE_UNKNOWN;
+    }
+
+    doc = axiom_node_get_document(input, env);
+    algo = OXS_HREF_TRANSFORM_XML_EXC_C14N;
+    oxs_c14n_apply_algo(env, doc, &c14nized, NULL, input, algo);
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[rampart][c14n-OutPut] 
is\n\n%s\n\n",c14nized);
+       
+       axiom_node_add_child(input, env, sig_node);
+
+    *output= c14nized;
+    output_dtype = OXS_TRANSFORM_TYPE_CHAR;
+    return output_dtype;
+}
 /*Public functions*/
 AXIS2_EXTERN oxs_transform_t *AXIS2_CALL
 oxs_transforms_factory_produce_transform(const axutil_env_t *env,
@@ -66,9 +108,17 @@
         oxs_transform_set_output_data_type(tr, env, OXS_TRANSFORM_TYPE_CHAR);
         oxs_transform_set_transform_func(tr, env, 
(oxs_transform_tr_func)oxs_transforms_exc_c14n);
         return tr;
-    }else{
-        /*Error we do not support*/
-        return NULL;
+
+    }else if(0== axutil_strcmp(id, OXS_HREF_TRANSFORM_ENVELOPED_SIGNATURE)){
+       tr = oxs_transform_create(env);
+        oxs_transform_set_id(tr, env, id);
+        oxs_transform_set_input_data_type(tr, env, OXS_TRANSFORM_TYPE_NODE);
+        oxs_transform_set_output_data_type(tr, env, OXS_TRANSFORM_TYPE_CHAR);
+        oxs_transform_set_transform_func(tr, env, 
(oxs_transform_tr_func)oxs_transforms_enveloped_xmldsig);
+        return tr; 
     }
+       else
+               return NULL;
 }
+
 

Modified: webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c Tue Nov 13 
02:15:01 2007
@@ -132,6 +132,8 @@
     axis2_char_t *digest_mtd = NULL;
     axis2_char_t *ref_id = NULL;
     axis2_char_t *id = NULL;
+       axiom_namespace_t *ns = NULL;
+       axis2_char_t *ns_uri = NULL;
     axutil_array_list_t *transforms = NULL;
     axiom_node_t *node = NULL;
     axiom_node_t *reference_node = NULL;
@@ -142,8 +144,14 @@
     /*Get the node to digest*/
     node = oxs_sign_part_get_node(sign_part, env);
 
+       ns = oxs_sign_part_get_sign_namespace(sign_part, env);
+       if(ns)
+               ns_uri = axiom_namespace_get_uri(ns, env);
+       else
+               ns_uri = "";
     /*Get the reference ID from the node and hence to the ds:Reference node*/
-    id = oxs_axiom_get_attribute_value_of_node_by_name(env, node, "Id", 
OXS_WSU_XMLNS);
+    id = oxs_axiom_get_attribute_value_of_node_by_name(env, node, 
oxs_sign_part_get_id_name(sign_part, env),
+                                                                               
                        ns_uri);
 
     ref_id = axutil_stracat(env, "#", id);/* <ds:Reference URI="#id">*/
     reference_node = oxs_token_build_ds_reference_element(env, parent ,NULL, 
ref_id, NULL);
@@ -289,7 +297,7 @@
     }
     /*At this point we have a complete <SignedInfo> node. Now we need to sign 
it*/
     status = oxs_xml_sig_sign_signed_info(env, signature_node, 
signed_info_node, sign_ctx);
-
+       sig_id = axiom_node_to_string(parent, env);
     *sig_node = signature_node;
     return status;
 }
@@ -309,14 +317,72 @@
     axiom_node_t *reffed_node = NULL;
     axiom_node_t *child_node = NULL;
 
+       axiom_node_t *next_node = NULL;
+       axis2_char_t *id_name = NULL;
+       axiom_namespace_t *ns = NULL;
+       axis2_char_t *ns_uri = NULL;
+       axiom_attribute_t *attr = NULL;
+       axutil_hash_t *attr_hash = NULL;
+       axutil_hash_index_t *hi = NULL;
+       axiom_element_t *element = NULL;
+
     ref_id =  oxs_token_get_ds_reference(env, ref_node);
     oxs_sign_part_set_id(sign_part, env, ref_id);
-
+       
     /*Remove the # from the id*/
     ref_id2 =  axutil_string_substring_starting_at(axutil_strdup(env, ref_id), 
1);
-
+       next_node = scope_node;
+       /*Look for the attribute with the Reference URI value*/
+       while(next_node)
+       {
+               element = axiom_node_get_data_element(next_node, env);
+               if(element)
+                       attr_hash = axiom_element_get_all_attributes(element, 
env);     
+
+               for (hi = axutil_hash_first(attr_hash, env); hi; hi = 
axutil_hash_next(env, hi))
+               {
+                       void *v = NULL;
+                       axutil_hash_this(hi, NULL, NULL, &v);
+                       if (v)
+                       {
+                               axis2_char_t *attr_val = NULL;
+                               axiom_attribute_t *attribute = 
(axiom_attribute_t*)v;                   
+                               attr_val = axiom_attribute_get_value(attribute, 
env);
+                               if(!axutil_strcmp(attr_val, ref_id2))
+                               {
+                                       attr = attribute;
+                                       break;
+                               }
+                       }
+               }
+               if(!attr &&  (scope_node == next_node))
+                       next_node = axiom_node_get_first_element(scope_node, 
env); /* Check the Id in child nodes*/
+               else if(!attr)
+                       next_node = axiom_node_get_next_sibling(next_node, env);
+               else
+                       break;
+
+       }
+
+       if(attr)
+       {       
+               oxs_sign_part_set_id_name(sign_part, env, 
axiom_attribute_get_localname(attr, env));
+               ns = axiom_attribute_get_namespace(attr, env);
+       }
+       else
+               return AXIS2_FAILURE;
     /*Find the node refered by this ref_id2 and set to the sign part*/
-    reffed_node = oxs_axiom_get_node_by_id(env, scope_node, "Id", ref_id2, 
OXS_WSU_XMLNS );
+       if(ns)
+               ns_uri = axiom_namespace_get_uri(ns, env, ns);
+       else
+               ns_uri = "";
+
+       if((id_name = oxs_sign_part_get_id_name(sign_part, env)))
+               reffed_node = oxs_axiom_get_node_by_id(env, scope_node, 
+                       id_name, ref_id2, ns_uri);
+       else
+               return AXIS2_FAILURE;
+
     if(reffed_node){
         oxs_sign_part_set_node(sign_part, env, reffed_node);
     }else{


Reply via email to