From 43eb72f57cbb4b24a166c5461ce816cedf7e4432 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 1 May 2008 23:54:47 +0000 Subject: [PATCH] SWS-345 --- security/pom.xml | 1 + .../wss4j/Wss4jSecurityInterceptor.java | 23 +++++++++-- .../SaajWss4jMessageInterceptorSignTest.java | 41 +++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/security/pom.xml b/security/pom.xml index d9f5f0a1..b6ea18db 100644 --- a/security/pom.xml +++ b/security/pom.xml @@ -136,6 +136,7 @@ org.acegisecurity acegi-security + true diff --git a/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java b/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java index b0b42da6..57bf1de8 100755 --- a/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java +++ b/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java @@ -23,6 +23,7 @@ import java.util.Vector; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; +import javax.xml.soap.SOAPException; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPFactory; @@ -48,6 +49,7 @@ import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.axiom.AxiomSoapMessage; import org.springframework.ws.soap.axiom.support.AxiomUtils; import org.springframework.ws.soap.saaj.SaajSoapMessage; +import org.springframework.ws.soap.saaj.SaajSoapMessageException; import org.springframework.ws.soap.security.AbstractWsSecurityInterceptor; import org.springframework.ws.soap.security.WsSecuritySecurementException; import org.springframework.ws.soap.security.WsSecurityValidationException; @@ -590,8 +592,14 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl /** Converts the given {@link SoapMessage} into a {@link Document}. */ private Document toDocument(SoapMessage soapMessage) { if (soapMessage instanceof SaajSoapMessage) { - SaajSoapMessage saajMessage = (SaajSoapMessage) soapMessage; - return saajMessage.getSaajMessage().getSOAPPart(); + javax.xml.soap.SOAPMessage saajMessage = ((SaajSoapMessage) soapMessage).getSaajMessage(); + try { + saajMessage.saveChanges(); + } + catch (SOAPException ex) { + throw new SaajSoapMessageException("Could not save changes", ex); + } + return saajMessage.getSOAPPart(); } else if (soapMessage instanceof AxiomSoapMessage) { AxiomSoapMessage axiomMessage = (AxiomSoapMessage) soapMessage; @@ -608,7 +616,16 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl * for a {@link SaajSoapMessage}. */ private void replaceMessage(SoapMessage soapMessage, Document envelope) { - if (soapMessage instanceof AxiomSoapMessage) { + if (soapMessage instanceof SaajSoapMessage) { + javax.xml.soap.SOAPMessage saajMessage = ((SaajSoapMessage) soapMessage).getSaajMessage(); + try { + saajMessage.saveChanges(); + } + catch (SOAPException ex) { + throw new SaajSoapMessageException("Could not save changes", ex); + } + } + else if (soapMessage instanceof AxiomSoapMessage) { // construct a new Axiom message with the processed envelope AxiomSoapMessage axiomMessage = (AxiomSoapMessage) soapMessage; SOAPEnvelope envelopeFromDOMDocument = AxiomUtils.toEnvelope(envelope); diff --git a/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java b/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java index 25ee62ff..bcdd05aa 100755 --- a/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java +++ b/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java @@ -1,5 +1,46 @@ package org.springframework.ws.soap.security.wss4j; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import javax.xml.namespace.QName; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.MimeHeaders; +import javax.xml.soap.SOAPMessage; + +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; + public class SaajWss4jMessageInterceptorSignTest extends Wss4jMessageInterceptorSignTestCase { + public void testSignAndValidate() throws Exception { + MessageFactory messageFactory = MessageFactory.newInstance(); + interceptor.setSecurementActions("Signature"); + interceptor.setEnableSignatureConfirmation(false); + interceptor.setSecurementPassword("123456"); + interceptor.setSecurementUsername("rsaKey"); + SOAPMessage saajMessage = messageFactory.createMessage(); + saajMessage.getSOAPBody() + .addBodyElement(new QName("http://fabrikam123.com/payloads", "StockSymbol", "tru")).addTextNode("QQQ"); + SoapMessage message = new SaajSoapMessage(saajMessage); + MessageContext messageContext = new DefaultMessageContext(message, new SaajSoapMessageFactory(messageFactory)); + + interceptor.secureMessage(message, messageContext); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + message.writeTo(bos); + + MimeHeaders mimeHeaders = new MimeHeaders(); + mimeHeaders.addHeader("Content-Type", "text/xml"); + ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); + + SOAPMessage signed = messageFactory.createMessage(mimeHeaders, bis); + message = new SaajSoapMessage(signed); + messageContext = new DefaultMessageContext(message, new SaajSoapMessageFactory(messageFactory)); + + interceptor.validateMessage(message, messageContext); + } + }