[jboss-user] [JBossWS] - Dispatch WS-Security Bug
cavani
do-not-reply at jboss.com
Wed Jan 23 15:24:08 EST 2008
I was trying to use WS-Security with JAX-WS Dispatch from version 2.0.2 but the response message returned still encrypted (it works with generated client). After some debug and code reading, I think that I figured it out.
On DispatchImpl, the code is:
| (...) msgContext.put(MessageContextJAXWS.MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);
|
| QName portName = epMetaData.getPortName();
| try
| {
| // Call the request handlers
| boolean handlerPass = callRequestHandlerChain(portName, handlerType[0]);
| handlerPass = handlerPass && callRequestHandlerChain(portName, handlerType[1]);
| handlerPass = handlerPass && callRequestHandlerChain(portName, handlerType[2]);
|
| // Handlers might have replaced the message
| reqMsg = (SOAPMessageImpl)msgContext.getSOAPMessage();
|
| MessageAbstraction resMsg = null;
| if (handlerPass)
| {
| Map<String, Object> callProps = new HashMap<String, Object>(getRequestContext());
| EndpointInfo epInfo = new EndpointInfo(epMetaData, targetAddress, callProps);
| resMsg = getRemotingConnection().invoke(reqMsg, epInfo, false);
|
| // Call the response handler chain, removing the fault type entry will not call handleFault for that chain
| handlerPass = callResponseHandlerChain(portName, handlerType[2]);
| faultType[2] = null;
| handlerPass = handlerPass && callResponseHandlerChain(portName, handlerType[1]);
| faultType[1] = null;
| handlerPass = handlerPass && callResponseHandlerChain(portName, handlerType[0]);
| faultType[0] = null;
| }
| (...)
|
But on CommonClient / ClientImpl, the similar code block is a bit different, but, essentially, the direction change after invocation.
| (...)
| DirectionHolder direction = new DirectionHolder(Direction.OutBound);
|
| // Get the order of pre/post handlerchains
| HandlerType[] handlerType = new HandlerType[] { HandlerType.PRE, HandlerType.ENDPOINT, HandlerType.POST };
| HandlerType[] faultType = new HandlerType[] { HandlerType.PRE, HandlerType.ENDPOINT, HandlerType.POST };
|
| QName portName = epMetaData.getPortName();
| try
| {
| // Get the binding from the provider
| CommonBinding binding = (CommonBinding)getCommonBindingProvider().getCommonBinding();
| binding.setHeaderSource(this);
|
| // Create the invocation and sync the input parameters
| epInv = new EndpointInvocation(opMetaData);
| epInv.initInputParams(inputParams);
|
| // Set the required outbound properties
| setOutboundContextProperties();
|
| // Bind the request message
| MessageAbstraction reqMessage = binding.bindRequestMessage(opMetaData, epInv, unboundHeaders);
|
| // Add possible attachment parts
| addAttachmentParts(reqMessage);
|
| // Call the request handlers
| boolean handlerPass = callRequestHandlerChain(portName, handlerType[0]);
| handlerPass = handlerPass && callRequestHandlerChain(portName, handlerType[1]);
| handlerPass = handlerPass && callRequestHandlerChain(portName, handlerType[2]);
|
| // Handlers might have replaced the message
| reqMessage = msgContext.getMessageAbstraction();
|
| if (handlerPass)
| {
| String targetAddress = getTargetEndpointAddress();
|
| // Fall back to wsa:To
| AddressingProperties addrProps = (AddressingProperties)msgContext.get(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND);
| if (targetAddress == null && addrProps != null && addrProps.getTo() != null)
| {
| AddressingConstantsImpl ADDR = new AddressingConstantsImpl();
| String wsaTo = addrProps.getTo().getURI().toString();
| if (wsaTo.equals(ADDR.getAnonymousURI()) == false)
| {
| try
| {
| URL wsaToURL = new URL(wsaTo);
| log.debug("Sending request to addressing destination: " + wsaToURL);
| targetAddress = wsaToURL.toExternalForm();
| }
| catch (MalformedURLException ex)
| {
| log.debug("Not a valid URL: " + wsaTo);
| }
| }
| }
|
| // The endpoint address must be known beyond this point
| if (targetAddress == null)
| throw new WSException("Target endpoint address not set");
|
| Map<String, Object> callProps = new HashMap<String, Object>(getRequestContext());
| EndpointInfo epInfo = new EndpointInfo(epMetaData, targetAddress, callProps);
| if (shouldMaintainSession())
| addSessionInfo(reqMessage, callProps);
|
| SOAPRemotingConnection remotingConnection = new SOAPRemotingConnection();
| MessageAbstraction resMessage = remotingConnection.invoke(reqMessage, epInfo, oneway);
|
| if (shouldMaintainSession())
| saveSessionInfo(callProps, getRequestContext());
|
| // At pivot the message context might be replaced
| msgContext = processPivotInternal(msgContext, direction);
|
| // Copy the remoting meta data
| msgContext.put(CommonMessageContext.REMOTING_METADATA, callProps);
|
| // Associate response message with message context
| msgContext.setMessageAbstraction(resMessage);
| }
|
| setInboundContextProperties();
|
| // Get the return object
| Object retObj = null;
| if (oneway == false && handlerPass)
| {
| // Verify
| if (binding instanceof CommonSOAPBinding)
| ((CommonSOAPBinding)binding).checkMustUnderstand(opMetaData);
|
| // Call the response handler chain, removing the fault type entry will not call handleFault for that chain
| handlerPass = callResponseHandlerChain(portName, handlerType[2]);
| faultType[2] = null;
| (...)
|
This is a bug, right? (sorry if I am wrong)
If so, this can be fixed fro 2.0.3 still?
Thanks,
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4122793#4122793
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4122793
More information about the jboss-user
mailing list