Author: coheigea
Date: Mon Apr 8 13:30:15 2013
New Revision: 1465629
URL: http://svn.apache.org/r1465629
Log:
Added in an OutInterceptor for StaX WS-Security + some tests + some interop
tests against the (inbound) DOM code
Added:
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/AbstractWSS4JStaxInterceptor.java
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxOutInterceptor.java
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxRoundTripTest.java
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxToDOMRoundTripTest.java
Modified:
cxf/branches/wss4j2.0-port/rt/ws/security/pom.xml
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/TestPwdCallback.java
Modified: cxf/branches/wss4j2.0-port/rt/ws/security/pom.xml
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/pom.xml?rev=1465629&r1=1465628&r2=1465629&view=diff
==============================================================================
--- cxf/branches/wss4j2.0-port/rt/ws/security/pom.xml (original)
+++ cxf/branches/wss4j2.0-port/rt/ws/security/pom.xml Mon Apr 8 13:30:15 2013
@@ -106,6 +106,11 @@
<artifactId>wss4j-policy</artifactId>
<version>${cxf.wss4j.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.wss4j</groupId>
+ <artifactId>wss4j-ws-security-stax</artifactId>
+ <version>${cxf.wss4j.version}</version>
+ </dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
Added:
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/AbstractWSS4JStaxInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/AbstractWSS4JStaxInterceptor.java?rev=1465629&view=auto
==============================================================================
---
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/AbstractWSS4JStaxInterceptor.java
(added)
+++
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/AbstractWSS4JStaxInterceptor.java
Mon Apr 8 13:30:15 2013
@@ -0,0 +1,148 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.security.wss4j;
+
+import java.net.URI;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.SoapInterceptor;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.PhaseInterceptor;
+import org.apache.wss4j.stax.ext.WSSConstants;
+
+public abstract class AbstractWSS4JStaxInterceptor implements SoapInterceptor,
+ PhaseInterceptor<SoapMessage> {
+
+ private static final Set<QName> HEADERS = new HashSet<QName>();
+ static {
+ HEADERS.add(new QName(WSSConstants.NS_WSSE10, "Security"));
+ HEADERS.add(new QName(WSSConstants.NS_WSSE11, "Security"));
+ HEADERS.add(new QName(WSSConstants.NS_XMLENC, "EncryptedData"));
+ }
+
+ private Map<String, Object> properties = new ConcurrentHashMap<String,
Object>();
+ private Set<String> before = new HashSet<String>();
+ private Set<String> after = new HashSet<String>();
+ private String phase;
+ private String id;
+
+ public AbstractWSS4JStaxInterceptor() {
+ super();
+ id = getClass().getName();
+ }
+
+ public Set<URI> getRoles() {
+ return null;
+ }
+
+ public void handleFault(SoapMessage message) {
+ }
+
+ public void postHandleMessage(SoapMessage message) throws Fault {
+ }
+ public Collection<PhaseInterceptor<? extends Message>>
getAdditionalInterceptors() {
+ return null;
+ }
+
+ public String getPhase() {
+ return phase;
+ }
+
+ public void setPhase(String phase) {
+ this.phase = phase;
+ }
+
+ public Object getOption(String key) {
+ return properties.get(key);
+ }
+
+ public void setProperty(String key, String value) {
+ properties.put(key, value);
+ }
+
+ public String getPassword(Object msgContext) {
+ return (String)((Message)msgContext).getContextualProperty("password");
+ }
+
+ public Object getProperty(Object msgContext, String key) {
+ Object obj = ((Message)msgContext).getContextualProperty(key);
+ if (obj == null) {
+ obj = getOption(key);
+ }
+ return obj;
+ }
+
+ public void setPassword(Object msgContext, String password) {
+ ((Message)msgContext).put("password", password);
+ }
+
+ public void setProperty(Object msgContext, String key, Object value) {
+ ((Message)msgContext).put(key, value);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Set<QName> getUnderstoodHeaders() {
+ return HEADERS;
+ }
+
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Map<String, Object> properties) {
+ this.properties = properties;
+ }
+
+ public Set<String> getAfter() {
+ return after;
+ }
+
+ public void setAfter(Set<String> after) {
+ this.after = after;
+ }
+
+ public Set<String> getBefore() {
+ return before;
+ }
+
+ public void setBefore(Set<String> before) {
+ this.before = before;
+ }
+
+ protected boolean isRequestor(SoapMessage message) {
+ return MessageUtils.isRequestor(message);
+ }
+
+}
Added:
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxOutInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxOutInterceptor.java?rev=1465629&view=auto
==============================================================================
---
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxOutInterceptor.java
(added)
+++
cxf/branches/wss4j2.0-port/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/WSS4JStaxOutInterceptor.java
Mon Apr 8 13:30:15 2013
@@ -0,0 +1,200 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.security.wss4j;
+
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
+import org.apache.cxf.interceptor.AttachmentOutInterceptor;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.StaxOutInterceptor;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.wss4j.common.ext.WSSecurityException;
+import org.apache.wss4j.stax.WSSec;
+import org.apache.wss4j.stax.ext.OutboundWSSec;
+import org.apache.wss4j.stax.ext.WSSSecurityProperties;
+import org.apache.xml.security.stax.securityEvent.SecurityEvent;
+import org.apache.xml.security.stax.securityEvent.SecurityEventListener;
+
+public class WSS4JStaxOutInterceptor extends AbstractWSS4JStaxInterceptor {
+
+ /**
+ * Property name for a map of action IDs ({@link Integer}) to action
+ * class names. Values can be either {@link Class}) or Objects
+- * implementing {@link Action}.
+ */
+ public static final String WSS4J_ACTION_MAP = "wss4j.action.map";
+
+ public static final String OUTPUT_STREAM_HOLDER =
+ WSS4JStaxOutInterceptor.class.getName() + ".outputstream";
+ private final OutboundWSSec outboundWSSec;
+ private WSS4JStaxOutInterceptorInternal ending;
+
+ private boolean mtomEnabled;
+
+ public WSS4JStaxOutInterceptor(WSSSecurityProperties securityProperties)
throws WSSecurityException {
+ super();
+ setPhase(Phase.PRE_STREAM);
+ getBefore().add(StaxOutInterceptor.class.getName());
+
+ ending = createEndingInterceptor();
+ outboundWSSec = WSSec.getOutboundWSSec(securityProperties);
+ }
+
+ /*
+ public WSS4JStaxOutInterceptor(Map<String, Object> props) {
+ this();
+ setProperties(props);
+ }
+ */
+
+ public boolean isAllowMTOM() {
+ return mtomEnabled;
+ }
+
+ /**
+ * Enable or disable mtom with WS-Security. By default MTOM is disabled
as
+ * attachments would not get encrypted or be part of the signature.
+ * @param mtomEnabled
+ */
+ public void setAllowMTOM(boolean allowMTOM) {
+ this.mtomEnabled = allowMTOM;
+ }
+
+
+ @Override
+ public Object getProperty(Object msgContext, String key) {
+ return super.getProperty(msgContext, key);
+ }
+
+ public void handleMessage(SoapMessage mc) throws Fault {
+ //must turn off mtom when using WS-Sec so binary is inlined so it can
+ //be properly signed/encrypted/etc...
+ if (!mtomEnabled) {
+ mc.put(org.apache.cxf.message.Message.MTOM_ENABLED, false);
+ }
+
+ OutputStream os = mc.getContent(OutputStream.class);
+ String encoding = getEncoding(mc);
+
+ final List<SecurityEvent> outgoingSecurityEventList = new
ArrayList<SecurityEvent>();
+ SecurityEventListener securityEventListener = new
SecurityEventListener() {
+ @Override
+ public void registerSecurityEvent(SecurityEvent securityEvent)
throws WSSecurityException {
+ outgoingSecurityEventList.add(securityEvent);
+ }
+ };
+ mc.getExchange().put(SecurityEvent.class.getName() + ".out",
outgoingSecurityEventList);
+
+ XMLStreamWriter newXMLStreamWriter;
+ try {
+ @SuppressWarnings("unchecked")
+ final List<SecurityEvent> requestSecurityEvents =
+ (List<SecurityEvent>)
mc.getExchange().get(SecurityEvent.class.getName() + ".in");
+ newXMLStreamWriter =
+ outboundWSSec.processOutMessage(os, encoding,
requestSecurityEvents, securityEventListener);
+ mc.setContent(XMLStreamWriter.class, newXMLStreamWriter);
+ } catch (WSSecurityException e) {
+ throw new Fault(e);
+ }
+
+
mc.put(AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION,
Boolean.TRUE);
+ mc.put(StaxOutInterceptor.FORCE_START_DOCUMENT, Boolean.TRUE);
+
+ if (MessageUtils.getContextualBoolean(mc,
StaxOutInterceptor.FORCE_START_DOCUMENT, false)) {
+ try {
+ newXMLStreamWriter.writeStartDocument(encoding, "1.0");
+ } catch (XMLStreamException e) {
+ throw new Fault(e);
+ }
+ mc.removeContent(OutputStream.class);
+ mc.put(OUTPUT_STREAM_HOLDER, os);
+ }
+
+ // Add a final interceptor to write end elements
+ mc.getInterceptorChain().add(ending);
+
+ }
+
+ /*
+ private OutboundWSSec createOutSecurityContext(Message message) {
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+
+ OutboundWSSec wssec = new OutboundWSSec(properties);
+
+ return wssec;
+ }
+ */
+
+ public final WSS4JStaxOutInterceptorInternal createEndingInterceptor() {
+ return new WSS4JStaxOutInterceptorInternal();
+ }
+
+ private String getEncoding(Message message) {
+ Exchange ex = message.getExchange();
+ String encoding = (String) message.get(Message.ENCODING);
+ if (encoding == null && ex.getInMessage() != null) {
+ encoding = (String) ex.getInMessage().get(Message.ENCODING);
+ message.put(Message.ENCODING, encoding);
+ }
+
+ if (encoding == null) {
+ encoding = "UTF-8";
+ message.put(Message.ENCODING, encoding);
+ }
+ return encoding;
+ }
+
+ final class WSS4JStaxOutInterceptorInternal extends
AbstractPhaseInterceptor<Message> {
+ public WSS4JStaxOutInterceptorInternal() {
+ super(Phase.PRE_STREAM_ENDING);
+
getAfter().add(AttachmentOutInterceptor.AttachmentOutEndingInterceptor.class.getName());
+ }
+
+ public void handleMessage(Message mc) throws Fault {
+ try {
+ XMLStreamWriter xtw = mc.getContent(XMLStreamWriter.class);
+ if (xtw != null) {
+ xtw.writeEndDocument();
+ xtw.flush();
+ xtw.close();
+ }
+
+ OutputStream os = (OutputStream) mc.get(OUTPUT_STREAM_HOLDER);
+ if (os != null) {
+ mc.setContent(OutputStream.class, os);
+ }
+ mc.removeContent(XMLStreamWriter.class);
+ } catch (XMLStreamException e) {
+ throw new Fault(e);
+ }
+ }
+
+ }
+}
Added:
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxRoundTripTest.java
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxRoundTripTest.java?rev=1465629&view=auto
==============================================================================
---
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxRoundTripTest.java
(added)
+++
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxRoundTripTest.java
Mon Apr 8 13:30:15 2013
@@ -0,0 +1,424 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.security.wss4j;
+
+import java.util.Properties;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.apache.cxf.service.Service;
+import org.apache.cxf.transport.local.LocalTransportFactory;
+import org.apache.wss4j.common.crypto.CryptoFactory;
+import org.apache.wss4j.stax.ext.WSSConstants;
+import org.apache.wss4j.stax.ext.WSSSecurityProperties;
+import org.apache.wss4j.stax.securityToken.WSSecurityTokenConstants;
+import org.apache.xml.security.stax.ext.SecurePart;
+import org.apache.xml.security.stax.ext.XMLSecurityConstants;
+import org.junit.Test;
+
+
+/**
+ */
+public class StaxRoundTripTest extends AbstractSecurityTest {
+
+ @Test
+ public void testUsernameTokenText() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN});
+
properties.setUsernameTokenPasswordType(WSSConstants.UsernameTokenPasswordType.PASSWORD_TEXT);
+ properties.setTokenUser("username");
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testUsernameTokenDigest() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN});
+
properties.setUsernameTokenPasswordType(WSSConstants.UsernameTokenPasswordType.PASSWORD_DIGEST);
+ properties.setTokenUser("username");
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ @org.junit.Ignore
+ public void testEncrypt() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.ENCRYPT});
+ properties.setEncryptionUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testEncryptUsernameToken() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN,
WSSConstants.ENCRYPT}
+ );
+ properties.addEncryptionPart(
+ new SecurePart(new QName(WSSConstants.NS_WSSE10, "UsernameToken"),
SecurePart.Modifier.Element)
+ );
+ properties.setEncryptionUser("myalias");
+ properties.setTokenUser("username");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testSignature() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE});
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testTimestamp() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.TIMESTAMP});
+
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testSignatureTimestamp() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE,
WSSConstants.TIMESTAMP}
+ );
+ properties.addSignaturePart(
+ new SecurePart(new QName(WSSConstants.NS_WSSE10, "Timestamp"),
SecurePart.Modifier.Element)
+ );
+ properties.addSignaturePart(
+ new SecurePart(new QName(WSSConstants.NS_SOAP11, "Body"),
SecurePart.Modifier.Element)
+ );
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testSignaturePKI() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE}
+ );
+ properties.setSignatureUser("alice");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("alice.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new KeystorePasswordCallback());
+ properties.setUseSingleCert(true);
+ properties.setSignatureKeyIdentifier(
+ WSSecurityTokenConstants.KeyIdentifier_SecurityTokenDirectReference
+ );
+
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ @org.junit.Ignore
+ public void testEncryptSignature() throws Exception {
+ // Create + configure service
+ createService();
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.ENCRYPT,
WSSConstants.SIGNATURE}
+ );
+ properties.setEncryptionUser("myalias");
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ /*
+ * TODO
+ @Test
+ public void testOverrideCustomAction() throws Exception {
+ SOAPMessage saaj = readSAAJDocument("wsse-request-clean.xml");
+
+ WSS4JOutInterceptor ohandler = new WSS4JOutInterceptor();
+ PhaseInterceptor<SoapMessage> handler =
ohandler.createEndingInterceptor();
+
+ SoapMessage msg = new SoapMessage(new MessageImpl());
+ Exchange ex = new ExchangeImpl();
+ ex.setInMessage(msg);
+
+ msg.setContent(SOAPMessage.class, saaj);
+
+ CountingUsernameTokenAction action = new CountingUsernameTokenAction();
+ Map<Object, Object> customActions = new HashMap<Object, Object>(1);
+ customActions.put(WSConstants.UT, action);
+
+ msg.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
+ msg.put(WSHandlerConstants.SIG_PROP_FILE, "outsecurity.properties");
+ msg.put(WSHandlerConstants.USER, "username");
+ msg.put("password", "myAliasPassword");
+ msg.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
+ msg.put(WSS4JOutInterceptor.WSS4J_ACTION_MAP, customActions);
+ handler.handleMessage(msg);
+
+ SOAPPart doc = saaj.getSOAPPart();
+ assertValid("//wsse:Security", doc);
+ assertValid("//wsse:Security/wsse:UsernameToken", doc);
+
assertValid("//wsse:Security/wsse:UsernameToken/wsse:Username[text()='username']",
doc);
+ // Test to see that the plaintext password is used in the header
+
assertValid("//wsse:Security/wsse:UsernameToken/wsse:Password[text()='myAliasPassword']",
doc);
+ assertEquals(1, action.getExecutions());
+
+ try {
+ customActions.put(WSConstants.UT, new Object());
+ handler.handleMessage(msg);
+ } catch (SoapFault e) {
+ assertEquals("An invalid action configuration was defined.",
e.getMessage());
+ }
+
+ try {
+ customActions.put(new Object(), CountingUsernameTokenAction.class);
+ handler.handleMessage(msg);
+ } catch (SoapFault e) {
+ assertEquals("An invalid action configuration was defined.",
e.getMessage());
+ }
+ }
+
+
+ @Test
+ public void testAddCustomAction() throws Exception {
+ SOAPMessage saaj = readSAAJDocument("wsse-request-clean.xml");
+
+ WSS4JOutInterceptor ohandler = new WSS4JOutInterceptor();
+ PhaseInterceptor<SoapMessage> handler =
ohandler.createEndingInterceptor();
+
+ SoapMessage msg = new SoapMessage(new MessageImpl());
+ Exchange ex = new ExchangeImpl();
+ ex.setInMessage(msg);
+
+ msg.setContent(SOAPMessage.class, saaj);
+
+ CountingUsernameTokenAction action = new CountingUsernameTokenAction();
+ Map<Object, Object> customActions = new HashMap<Object, Object>(1);
+ customActions.put(12345, action);
+
+ msg.put(WSHandlerConstants.ACTION, "12345");
+ msg.put(WSHandlerConstants.SIG_PROP_FILE, "outsecurity.properties");
+ msg.put(WSHandlerConstants.USER, "username");
+ msg.put("password", "myAliasPassword");
+ msg.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
+ msg.put(WSS4JOutInterceptor.WSS4J_ACTION_MAP, customActions);
+ handler.handleMessage(msg);
+
+ SOAPPart doc = saaj.getSOAPPart();
+ assertValid("//wsse:Security", doc);
+ assertValid("//wsse:Security/wsse:UsernameToken", doc);
+
assertValid("//wsse:Security/wsse:UsernameToken/wsse:Username[text()='username']",
doc);
+ // Test to see that the plaintext password is used in the header
+
assertValid("//wsse:Security/wsse:UsernameToken/wsse:Password[text()='myAliasPassword']",
doc);
+ assertEquals(1, action.getExecutions());
+ }
+
+ private static class CountingUsernameTokenAction extends
UsernameTokenAction {
+
+ private int executions;
+
+ @Override
+ public void execute(WSHandler handler, int actionToDo, Document doc,
+ RequestData reqData) throws WSSecurityException {
+
+ this.executions++;
+ reqData.setPwType(WSConstants.PW_TEXT);
+ super.execute(handler, actionToDo, doc, reqData);
+ }
+
+ public int getExecutions() {
+ return this.executions;
+ }
+ }
+ */
+
+ private Service createService() {
+ // Create the Service
+ JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
+ factory.setServiceBean(new EchoImpl());
+ factory.setAddress("local://Echo");
+ factory.setTransportId(LocalTransportFactory.TRANSPORT_ID);
+ Server server = factory.create();
+
+ Service service = server.getEndpoint().getService();
+ service.getInInterceptors().add(new LoggingInInterceptor());
+ service.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ return service;
+ }
+
+ private Echo createClientProxy() {
+ JaxWsProxyFactoryBean proxyFac = new JaxWsProxyFactoryBean();
+ proxyFac.setServiceClass(Echo.class);
+ proxyFac.setAddress("local://Echo");
+
proxyFac.getClientFactoryBean().setTransportId(LocalTransportFactory.TRANSPORT_ID);
+
+ return (Echo)proxyFac.create();
+ }
+}
Added:
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxToDOMRoundTripTest.java
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxToDOMRoundTripTest.java?rev=1465629&view=auto
==============================================================================
---
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxToDOMRoundTripTest.java
(added)
+++
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/StaxToDOMRoundTripTest.java
Mon Apr 8 13:30:15 2013
@@ -0,0 +1,439 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.security.wss4j;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.apache.cxf.service.Service;
+import org.apache.cxf.transport.local.LocalTransportFactory;
+import org.apache.wss4j.common.crypto.CryptoFactory;
+import org.apache.wss4j.dom.WSConstants;
+import org.apache.wss4j.dom.handler.WSHandlerConstants;
+import org.apache.wss4j.stax.ext.WSSConstants;
+import org.apache.wss4j.stax.ext.WSSSecurityProperties;
+import org.apache.wss4j.stax.securityToken.WSSecurityTokenConstants;
+import org.apache.xml.security.stax.ext.SecurePart;
+import org.apache.xml.security.stax.ext.XMLSecurityConstants;
+import org.junit.Test;
+
+
+/**
+ * In these test-cases, the client is using StaX and the service is using DOM.
+ */
+public class StaxToDOMRoundTripTest extends AbstractSecurityTest {
+
+ @Test
+ public void testUsernameTokenText() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
+ inProperties.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_TEXT);
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN});
+
properties.setUsernameTokenPasswordType(WSSConstants.UsernameTokenPasswordType.PASSWORD_TEXT);
+ properties.setTokenUser("username");
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+
+ // Negative test for wrong password type
+ service.getInInterceptors().remove(inInterceptor);
+ inProperties.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_DIGEST);
+ inInterceptor = new WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ try {
+ echo.echo("test");
+ fail("Failure expected on the wrong password type");
+ } catch (javax.xml.ws.soap.SOAPFaultException ex) {
+ // expected
+ String error = "The security token could not be authenticated or
authorized";
+ assertTrue(ex.getMessage().contains(error));
+ }
+ }
+
+ @Test
+ public void testUsernameTokenDigest() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
+ inProperties.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_DIGEST);
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN});
+
properties.setUsernameTokenPasswordType(WSSConstants.UsernameTokenPasswordType.PASSWORD_DIGEST);
+ properties.setTokenUser("username");
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+
+ // Negative test for wrong password type
+ service.getInInterceptors().remove(inInterceptor);
+ inProperties.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_TEXT);
+ inInterceptor = new WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ try {
+ echo.echo("test");
+ fail("Failure expected on the wrong password type");
+ } catch (javax.xml.ws.soap.SOAPFaultException ex) {
+ // expected
+ String error = "The security token could not be authenticated or
authorized";
+ assertTrue(ex.getMessage().contains(error));
+ }
+ }
+
+ @Test
+ public void testEncrypt() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.ENCRYPT);
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ inProperties.put(WSHandlerConstants.DEC_PROP_FILE,
"insecurity.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.ENCRYPT});
+ properties.setEncryptionUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testEncryptUsernameToken() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(
+ WSHandlerConstants.ACTION,
+ WSHandlerConstants.USERNAME_TOKEN + " " +
WSHandlerConstants.ENCRYPT
+ );
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ inProperties.put(WSHandlerConstants.DEC_PROP_FILE,
"insecurity.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.USERNAMETOKEN,
WSSConstants.ENCRYPT}
+ );
+ properties.addEncryptionPart(
+ new SecurePart(new QName(WSSConstants.NS_WSSE10, "UsernameToken"),
SecurePart.Modifier.Element)
+ );
+ properties.setEncryptionUser("myalias");
+ properties.setTokenUser("username");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testSignature() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.SIGNATURE);
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ inProperties.put(WSHandlerConstants.SIG_VER_PROP_FILE,
"insecurity.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE});
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testTimestamp() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.TIMESTAMP);
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(new
XMLSecurityConstants.Action[]{WSSConstants.TIMESTAMP});
+
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+
+ // Negative test for no Timestamp
+ service.getInInterceptors().remove(inInterceptor);
+ inProperties.put(WSHandlerConstants.ACTION, "");
+ inInterceptor = new WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ try {
+ echo.echo("test");
+ fail("Failure expected on no Timestamp");
+ } catch (javax.xml.ws.soap.SOAPFaultException ex) {
+ // expected
+ String error = "An error was discovered";
+ assertTrue(ex.getMessage().contains(error));
+ }
+ }
+
+ @Test
+ public void testSignatureTimestamp() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(
+ WSHandlerConstants.ACTION,
+ WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.TIMESTAMP
+ );
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ inProperties.put(WSHandlerConstants.SIG_VER_PROP_FILE,
"insecurity.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE,
WSSConstants.TIMESTAMP}
+ );
+ properties.addSignaturePart(
+ new SecurePart(new QName(WSSConstants.NS_WSSE10, "Timestamp"),
SecurePart.Modifier.Element)
+ );
+ properties.addSignaturePart(
+ new SecurePart(new QName(WSSConstants.NS_SOAP11, "Body"),
SecurePart.Modifier.Element)
+ );
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testSignaturePKI() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(WSHandlerConstants.ACTION,
WSHandlerConstants.SIGNATURE);
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
KeystorePasswordCallback());
+ inProperties.put(WSHandlerConstants.SIG_VER_PROP_FILE,
"cxfca.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.SIGNATURE}
+ );
+ properties.setSignatureUser("alice");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("alice.properties",
this.getClass().getClassLoader());
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new KeystorePasswordCallback());
+ properties.setUseSingleCert(true);
+ properties.setSignatureKeyIdentifier(
+ WSSecurityTokenConstants.KeyIdentifier_SecurityTokenDirectReference
+ );
+
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ @Test
+ public void testEncryptSignature() throws Exception {
+ // Create + configure service
+ Service service = createService();
+
+ Map<String, Object> inProperties = new HashMap<String, Object>();
+ inProperties.put(
+ WSHandlerConstants.ACTION,
+ WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.ENCRYPT
+ );
+ inProperties.put(WSHandlerConstants.PW_CALLBACK_REF, new
TestPwdCallback());
+ inProperties.put(WSHandlerConstants.SIG_VER_PROP_FILE,
"insecurity.properties");
+ inProperties.put(WSHandlerConstants.DEC_PROP_FILE,
"insecurity.properties");
+ WSS4JInInterceptor inInterceptor = new
WSS4JInInterceptor(inProperties);
+ service.getInInterceptors().add(inInterceptor);
+
+ // Create + configure client
+ Echo echo = createClientProxy();
+
+ Client client = ClientProxy.getClient(echo);
+ client.getInInterceptors().add(new LoggingInInterceptor());
+ client.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ WSSSecurityProperties properties = new WSSSecurityProperties();
+ properties.setOutAction(
+ new XMLSecurityConstants.Action[]{WSSConstants.ENCRYPT,
WSSConstants.SIGNATURE}
+ );
+ properties.setEncryptionUser("myalias");
+ properties.setSignatureUser("myalias");
+
+ Properties cryptoProperties =
+ CryptoFactory.getProperties("outsecurity.properties",
this.getClass().getClassLoader());
+ properties.setEncryptionCryptoProperties(cryptoProperties);
+ properties.setSignatureCryptoProperties(cryptoProperties);
+ properties.setCallbackHandler(new TestPwdCallback());
+ WSS4JStaxOutInterceptor ohandler = new
WSS4JStaxOutInterceptor(properties);
+ client.getOutInterceptors().add(ohandler);
+
+ assertEquals("test", echo.echo("test"));
+ }
+
+ private Service createService() {
+ // Create the Service
+ JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
+ factory.setServiceBean(new EchoImpl());
+ factory.setAddress("local://Echo");
+ factory.setTransportId(LocalTransportFactory.TRANSPORT_ID);
+ Server server = factory.create();
+
+ Service service = server.getEndpoint().getService();
+ service.getInInterceptors().add(new LoggingInInterceptor());
+ service.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ return service;
+ }
+
+ private Echo createClientProxy() {
+ JaxWsProxyFactoryBean proxyFac = new JaxWsProxyFactoryBean();
+ proxyFac.setServiceClass(Echo.class);
+ proxyFac.setAddress("local://Echo");
+
proxyFac.getClientFactoryBean().setTransportId(LocalTransportFactory.TRANSPORT_ID);
+
+ return (Echo)proxyFac.create();
+ }
+}
Modified:
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/TestPwdCallback.java
URL:
http://svn.apache.org/viewvc/cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/TestPwdCallback.java?rev=1465629&r1=1465628&r2=1465629&view=diff
==============================================================================
---
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/TestPwdCallback.java
(original)
+++
cxf/branches/wss4j2.0-port/rt/ws/security/src/test/java/org/apache/cxf/ws/security/wss4j/TestPwdCallback.java
Mon Apr 8 13:30:15 2013
@@ -35,6 +35,7 @@ public class TestPwdCallback implements
static {
passwords.put("myalias", "myAliasPassword");
passwords.put("alice", "alicePassword");
+ passwords.put("username", "myAliasPassword");
}
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {