Fixed the build.

This commit is contained in:
Arjen Poutsma
2006-11-16 10:56:37 +00:00
parent eae2989096
commit 8013f469f5
9 changed files with 202 additions and 152 deletions

View File

@@ -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)) {

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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());
}
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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);
}