( Axis2 / Rampart ) Disable BSP Compliance OR Remove <ec:InclusiveNamespaces>

688 views Asked by At

I am looking to disable BSP Compliance (I dont want my message containing the elements ).

I have tried, to no avail:

OutflowConfiguration outflowConfig = new OutflowConfiguration();
outflowConfig.setBSPCompliant(false);

stub._getServiceClient().getOptions().setProperty(WSSHandlerConstants.OUTFLOW_SECURITY, outflowConfig.getProperty());

Does anyone else know of a way to remove the element(s) from my outgoing SOAP Message in Axis2/Rampart?

1

There are 1 answers

0
user3112019 On BEST ANSWER

I figured out I can setup a new outgoing phase (via axis2.xml), which passes in a MessageContext to my customer Handler, and then I can get the SOAPEnvelope/Header via the MessageContext, traverse the elements and nodes, find the element(s) I want to remove, and then call removeChild.

For outgoing (OutFlow) Axis2 messages, WSS(4J) signing seems to happen in the "Security" Phase.

<phase name="Security"/>

So, I wanted to remove some XML Elements that got appended in the Security Phase. Specifically, the "ec:InclusiveNamespaces" elements. It seems to be from XML Exclusive Canonicalization, and I couldn't figure out any other way to disable this setting in WSS4J (apart from Re-Compiling Axis2/Rampart...)

So, we need to add our own, new, custom OutFlow Handler. After the Security Phase.

<phase name="PostSecurity">
        <handler name="MyOutHandler" class="com.yourcompany.YourSoapHandler"/> 
</phase>

Next, make your Custom Handler Class :

package com.yourcompany;

public class YourSoapHandler extends AbstractHandler {

    public InvocationResponse invoke(MessageContext ctx) throws AxisFault {

        SOAPEnvelope msgEnvelope = ctx.getEnvelope();
        SOAPHeader msgHeader = msgEnvelope.getHeader();

        Iterator theDescendants = msgHeader.getDescendants(true);
        while(theDescendants.hasNext()){

            Object o = theDescendants.next();

            if(o instanceof org.apache.axiom.om.impl.dom.ElementImpl){

                ElementImpl ele = (ElementImpl)o;
                String eleNodeName = ele.getNodeName();

                if("ds:CanonicalizationMethod".equals(eleNodeName) || "ds:Transform".equals(eleNodeName)){
                    Node aNode = ele.getElementsByTagName("ec:InclusiveNamespaces").item(0);
                    if(aNode != null){
                        ele.removeChild(aNode);
                    }
                }
            }
        }
        return InvocationResponse.CONTINUE;
    }
}

As long as you're passing in your updated Axis2.xml into your ConfigurationContext, which then gets passed into your service stub, you should be good to go.

Here are some references I used for learning about phases: http://www.packtpub.com/article/handler-and-phase-in-apache-axis http://wso2.com/library/777/

I hope this helps at least one other person out =D