This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/saml-refactor-new in repository https://gitbox.apache.org/repos/asf/ws-wss4j.git
commit 98ac9ab82c3df9e996a7ef10300b21bcf19f49f5 Author: Colm O hEigeartaigh <cohei...@apache.org> AuthorDate: Tue Jul 15 12:00:54 2025 +0100 Adding new ws-security-stax-saml module and making the output processor pluggable --- .../wss4j/api/stax/ext/WSSSecurityProperties.java | 52 ++++++++++ .../WSSSignatureEndingOutputProcessor.java | 6 +- .../processor}/WSSSignatureOutputProcessor.java | 7 +- ws-security-stax-saml/pom.xml | 106 +++++++++++++++++++++ .../processor/output/SAMLTokenOutputProcessor.java | 16 +++- ...rg.apache.xml.security.stax.ext.OutputProcessor | 1 + ws-security-stax/pom.xml | 7 ++ .../output/BinarySecurityTokenOutputProcessor.java | 1 + .../output/CustomTokenOutputProcessor.java | 1 + .../output/EncryptedKeyOutputProcessor.java | 1 + .../SecurityContextTokenOutputProcessor.java | 1 + .../SignatureConfirmationOutputProcessor.java | 1 + .../processor/output/TimestampOutputProcessor.java | 1 + .../output/UsernameTokenOutputProcessor.java | 3 + .../org/apache/wss4j/stax/setup/OutboundWSSec.java | 8 +- 15 files changed, 196 insertions(+), 16 deletions(-) diff --git a/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/ext/WSSSecurityProperties.java b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/ext/WSSSecurityProperties.java index 6da67242f..e74244025 100644 --- a/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/ext/WSSSecurityProperties.java +++ b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/ext/WSSSecurityProperties.java @@ -45,6 +45,8 @@ import org.apache.wss4j.common.crypto.PasswordEncryptor; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.validate.Validator; +import org.apache.xml.security.stax.ext.OutputProcessor; +import org.apache.xml.security.stax.ext.XMLSecurityConstants; import org.apache.xml.security.stax.ext.XMLSecurityProperties; /** @@ -54,6 +56,31 @@ import org.apache.xml.security.stax.ext.XMLSecurityProperties; */ public class WSSSecurityProperties extends XMLSecurityProperties { + private static final org.slf4j.Logger LOG = + org.slf4j.LoggerFactory.getLogger(WSSSecurityProperties.class); + + /** + * The default collection of Output Processors supported by the toolkit + * + * Instead of hard-coding, you can use Java's ServiceLoader mechanism to discover implementations + * at runtime. Each implementation should be registered in + * META-INF/services/org.apache.xml.security.stax.ext.OutputProcessor with its fully qualified class name. + * + */ + private static final Map<XMLSecurityConstants.Action, Class<?>> DEFAULT_OUTPUT_PROCESSORS; + static { + final Map<XMLSecurityConstants.Action, Class<?>> tmp = new HashMap<>(); + try { + java.util.ServiceLoader<OutputProcessor> loader = java.util.ServiceLoader.load(OutputProcessor.class); + for (OutputProcessor outputProcessor : loader) { + tmp.put(outputProcessor.getAction(), outputProcessor.getClass()); + } + } catch (final Exception ex) { + LOG.debug(ex.getMessage(), ex); + } + DEFAULT_OUTPUT_PROCESSORS = java.util.Collections.unmodifiableMap(tmp); + } + private boolean mustUnderstand = true; private String actor; private CallbackHandler callbackHandler; @@ -969,4 +996,29 @@ public class WSSSecurityProperties extends XMLSecurityProperties { public void setDocumentCreator(DocumentCreator documentCreator) { this.documentCreator = documentCreator; } + + /** + * Lookup OutputProcessor for the given action. + * + * @param action + * @return An OutputProcessor to create a security token + * @throws WSSecurityException + */ + public OutputProcessor getOutputProcessor(XMLSecurityConstants.Action action) throws WSSecurityException { + final Object actionObject = DEFAULT_OUTPUT_PROCESSORS.get(action); + + if (actionObject instanceof Class<?>) { + try { + return (OutputProcessor)((Class<?>)actionObject).getDeclaredConstructor().newInstance(); + } catch (Exception ex) { + LOG.debug(ex.getMessage(), ex); + throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, ex, + "unableToLoadClass", new Object[] {((Class<?>)actionObject).getName()}); + } + } else if (actionObject instanceof OutputProcessor) { + return (OutputProcessor)actionObject; + } + return null; + } + } diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureEndingOutputProcessor.java b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureEndingOutputProcessor.java similarity index 98% rename from ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureEndingOutputProcessor.java rename to ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureEndingOutputProcessor.java index acb36c6dc..bb664edb6 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureEndingOutputProcessor.java +++ b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureEndingOutputProcessor.java @@ -16,12 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.wss4j.stax.impl.processor.output; +package org.apache.wss4j.api.stax.processor; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; -import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; import org.apache.wss4j.api.stax.SecurityHeaderOrder; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; @@ -49,10 +48,9 @@ public class WSSSignatureEndingOutputProcessor extends AbstractSignatureEndingOu private SignedInfoProcessor signedInfoProcessor; - public WSSSignatureEndingOutputProcessor(WSSSignatureOutputProcessor signatureOutputProcessor) throws XMLSecurityException { + WSSSignatureEndingOutputProcessor(WSSSignatureOutputProcessor signatureOutputProcessor) throws XMLSecurityException { super(signatureOutputProcessor); this.addAfterProcessor(WSSSignatureOutputProcessor.class); - this.addAfterProcessor(UsernameTokenOutputProcessor.class); } @Override diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureOutputProcessor.java b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureOutputProcessor.java similarity index 98% rename from ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureOutputProcessor.java rename to ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureOutputProcessor.java index fc475d0ed..c91bbff75 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/WSSSignatureOutputProcessor.java +++ b/ws-security-api-stax/src/main/java/org/apache/wss4j/api/stax/processor/WSSSignatureOutputProcessor.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.wss4j.stax.impl.processor.output; +package org.apache.wss4j.api.stax.processor; import java.io.BufferedInputStream; import java.io.IOException; @@ -40,7 +40,6 @@ import org.apache.wss4j.common.util.AttachmentUtils; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurePart; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; -import org.apache.wss4j.stax.impl.transformer.AttachmentContentSignatureTransform; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; import org.apache.xml.security.stax.ext.OutputProcessorChain; @@ -60,6 +59,7 @@ public class WSSSignatureOutputProcessor extends AbstractSignatureOutputProcesso private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(WSSSignatureOutputProcessor.class); + private static final String ATTACHMENT = "attachment"; public WSSSignatureOutputProcessor() throws XMLSecurityException { super(); @@ -209,8 +209,7 @@ public class WSSSignatureOutputProcessor extends AbstractSignatureOutputProcesso Transformer transformer = buildTransformerChain(digestOutputStream, signaturePartDef, null); Map<String, Object> transformerProperties = new HashMap<>(2); - transformerProperties.put( - AttachmentContentSignatureTransform.ATTACHMENT, attachment); + transformerProperties.put(ATTACHMENT, attachment); transformer.setProperties(transformerProperties); transformer.transform(inputStream); transformer.doFinal(); diff --git a/ws-security-stax-saml/pom.xml b/ws-security-stax-saml/pom.xml new file mode 100644 index 000000000..8cf616953 --- /dev/null +++ b/ws-security-stax-saml/pom.xml @@ -0,0 +1,106 @@ +<!-- + 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.wss4j</groupId> + <artifactId>wss4j-parent</artifactId> + <relativePath>../parent/pom.xml</relativePath> + <version>4.0.1-SNAPSHOT</version> + </parent> + <artifactId>wss4j-ws-security-stax-saml</artifactId> + <name>Apache WSS4J WS-Security SAML StAX implementation</name> + + <properties> + <wss4j.osgi.import> + net.shibboleth*;resolution:=optional, + com.sun.security.jgss*;resolution:=optional + </wss4j.osgi.import> + <wss4j.module.name>org.apache.wss4j.stax.saml</wss4j.module.name> + </properties> + + <build> + <sourceDirectory>${basedir}/src/main/java</sourceDirectory> + <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory> + <resources> + <resource> + <directory>src/main/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </resource> + <resource> + <directory>src/main/resources</directory> + <includes> + <include>**/*</include> + </includes> + </resource> + </resources> + <testResources> + <testResource> + <directory>src/test/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </testResource> + <testResource> + <directory>src/test/resources</directory> + <includes> + <include>**/*</include> + </includes> + </testResource> + </testResources> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.wss4j</groupId> + <artifactId>wss4j-ws-security-dom-saml</artifactId> + <version>${project.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.wss4j</groupId> + <artifactId>wss4j-ws-security-api-stax</artifactId> + <version>${project.version}</version> + <scope>compile</scope> + </dependency> + </dependencies> + +</project> diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java b/ws-security-stax-saml/src/main/java/org/apache/wss4j/stax/saml/impl/processor/output/SAMLTokenOutputProcessor.java similarity index 97% rename from ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java rename to ws-security-stax-saml/src/main/java/org/apache/wss4j/stax/saml/impl/processor/output/SAMLTokenOutputProcessor.java index da9fb2f1c..42b856afa 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SAMLTokenOutputProcessor.java +++ b/ws-security-stax-saml/src/main/java/org/apache/wss4j/stax/saml/impl/processor/output/SAMLTokenOutputProcessor.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.wss4j.stax.impl.processor.output; +package org.apache.wss4j.stax.saml.impl.processor.output; import java.security.Key; import java.security.PrivateKey; @@ -44,6 +44,7 @@ import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurePart; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.securityEvent.WSSecurityEventConstants; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; @@ -71,10 +72,19 @@ public class SAMLTokenOutputProcessor extends AbstractOutputProcessor { public SAMLTokenOutputProcessor() throws XMLSecurityException { super(); - addBeforeProcessor(BinarySecurityTokenOutputProcessor.class); + //addBeforeProcessor(BinarySecurityTokenOutputProcessor.class); addBeforeProcessor(WSSSignatureOutputProcessor.class); } + @Override + public XMLSecurityConstants.Action getAction() { + if (super.getAction() != null) { + return super.getAction(); + } + // default action is SAML token signed + return WSSConstants.SAML_TOKEN_SIGNED; + } + @Override public void processEvent(XMLSecEvent xmlSecEvent, final OutputProcessorChain outputProcessorChain) throws XMLStreamException, XMLSecurityException { @@ -435,7 +445,7 @@ public class SAMLTokenOutputProcessor extends AbstractOutputProcessor { String securityTokenReferenceId, boolean senderVouches, boolean includeSTR) throws XMLSecurityException { super(); - this.addAfterProcessor(UsernameTokenOutputProcessor.class); + //this.addAfterProcessor(UsernameTokenOutputProcessor.class); this.addAfterProcessor(SAMLTokenOutputProcessor.class); this.addBeforeProcessor(WSSSignatureOutputProcessor.class); this.samlAssertionWrapper = samlAssertionWrapper; diff --git a/ws-security-stax-saml/src/main/resources/META-INF/services/org.apache.xml.security.stax.ext.OutputProcessor b/ws-security-stax-saml/src/main/resources/META-INF/services/org.apache.xml.security.stax.ext.OutputProcessor new file mode 100644 index 000000000..736ffdb24 --- /dev/null +++ b/ws-security-stax-saml/src/main/resources/META-INF/services/org.apache.xml.security.stax.ext.OutputProcessor @@ -0,0 +1 @@ +org.apache.wss4j.stax.saml.impl.processor.output.SAMLTokenOutputProcessor diff --git a/ws-security-stax/pom.xml b/ws-security-stax/pom.xml index 27b4e4fdb..da189b183 100644 --- a/ws-security-stax/pom.xml +++ b/ws-security-stax/pom.xml @@ -71,6 +71,13 @@ <version>${project.version}</version> <scope>test</scope> </dependency> + <!-- TODO remove when tests move to SAML module --> + <dependency> + <groupId>org.apache.wss4j</groupId> + <artifactId>wss4j-ws-security-stax-saml</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.wss4j</groupId> <artifactId>wss4j-ws-security-common</artifactId> diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/BinarySecurityTokenOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/BinarySecurityTokenOutputProcessor.java index efb61a601..4ba66e353 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/BinarySecurityTokenOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/BinarySecurityTokenOutputProcessor.java @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.stax.impl.securityToken.KerberosClientSecurityToken; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/CustomTokenOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/CustomTokenOutputProcessor.java index 2f03a1ef3..4ef0dfa61 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/CustomTokenOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/CustomTokenOutputProcessor.java @@ -29,6 +29,7 @@ import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; import org.apache.xml.security.stax.ext.AbstractOutputProcessor; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/EncryptedKeyOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/EncryptedKeyOutputProcessor.java index 3656de0ad..3ff03806e 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/EncryptedKeyOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/EncryptedKeyOutputProcessor.java @@ -45,6 +45,7 @@ import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SecurityContextTokenOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SecurityContextTokenOutputProcessor.java index c98b6c6d1..8631297b2 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SecurityContextTokenOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SecurityContextTokenOutputProcessor.java @@ -31,6 +31,7 @@ import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SignatureConfirmationOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SignatureConfirmationOutputProcessor.java index e13621098..aa443754c 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SignatureConfirmationOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/SignatureConfirmationOutputProcessor.java @@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamException; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; import org.apache.xml.security.stax.ext.AbstractOutputProcessor; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/TimestampOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/TimestampOutputProcessor.java index 71312d0fa..81f82f7b7 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/TimestampOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/TimestampOutputProcessor.java @@ -29,6 +29,7 @@ import org.apache.wss4j.common.util.DateUtil; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; import org.apache.xml.security.stax.ext.AbstractOutputProcessor; diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/UsernameTokenOutputProcessor.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/UsernameTokenOutputProcessor.java index b78c39b1b..6fcf98fb3 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/UsernameTokenOutputProcessor.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/impl/processor/output/UsernameTokenOutputProcessor.java @@ -25,6 +25,8 @@ import org.apache.wss4j.common.util.UsernameTokenUtil; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; import org.apache.wss4j.api.stax.processor.OutputProcessorUtils; +import org.apache.wss4j.api.stax.processor.WSSSignatureEndingOutputProcessor; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.stax.impl.securityToken.OutboundUsernameSecurityToken; import org.apache.wss4j.api.stax.utils.WSSUtils; import org.apache.xml.security.exceptions.XMLSecurityException; @@ -50,6 +52,7 @@ public class UsernameTokenOutputProcessor extends AbstractOutputProcessor { public UsernameTokenOutputProcessor() throws XMLSecurityException { super(); addBeforeProcessor(WSSSignatureOutputProcessor.class); + addBeforeProcessor(WSSSignatureEndingOutputProcessor.class); addBeforeProcessor(EncryptOutputProcessor.class); } diff --git a/ws-security-stax/src/main/java/org/apache/wss4j/stax/setup/OutboundWSSec.java b/ws-security-stax/src/main/java/org/apache/wss4j/stax/setup/OutboundWSSec.java index eb7fbb52d..09ab98ce9 100644 --- a/ws-security-stax/src/main/java/org/apache/wss4j/stax/setup/OutboundWSSec.java +++ b/ws-security-stax/src/main/java/org/apache/wss4j/stax/setup/OutboundWSSec.java @@ -37,6 +37,7 @@ import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.stax.ext.DocumentCreatorImpl; import org.apache.wss4j.api.stax.ext.WSSConstants; import org.apache.wss4j.api.stax.ext.WSSSecurityProperties; +import org.apache.wss4j.api.stax.processor.WSSSignatureOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.BinarySecurityTokenOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.CustomTokenOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.DerivedKeyTokenOutputProcessor; @@ -44,14 +45,12 @@ import org.apache.wss4j.stax.impl.processor.output.EncryptEndingOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.EncryptOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.EncryptedKeyOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.ReferenceListOutputProcessor; -import org.apache.wss4j.stax.impl.processor.output.SAMLTokenOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.SecurityContextTokenOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.SecurityHeaderOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.SecurityHeaderReorderProcessor; import org.apache.wss4j.stax.impl.processor.output.SignatureConfirmationOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.TimestampOutputProcessor; import org.apache.wss4j.stax.impl.processor.output.UsernameTokenOutputProcessor; -import org.apache.wss4j.stax.impl.processor.output.WSSSignatureOutputProcessor; import org.apache.wss4j.stax.impl.securityToken.KerberosClientSecurityToken; import org.apache.wss4j.api.stax.securityToken.WSSecurityTokenConstants; import org.apache.wss4j.api.stax.utils.WSSUtils; @@ -234,7 +233,6 @@ public class OutboundWSSec { outputProcessor.addAfterProcessor(SignatureConfirmationOutputProcessor.class); outputProcessor.addAfterProcessor(CustomTokenOutputProcessor.class); outputProcessor.addAfterProcessor(BinarySecurityTokenOutputProcessor.class); - outputProcessor.addAfterProcessor(SAMLTokenOutputProcessor.class); } outputProcessor.setXMLSecurityProperties(securityProperties); outputProcessor.setAction(action, actionOrder); @@ -706,7 +704,7 @@ public class OutboundWSSec { new BinarySecurityTokenOutputProcessor(); initializeOutputProcessor(outputProcessorChain, binarySecurityTokenOutputProcessor, action, -1); - final SAMLTokenOutputProcessor samlTokenOutputProcessor = new SAMLTokenOutputProcessor(); + final OutputProcessor samlTokenOutputProcessor = securityProperties.getOutputProcessor(WSSConstants.SAML_TOKEN_SIGNED); initializeOutputProcessor(outputProcessorChain, samlTokenOutputProcessor, action, -1); final WSSSignatureOutputProcessor signatureOutputProcessor = new WSSSignatureOutputProcessor(); @@ -721,7 +719,7 @@ public class OutboundWSSec { } } else if (WSSConstants.SAML_TOKEN_UNSIGNED.equals(action)) { - final SAMLTokenOutputProcessor samlTokenOutputProcessor = new SAMLTokenOutputProcessor(); + final OutputProcessor samlTokenOutputProcessor = securityProperties.getOutputProcessor(WSSConstants.SAML_TOKEN_SIGNED); initializeOutputProcessor(outputProcessorChain, samlTokenOutputProcessor, action, -1); if (securityProperties.getDocumentCreator() == null) {