Fixed the build.
This commit is contained in:
@@ -53,7 +53,30 @@ public class SaajSoapMessageFactory implements WebServiceMessageFactory, Initial
|
||||
|
||||
private String messageFactoryProtocol;
|
||||
|
||||
/**
|
||||
* Default, empty constructor.
|
||||
*/
|
||||
public SaajSoapMessageFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor that takes a message factory as an argument.
|
||||
*/
|
||||
public SaajSoapMessageFactory(MessageFactory messageFactory) {
|
||||
this.messageFactory = messageFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the SAAJ <code>MessageFactory</code> used.
|
||||
*/
|
||||
public MessageFactory getSaajMessageFactory() {
|
||||
return messageFactory;
|
||||
}
|
||||
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
if (messageFactory != null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) {
|
||||
if (!StringUtils.hasLength(messageFactoryProtocol)) {
|
||||
|
||||
@@ -24,7 +24,6 @@ import javax.xml.soap.SOAPConstants;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
@@ -48,7 +47,13 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
|
||||
private MessageContext context;
|
||||
|
||||
private SaajSoapMessageFactory factory;
|
||||
private SaajSoapMessageFactory soap11Factory;
|
||||
|
||||
private MessageFactory messageFactory;
|
||||
|
||||
private SaajSoapMessageFactory soap12Factory;
|
||||
|
||||
private Transformer transformer;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
interceptor = new PayloadValidatingInterceptor();
|
||||
@@ -57,18 +62,16 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
interceptor.setValidateResponse(true);
|
||||
interceptor.afterPropertiesSet();
|
||||
|
||||
factory = new SaajSoapMessageFactory();
|
||||
factory.afterPropertiesSet();
|
||||
context = new DefaultMessageContext(factory);
|
||||
soap11Factory = new SaajSoapMessageFactory(MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL));
|
||||
soap12Factory = new SaajSoapMessageFactory(MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL));
|
||||
transformer = TransformerFactory.newInstance().newTransformer();
|
||||
}
|
||||
|
||||
public void testHandleInvalidRequestSoap11() throws Exception {
|
||||
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
|
||||
SOAPMessage invalidMessage = messageFactory.createMessage();
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
SoapMessage invalidMessage = (SoapMessage) soap11Factory.createWebServiceMessage();
|
||||
InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml");
|
||||
transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody()));
|
||||
context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory);
|
||||
transformer.transform(new StreamSource(inputStream), invalidMessage.getPayloadResult());
|
||||
context = new DefaultMessageContext(invalidMessage, soap11Factory);
|
||||
|
||||
boolean result = interceptor.handleRequest(context, null);
|
||||
assertFalse("Invalid response from interceptor", result);
|
||||
@@ -84,14 +87,10 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testHandleInvalidRequestSoap12() throws Exception {
|
||||
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
|
||||
SOAPMessage invalidMessage = messageFactory.createMessage();
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
SoapMessage invalidMessage = (SoapMessage) soap12Factory.createWebServiceMessage();
|
||||
InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml");
|
||||
transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody()));
|
||||
factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL);
|
||||
factory.afterPropertiesSet();
|
||||
context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory);
|
||||
transformer.transform(new StreamSource(inputStream), invalidMessage.getPayloadResult());
|
||||
context = new DefaultMessageContext(invalidMessage, soap12Factory);
|
||||
|
||||
boolean result = interceptor.handleRequest(context, null);
|
||||
assertFalse("Invalid response from interceptor", result);
|
||||
@@ -113,12 +112,10 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
interceptor.setFaultStringOrReasonLocale(locale);
|
||||
interceptor.setAddValidationErrorDetail(false);
|
||||
|
||||
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
|
||||
SOAPMessage invalidMessage = messageFactory.createMessage();
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
SoapMessage invalidMessage = (SoapMessage) soap11Factory.createWebServiceMessage();
|
||||
InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml");
|
||||
transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody()));
|
||||
context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory);
|
||||
transformer.transform(new StreamSource(inputStream), invalidMessage.getPayloadResult());
|
||||
context = new DefaultMessageContext(invalidMessage, soap11Factory);
|
||||
|
||||
boolean result = interceptor.handleRequest(context, null);
|
||||
assertFalse("Invalid response from interceptor", result);
|
||||
@@ -171,6 +168,8 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
public void testNamespacesInType() throws Exception {
|
||||
// Make sure we use Xerces for this testcase: the JAXP implementation used internally by JDK 1.5 has a bug
|
||||
// See http://opensource.atlassian.com/projects/spring/browse/SWS-35
|
||||
String previousSchemaFactory =
|
||||
System.getProperty("javax.xml.validation.SchemaFactory:" + XMLConstants.W3C_XML_SCHEMA_NS_URI, "");
|
||||
System.setProperty("javax.xml.validation.SchemaFactory:" + XMLConstants.W3C_XML_SCHEMA_NS_URI,
|
||||
"org.apache.xerces.jaxp.validation.XMLSchemaFactory");
|
||||
try {
|
||||
@@ -179,13 +178,17 @@ public class PayloadValidatingInterceptorTest extends TestCase {
|
||||
MessageFactory messageFactory = MessageFactory.newInstance();
|
||||
SOAPMessage saajMessage =
|
||||
SaajUtils.loadMessage(new ClassPathResource("validSoapMessage.xml", getClass()), messageFactory);
|
||||
context = new DefaultMessageContext(new Saaj13SoapMessage(saajMessage),
|
||||
new SaajSoapMessageFactory(messageFactory));
|
||||
|
||||
boolean result = interceptor.handleRequest(context, null);
|
||||
assertTrue("Invalid response from interceptor", result);
|
||||
assertFalse("Response set", context.hasResponse());
|
||||
}
|
||||
finally {
|
||||
// Reset the property
|
||||
System.setProperty("javax.xml.validation.SchemaFactory:" + XMLConstants.W3C_XML_SCHEMA_NS_URI, "");
|
||||
System.setProperty("javax.xml.validation.SchemaFactory:" + XMLConstants.W3C_XML_SCHEMA_NS_URI,
|
||||
previousSchemaFactory);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,10 +23,10 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.ws.context.MessageContext;
|
||||
import org.springframework.ws.soap.SoapBody;
|
||||
import org.springframework.ws.soap.SoapEndpointInterceptor;
|
||||
import org.springframework.ws.soap.SoapHeaderElement;
|
||||
import org.springframework.ws.soap.SoapBody;
|
||||
import org.springframework.ws.soap.context.SoapMessageContext;
|
||||
import org.springframework.ws.soap.SoapMessage;
|
||||
|
||||
/**
|
||||
* Interceptor base class for interceptors that handle WS-Security.
|
||||
@@ -38,17 +38,17 @@ import org.springframework.ws.soap.context.SoapMessageContext;
|
||||
*/
|
||||
public abstract class AbstractWsSecurityInterceptor implements SoapEndpointInterceptor {
|
||||
|
||||
private static final QName WS_SECURITY_NAME =
|
||||
new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
|
||||
|
||||
/**
|
||||
* Logger available to subclasses.
|
||||
*/
|
||||
private final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
private boolean validateRequest = true;
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
private boolean secureResponse = true;
|
||||
|
||||
private static final QName WS_SECURITY_NAME =
|
||||
new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
|
||||
private boolean validateRequest = true;
|
||||
|
||||
/**
|
||||
* Indicates whether outgoing responsed are to be secured. Defaults to <code>true</code>.
|
||||
@@ -66,20 +66,14 @@ public abstract class AbstractWsSecurityInterceptor implements SoapEndpointInter
|
||||
|
||||
public final boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
|
||||
if (validateRequest) {
|
||||
Assert.isTrue(messageContext instanceof SoapMessageContext,
|
||||
"WsSecurityInterceptor requires a SoapMessageContext");
|
||||
SoapMessageContext soapMessageContext = (SoapMessageContext) messageContext;
|
||||
Assert.isTrue(messageContext.getRequest() instanceof SoapMessage,
|
||||
"WsSecurityInterceptor requires a SoapMessage request");
|
||||
try {
|
||||
validateRequest(soapMessageContext);
|
||||
validateMessage((SoapMessage) messageContext.getRequest());
|
||||
return true;
|
||||
}
|
||||
catch (WsSecurityValidationException ex) {
|
||||
if (logger.isWarnEnabled()) {
|
||||
logger.warn("Could not validate request: " + ex.getMessage());
|
||||
}
|
||||
SoapBody response = soapMessageContext.getSoapResponse().getSoapBody();
|
||||
response.addClientOrSenderFault(ex.getMessage(), Locale.ENGLISH);
|
||||
return false;
|
||||
return handleValidationException(ex, messageContext);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -89,18 +83,14 @@ public abstract class AbstractWsSecurityInterceptor implements SoapEndpointInter
|
||||
|
||||
public final boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
|
||||
if (secureResponse) {
|
||||
Assert.isTrue(messageContext instanceof SoapMessageContext,
|
||||
"WsSecurityInterceptor requires a SoapMessageContext");
|
||||
SoapMessageContext soapMessageContext = (SoapMessageContext) messageContext;
|
||||
Assert.isTrue(messageContext.getResponse() instanceof SoapMessage,
|
||||
"WsSecurityInterceptor requires a SoapMessage response");
|
||||
try {
|
||||
secureResponse(soapMessageContext);
|
||||
secureMessage((SoapMessage) messageContext.getResponse());
|
||||
return true;
|
||||
}
|
||||
catch (WsSecuritySecurementException ex) {
|
||||
if (logger.isErrorEnabled()) {
|
||||
logger.error("Could not secure response: " + ex.getMessage(), ex);
|
||||
}
|
||||
return false;
|
||||
return handleSecurementException(ex, messageContext);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -108,29 +98,64 @@ public abstract class AbstractWsSecurityInterceptor implements SoapEndpointInter
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <code>true</code>, i.e. faults are not secured.
|
||||
*/
|
||||
public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean understands(SoapHeaderElement headerElement) {
|
||||
return WS_SECURITY_NAME.equals(headerElement.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles an securement exception. Default implementation logs the given exception, and returns
|
||||
* <code>false</code>.
|
||||
*
|
||||
* @param ex the validation exception
|
||||
* @param messageContext the message context
|
||||
* @return <code>true</code> to continue processing the message, <code>false</code> (the default) otherwise
|
||||
*/
|
||||
protected boolean handleSecurementException(WsSecuritySecurementException ex, MessageContext messageContext) {
|
||||
if (logger.isErrorEnabled()) {
|
||||
logger.error("Could not secure response: " + ex.getMessage(), ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles an invalid SOAP message. Default implementation logs the given exception, and creates a SOAP 1.1 Client
|
||||
* or SOAP 1.2 Sender Fault with the exception message as fault string, and returns <code>false</code>.
|
||||
*
|
||||
* @param ex the validation exception
|
||||
* @param messageContext the message context
|
||||
* @return <code>true</code> to continue processing the message, <code>false</code> (the default) otherwise
|
||||
*/
|
||||
protected boolean handleValidationException(WsSecurityValidationException ex, MessageContext messageContext) {
|
||||
if (logger.isWarnEnabled()) {
|
||||
logger.warn("Could not validate request: " + ex.getMessage());
|
||||
}
|
||||
SoapBody response = ((SoapMessage) messageContext.getResponse()).getSoapBody();
|
||||
response.addClientOrSenderFault(ex.getMessage(), Locale.ENGLISH);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Abstract template method. Subclasses are required to validate the request contained in the given
|
||||
* <code>SoapMessageContext</code>, and replace the original request with the validated version.
|
||||
*
|
||||
* @param messageContext the soap message context
|
||||
* @param soapMessage the soap message to validate
|
||||
* @throws WsSecurityValidationException in case of validation errors
|
||||
*/
|
||||
protected abstract void validateRequest(SoapMessageContext messageContext) throws WsSecurityValidationException;
|
||||
protected abstract void validateMessage(SoapMessage soapMessage) throws WsSecurityValidationException;
|
||||
|
||||
/**
|
||||
* Abstract template method. Subclasses are required to secure the response contained in the given
|
||||
* <code>SoapMessageContext</code>, and replace the original response with the secured version.
|
||||
*
|
||||
* @param messageContext the soap message context
|
||||
* @param soapMessage the soap message to secure
|
||||
* @throws WsSecuritySecurementException in case of securement errors
|
||||
*/
|
||||
protected abstract void secureResponse(SoapMessageContext messageContext) throws WsSecuritySecurementException;
|
||||
|
||||
public boolean understands(SoapHeaderElement headerElement) {
|
||||
return WS_SECURITY_NAME.equals(headerElement.getName());
|
||||
}
|
||||
protected abstract void secureMessage(SoapMessage soapMessage) throws WsSecuritySecurementException;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package org.springframework.ws.soap.security.xwss;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.security.auth.callback.CallbackHandler;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
|
||||
@@ -25,15 +24,13 @@ import com.sun.xml.wss.ProcessingContext;
|
||||
import com.sun.xml.wss.XWSSProcessor;
|
||||
import com.sun.xml.wss.XWSSProcessorFactory;
|
||||
import com.sun.xml.wss.XWSSecurityException;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.ws.soap.context.SoapMessageContext;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessageContext;
|
||||
import org.springframework.ws.soap.SoapMessage;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.security.AbstractWsSecurityInterceptor;
|
||||
import org.springframework.ws.soap.security.WsSecurityValidationException;
|
||||
import org.springframework.ws.soap.security.xwss.callback.CallbackHandlerChain;
|
||||
|
||||
/**
|
||||
@@ -49,19 +46,17 @@ import org.springframework.ws.soap.security.xwss.callback.CallbackHandlerChain;
|
||||
* Web Services Tutorial</a>.
|
||||
* <p/>
|
||||
* <b>Note</b> that this interceptor depends on SAAJ, and thus requires <code>SaajSoapMessage</code>s to operate. This
|
||||
* means that you must use a <code>SaajSoapMessageContextFactory</code> to create the SOAP messages.
|
||||
* means that you must use a <code>SaajSoapMessageFactory</code> to create the SOAP messages.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see #setCallbackHandler(javax.security.auth.callback.CallbackHandler)
|
||||
* @see #setPolicyConfiguration(org.springframework.core.io.Resource)
|
||||
* @see com.sun.xml.wss.impl.callback.XWSSCallback
|
||||
* @see org.springframework.ws.soap.saaj.SaajSoapMessageContextFactory
|
||||
* @see org.springframework.ws.soap.saaj.SaajSoapMessageFactory
|
||||
* @see <a href="https://xwss.dev.java.net/">XWSS</a>
|
||||
*/
|
||||
public class XwsSecurityInterceptor extends AbstractWsSecurityInterceptor implements InitializingBean {
|
||||
|
||||
private static final Log logger = LogFactory.getLog(XwsSecurityInterceptor.class);
|
||||
|
||||
private XWSSProcessor processor;
|
||||
|
||||
private CallbackHandler callbackHandler;
|
||||
@@ -117,35 +112,23 @@ public class XwsSecurityInterceptor extends AbstractWsSecurityInterceptor implem
|
||||
}
|
||||
}
|
||||
|
||||
protected void secureResponse(SoapMessageContext soapMessageContext) throws XwsSecuritySecurementException {
|
||||
Assert.isTrue(soapMessageContext instanceof SaajSoapMessageContext,
|
||||
"XwsSecurityInterceptor requires a SaajSoapMessageContext. " +
|
||||
"Use a SaajSoapMessageContextFactory to create the SOAP messages.");
|
||||
SaajSoapMessageContext saajMessageContext = (SaajSoapMessageContext) soapMessageContext;
|
||||
SOAPMessage securedMessage = secureMessage(saajMessageContext.getSaajResponse());
|
||||
saajMessageContext.setSaajResponse(securedMessage);
|
||||
}
|
||||
|
||||
protected void validateRequest(SoapMessageContext soapMessageContext) throws XwsSecurityValidationException {
|
||||
Assert.isTrue(soapMessageContext instanceof SaajSoapMessageContext,
|
||||
"XwsSecurityInterceptor requires a SaajSoapMessageContext" +
|
||||
"Use a SaajSoapMessageContextFactory to create the SOAP messages.");
|
||||
SaajSoapMessageContext saajMessageContext = (SaajSoapMessageContext) soapMessageContext;
|
||||
SOAPMessage validatedMessage = validateMessage(saajMessageContext.getSaajRequest());
|
||||
saajMessageContext.setSaajRequest(validatedMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Secures the given SAAJ message in accordance with the defined security policy and returns the secured result.
|
||||
* Secures the given SoapMessage message in accordance with the defined security policy and returns the secured
|
||||
* result.
|
||||
*
|
||||
* @param message the message to be secured
|
||||
* @param soapMessage the message to be secured
|
||||
* @return the secured message
|
||||
* @throws XwsSecuritySecurementException in case of errors
|
||||
* @throws IllegalArgumentException when soapMessage is not a <code>SaajSoapMessage</code>
|
||||
*/
|
||||
protected SOAPMessage secureMessage(SOAPMessage message) throws XwsSecuritySecurementException {
|
||||
protected void secureMessage(SoapMessage soapMessage) throws XwsSecuritySecurementException {
|
||||
Assert.isTrue(soapMessage instanceof SaajSoapMessage, "XwsSecurityInterceptor requires a SaajSoapMessage. " +
|
||||
"Use a SaajSoapMessageFactory to create the SOAP messages.");
|
||||
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) soapMessage;
|
||||
try {
|
||||
ProcessingContext context = processor.createProcessingContext(message);
|
||||
return processor.secureOutboundMessage(context);
|
||||
ProcessingContext context = processor.createProcessingContext(saajSoapMessage.getSaajMessage());
|
||||
SOAPMessage result = processor.secureOutboundMessage(context);
|
||||
saajSoapMessage.setSaajMessage(result);
|
||||
}
|
||||
catch (XWSSecurityException ex) {
|
||||
throw new XwsSecuritySecurementException(ex.getMessage(), ex);
|
||||
@@ -153,17 +136,22 @@ public class XwsSecurityInterceptor extends AbstractWsSecurityInterceptor implem
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the given SAAJ message in accordance with the defined security policy and returns the validated
|
||||
* Validates the given SoapMessage message in accordance with the defined security policy and returns the validated
|
||||
* result.
|
||||
*
|
||||
* @param message the message to be validated
|
||||
* @param soapMessage the message to be validated
|
||||
* @return the validated message
|
||||
* @throws XwsSecurityValidationException in case of errors
|
||||
* @throws IllegalArgumentException when soapMessage is not a <code>SaajSoapMessage</code>
|
||||
*/
|
||||
protected SOAPMessage validateMessage(SOAPMessage message) throws XwsSecurityValidationException {
|
||||
protected void validateMessage(SoapMessage soapMessage) throws WsSecurityValidationException {
|
||||
Assert.isTrue(soapMessage instanceof SaajSoapMessage, "XwsSecurityInterceptor requires a SaajSoapMessage. " +
|
||||
"Use a SaajSoapMessageFactory to create the SOAP messages.");
|
||||
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) soapMessage;
|
||||
try {
|
||||
ProcessingContext context = processor.createProcessingContext(message);
|
||||
return processor.verifyInboundMessage(context);
|
||||
ProcessingContext context = processor.createProcessingContext(saajSoapMessage.getSaajMessage());
|
||||
SOAPMessage result = processor.verifyInboundMessage(context);
|
||||
saajSoapMessage.setSaajMessage(result);
|
||||
}
|
||||
catch (XWSSecurityException ex) {
|
||||
throw new XwsSecurityValidationException(ex.getMessage(), ex);
|
||||
|
||||
@@ -20,8 +20,13 @@ import javax.xml.soap.MessageFactory;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessageContext;
|
||||
import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext;
|
||||
import org.springframework.ws.context.DefaultMessageContext;
|
||||
import org.springframework.ws.context.MessageContext;
|
||||
import org.springframework.ws.soap.SoapMessage;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
|
||||
import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage;
|
||||
import org.springframework.ws.soap.security.WsSecurityValidationException;
|
||||
|
||||
public class XwsSecurityInterceptorTest extends TestCase {
|
||||
|
||||
@@ -35,42 +40,43 @@ public class XwsSecurityInterceptorTest extends TestCase {
|
||||
final SOAPMessage request = messageFactory.createMessage();
|
||||
final SOAPMessage validatedRequest = messageFactory.createMessage();
|
||||
XwsSecurityInterceptor interceptor = new XwsSecurityInterceptor() {
|
||||
protected SOAPMessage secureMessage(SOAPMessage message) throws XwsSecuritySecurementException {
|
||||
|
||||
protected void secureMessage(SoapMessage soapMessage) throws XwsSecuritySecurementException {
|
||||
fail("secure not expected");
|
||||
return null;
|
||||
}
|
||||
|
||||
protected SOAPMessage validateMessage(SOAPMessage message) throws XwsSecurityValidationException {
|
||||
assertEquals("Invalid message", request, message);
|
||||
return validatedRequest;
|
||||
protected void validateMessage(SoapMessage message) throws WsSecurityValidationException {
|
||||
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;
|
||||
assertEquals("Invalid message", request, saajSoapMessage.getSaajMessage());
|
||||
saajSoapMessage.setSaajMessage(validatedRequest);
|
||||
}
|
||||
|
||||
};
|
||||
SaajSoapMessageContext context = new Saaj13SoapMessageContext(request, messageFactory);
|
||||
MessageContext context =
|
||||
new DefaultMessageContext(new Saaj13SoapMessage(request), new SaajSoapMessageFactory(messageFactory));
|
||||
interceptor.handleRequest(context, null);
|
||||
assertEquals("Invalid request", validatedRequest, context.getSaajRequest());
|
||||
assertEquals("Invalid request", validatedRequest, ((SaajSoapMessage) context.getRequest()).getSaajMessage());
|
||||
}
|
||||
|
||||
public void testhandleResponse() throws Exception {
|
||||
final SOAPMessage response = messageFactory.createMessage();
|
||||
final SOAPMessage securedResponse = messageFactory.createMessage();
|
||||
XwsSecurityInterceptor interceptor = new XwsSecurityInterceptor() {
|
||||
protected SOAPMessage secureMessage(SOAPMessage message) throws XwsSecuritySecurementException {
|
||||
assertEquals("Invalid message", response, message);
|
||||
return securedResponse;
|
||||
|
||||
protected void secureMessage(SoapMessage message) throws XwsSecuritySecurementException {
|
||||
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;
|
||||
saajSoapMessage.setSaajMessage(securedResponse);
|
||||
}
|
||||
|
||||
protected SOAPMessage validateMessage(SOAPMessage message) throws XwsSecurityValidationException {
|
||||
protected void validateMessage(SoapMessage soapMessage) throws WsSecurityValidationException {
|
||||
fail("validate not expected");
|
||||
return null;
|
||||
}
|
||||
|
||||
};
|
||||
SOAPMessage request = messageFactory.createMessage();
|
||||
SaajSoapMessageContext context = new Saaj13SoapMessageContext(request, messageFactory);
|
||||
context.setSaajResponse(response);
|
||||
MessageContext context =
|
||||
new DefaultMessageContext(new Saaj13SoapMessage(request), new SaajSoapMessageFactory(messageFactory));
|
||||
interceptor.handleResponse(context, null);
|
||||
assertEquals("Invalid response", securedResponse, context.getSaajResponse());
|
||||
assertEquals("Invalid response", securedResponse, ((SaajSoapMessage) context.getResponse()).getSaajMessage());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -22,8 +22,8 @@ import javax.xml.soap.SOAPMessage;
|
||||
|
||||
import com.sun.xml.wss.impl.callback.DecryptionKeyCallback;
|
||||
import com.sun.xml.wss.impl.callback.EncryptionKeyCallback;
|
||||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.security.xwss.callback.AbstractCallbackHandler;
|
||||
|
||||
public class XwssMessageInterceptorEncryptTest extends XwssMessageInterceptorKeyStoreTestCase {
|
||||
@@ -52,8 +52,9 @@ public class XwssMessageInterceptorEncryptTest extends XwssMessageInterceptorKey
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathExists("BinarySecurityToken does not exist",
|
||||
"SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
|
||||
@@ -85,8 +86,9 @@ public class XwssMessageInterceptorEncryptTest extends XwssMessageInterceptorKey
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathExists("BinarySecurityToken does not exist",
|
||||
"SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
|
||||
@@ -118,8 +120,9 @@ public class XwssMessageInterceptorEncryptTest extends XwssMessageInterceptorKey
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("encrypted-soap.xml");
|
||||
SOAPMessage result = interceptor.validateMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("encrypted-soap.xml");
|
||||
interceptor.validateMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
|
||||
}
|
||||
|
||||
@@ -17,15 +17,14 @@
|
||||
package org.springframework.ws.soap.security.xwss;
|
||||
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import javax.security.auth.callback.Callback;
|
||||
import javax.security.auth.callback.CallbackHandler;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
|
||||
import com.sun.xml.wss.impl.callback.CertificateValidationCallback;
|
||||
import com.sun.xml.wss.impl.callback.SignatureKeyCallback;
|
||||
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.security.xwss.callback.AbstractCallbackHandler;
|
||||
|
||||
public class XwssMessageInterceptorSignTest extends XwssMessageInterceptorKeyStoreTestCase {
|
||||
@@ -54,8 +53,9 @@ public class XwssMessageInterceptorSignTest extends XwssMessageInterceptorKeySto
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathExists("BinarySecurityToken does not exist",
|
||||
"SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
|
||||
@@ -88,8 +88,9 @@ public class XwssMessageInterceptorSignTest extends XwssMessageInterceptorKeySto
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathExists("BinarySecurityToken does not exist",
|
||||
"SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:BinarySecurityToken", result);
|
||||
@@ -118,8 +119,9 @@ public class XwssMessageInterceptorSignTest extends XwssMessageInterceptorKeySto
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("signed-soap.xml");
|
||||
SOAPMessage result = interceptor.validateMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("signed-soap.xml");
|
||||
interceptor.validateMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
|
||||
}
|
||||
|
||||
@@ -20,18 +20,18 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.soap.MessageFactory;
|
||||
import javax.xml.soap.MimeHeaders;
|
||||
import javax.xml.soap.SOAPException;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage;
|
||||
import org.springframework.xml.xpath.XPathExpression;
|
||||
import org.springframework.xml.xpath.XPathExpressionFactory;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
public abstract class XwssMessageInterceptorTestCase extends TestCase {
|
||||
|
||||
@@ -76,14 +76,14 @@ public abstract class XwssMessageInterceptorTestCase extends TestCase {
|
||||
assertNull(message, node);
|
||||
}
|
||||
|
||||
protected SOAPMessage loadSaajMessage(String fileName) throws SOAPException, IOException {
|
||||
protected SaajSoapMessage loadSaajMessage(String fileName) throws SOAPException, IOException {
|
||||
MimeHeaders mimeHeaders = new MimeHeaders();
|
||||
mimeHeaders.addHeader("Content-Type", "text/xml");
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = getClass().getResourceAsStream(fileName);
|
||||
assertNotNull("Could not load SAAJ message with name [" + fileName + "]", is);
|
||||
return messageFactory.createMessage(mimeHeaders, is);
|
||||
assertNotNull("Could not load SAAJ message with name [" + fileName + "]", is);
|
||||
return new Saaj13SoapMessage(messageFactory.createMessage(mimeHeaders, is));
|
||||
}
|
||||
finally {
|
||||
if (is != null) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
|
||||
import com.sun.xml.wss.impl.callback.TimestampValidationCallback;
|
||||
import com.sun.xml.wss.impl.callback.UsernameCallback;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.ws.soap.saaj.SaajSoapMessage;
|
||||
import org.springframework.ws.soap.security.xwss.callback.AbstractCallbackHandler;
|
||||
|
||||
public class XwssMessageInterceptorUsernameTokenTest extends XwssMessageInterceptorTestCase {
|
||||
@@ -48,13 +49,12 @@ public class XwssMessageInterceptorUsernameTokenTest extends XwssMessageIntercep
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathEvaluatesTo("Invalid Username",
|
||||
"Bert",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()",
|
||||
result);
|
||||
assertXpathEvaluatesTo("Invalid Username", "Bert",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()", result);
|
||||
assertXpathExists("Password does not exist",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Password[@Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest']",
|
||||
result);
|
||||
@@ -79,15 +79,13 @@ public class XwssMessageInterceptorUsernameTokenTest extends XwssMessageIntercep
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("empty-soap.xml");
|
||||
SOAPMessage result = interceptor.secureMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("empty-soap.xml");
|
||||
interceptor.secureMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathEvaluatesTo("Invalid Username",
|
||||
"Bert",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()",
|
||||
result);
|
||||
assertXpathEvaluatesTo("Invalid Password",
|
||||
"Ernie",
|
||||
assertXpathEvaluatesTo("Invalid Username", "Bert",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Username/text()", result);
|
||||
assertXpathEvaluatesTo("Invalid Password", "Ernie",
|
||||
"/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security/wsse:UsernameToken/wsse:Password[@Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText']/text()",
|
||||
result);
|
||||
}
|
||||
@@ -123,8 +121,9 @@ public class XwssMessageInterceptorUsernameTokenTest extends XwssMessageIntercep
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("usernameTokenPlainText-soap.xml");
|
||||
SOAPMessage result = interceptor.validateMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("usernameTokenPlainText-soap.xml");
|
||||
interceptor.validateMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
|
||||
}
|
||||
@@ -161,8 +160,9 @@ public class XwssMessageInterceptorUsernameTokenTest extends XwssMessageIntercep
|
||||
};
|
||||
interceptor.setCallbackHandler(handler);
|
||||
interceptor.afterPropertiesSet();
|
||||
SOAPMessage message = loadSaajMessage("usernameTokenDigest-soap.xml");
|
||||
SOAPMessage result = interceptor.validateMessage(message);
|
||||
SaajSoapMessage message = loadSaajMessage("usernameTokenDigest-soap.xml");
|
||||
interceptor.validateMessage(message);
|
||||
SOAPMessage result = message.getSaajMessage();
|
||||
assertNotNull("No result returned", result);
|
||||
assertXpathNotExists("Security Header not removed", "/SOAP-ENV:Envelope/SOAP-ENV:Header/wsse:Security", result);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user