blob: 9f9528fe4d354c637e984c8d5007980b10a29e6b [file] [log] [blame]
/**
* 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.wss4j.dom.handler;
import java.security.Provider;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.security.auth.callback.CallbackHandler;
import javax.xml.namespace.QName;
import org.apache.wss4j.common.ConfigurationConstants;
import org.apache.wss4j.common.EncryptionActionToken;
import org.apache.wss4j.common.SignatureActionToken;
import org.apache.wss4j.common.bsp.BSPEnforcer;
import org.apache.wss4j.common.bsp.BSPRule;
import org.apache.wss4j.common.cache.ReplayCache;
import org.apache.wss4j.common.crypto.AlgorithmSuite;
import org.apache.wss4j.common.crypto.Crypto;
import org.apache.wss4j.common.crypto.PasswordEncryptor;
import org.apache.wss4j.common.ext.WSSecurityException;
import org.apache.wss4j.dom.SOAPConstants;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.WSDocInfo;
import org.apache.wss4j.dom.engine.WSSConfig;
import org.apache.wss4j.dom.message.WSSecHeader;
import org.apache.wss4j.dom.validate.Validator;
import org.apache.xml.security.encryption.Serializer;
/**
* This class holds per request data.
*/
public class RequestData {
private Object msgContext;
private SOAPConstants soapConstants;
private String actor;
private String username;
private String pwType = WSConstants.PASSWORD_DIGEST; // Make this the default when no password type is given.
private Crypto sigVerCrypto;
private Crypto decCrypto;
private SignatureActionToken signatureToken;
private EncryptionActionToken encryptionToken;
private WSSConfig wssConfig;
private List<byte[]> signatureValues = new ArrayList<>();
private WSSecHeader secHeader;
private int derivedKeyIterations = 1000;
private boolean useDerivedKeyForMAC = true;
private CallbackHandler callback;
private CallbackHandler attachmentCallbackHandler;
private boolean enableRevocation;
private boolean requireSignedEncryptedDataElements;
private ReplayCache timestampReplayCache;
private ReplayCache nonceReplayCache;
private ReplayCache samlOneTimeUseReplayCache;
private Collection<Pattern> subjectDNPatterns = new ArrayList<>();
private Collection<Pattern> issuerDNPatterns = new ArrayList<>();
private final List<BSPRule> ignoredBSPRules = new LinkedList<>();
private boolean appendSignatureAfterTimestamp;
private int originalSignatureActionPosition;
private AlgorithmSuite algorithmSuite;
private AlgorithmSuite samlAlgorithmSuite;
private boolean disableBSPEnforcement;
private boolean allowRSA15KeyTransportAlgorithm;
private boolean addUsernameTokenNonce;
private boolean addUsernameTokenCreated;
private Certificate[] tlsCerts;
private PasswordEncryptor passwordEncryptor;
private String derivedKeyTokenReference;
private boolean use200512Namespace = true;
private final List<String> audienceRestrictions = new ArrayList<>();
private boolean requireTimestampExpires;
private boolean storeBytesInAttachment;
private Serializer encryptionSerializer;
private WSDocInfo wsDocInfo;
private Provider signatureProvider;
/**
* Whether to add an InclusiveNamespaces PrefixList as a CanonicalizationMethod
* child when generating Signatures using WSConstants.C14N_EXCL_OMIT_COMMENTS.
* The default is true.
*/
private boolean addInclusivePrefixes = true;
/**
* Set the timestamp precision mode. If set to <code>true</code> then use
* timestamps with milliseconds, otherwise omit the milliseconds. As per XML
* Date/Time specification the default is to include the milliseconds.
*/
private boolean precisionInMilliSeconds = true;
private boolean enableSignatureConfirmation;
/**
* If set to true then the timestamp handling will throw an exception if the
* timestamp contains an expires element and the semantics are expired.
*
* If set to false, no exception will be thrown, even if the semantics are
* expired.
*/
private boolean timeStampStrict = true;
/**
* If this value is not null, then username token handling will throw an
* exception if the password type of the Username Token does not match this value
*/
private String requiredPasswordType;
/**
* This variable controls whether a UsernameToken with no password element is allowed.
* The default value is "false". Set it to "true" to allow deriving keys from UsernameTokens
* or to support UsernameTokens for purposes other than authentication.
*/
private boolean allowUsernameTokenNoPassword;
/**
* The time in seconds between creation and expiry for a Timestamp. The default
* is 300 seconds (5 minutes).
*/
private int timeStampTTL = 300;
/**
* The time in seconds in the future within which the Created time of an incoming
* Timestamp is valid. The default is 60 seconds.
*/
private int timeStampFutureTTL = 60;
/**
* The time in seconds between creation and expiry for a UsernameToken Created
* element. The default is 300 seconds (5 minutes).
*/
private int utTTL = 300;
/**
* The time in seconds in the future within which the Created time of an incoming
* UsernameToken is valid. The default is 60 seconds.
*/
private int utFutureTTL = 60;
/**
* This variable controls whether types other than PasswordDigest or PasswordText
* are allowed when processing UsernameTokens.
*
* By default this is set to false so that the user doesn't have to explicitly
* reject custom token types in the callback handler.
*/
private boolean handleCustomPasswordTypes;
/**
* This variable controls whether (wsse) namespace qualified password types are
* accepted when processing UsernameTokens.
*
* By default this is set to false.
*/
private boolean allowNamespaceQualifiedPasswordTypes;
/**
* Whether the password should be treated as a binary value. This
* is needed to properly handle password equivalence for UsernameToken
* passwords. Binary passwords are Base64 encoded so they can be
* treated as strings in most places, but when the password digest
* is calculated or a key is derived from the password, the password
* will be Base64 decoded before being used. This is most useful for
* hashed passwords as password equivalents.
*
* See https://issues.apache.org/jira/browse/WSS-239
*/
private boolean encodePasswords;
/**
* Whether to validate the SubjectConfirmation requirements of a received SAML Token
* (sender-vouches or holder-of-key). The default is true.
*/
private boolean validateSamlSubjectConfirmation = true;
private boolean expandXopInclude;
public Object getMsgContext() {
return msgContext;
}
public void setMsgContext(Object msgContext) {
this.msgContext = msgContext;
}
public SOAPConstants getSoapConstants() {
return soapConstants;
}
public void setSoapConstants(SOAPConstants soapConstants) {
this.soapConstants = soapConstants;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwType() {
return pwType;
}
public void setPwType(String pwType) {
this.pwType = pwType;
}
public Crypto getSigVerCrypto() {
return sigVerCrypto;
}
public void setSigVerCrypto(Crypto sigVerCrypto) {
this.sigVerCrypto = sigVerCrypto;
}
public Crypto getDecCrypto() {
return decCrypto;
}
public void setDecCrypto(Crypto decCrypto) {
this.decCrypto = decCrypto;
}
/**
* @return Returns the wssConfig.
*/
public WSSConfig getWssConfig() {
return wssConfig;
}
/**
* @param wssConfig The wssConfig to set.
*/
public void setWssConfig(WSSConfig wssConfig) {
this.wssConfig = wssConfig;
}
/**
* @return Returns the list of stored signature values.
*/
public List<byte[]> getSignatureValues() {
return signatureValues;
}
/**
* @return Returns the secHeader.
*/
public WSSecHeader getSecHeader() {
return secHeader;
}
/**
* @param secHeader The secHeader to set.
*/
public void setSecHeader(WSSecHeader secHeader) {
this.secHeader = secHeader;
}
/**
* Set the derived key iterations. Default is 1000.
* @param iterations The number of iterations to use when deriving a key
*/
public void setDerivedKeyIterations(int iterations) {
derivedKeyIterations = iterations;
}
/**
* Get the derived key iterations.
* @return The number of iterations to use when deriving a key
*/
public int getDerivedKeyIterations() {
return derivedKeyIterations;
}
/**
* Whether to use the derived key for a MAC.
* @param useMac Whether to use the derived key for a MAC.
*/
public void setUseDerivedKeyForMAC(boolean useMac) {
useDerivedKeyForMAC = useMac;
}
/**
* Whether to use the derived key for a MAC.
* @return Whether to use the derived key for a MAC.
*/
public boolean isUseDerivedKeyForMAC() {
return useDerivedKeyForMAC;
}
/**
* Set whether to enable CRL checking or not when verifying trust in a certificate.
* @param enableRevocation whether to enable CRL checking
*/
public void setEnableRevocation(boolean enableRevocation) {
this.enableRevocation = enableRevocation;
}
/**
* Get whether to enable CRL checking or not when verifying trust in a certificate.
* @return whether to enable CRL checking
*/
public boolean isRevocationEnabled() {
return enableRevocation;
}
/**
* @return whether EncryptedData elements are required to be signed
*/
public boolean isRequireSignedEncryptedDataElements() {
return requireSignedEncryptedDataElements;
}
/**
* Configure the engine to verify that EncryptedData elements
* are in a signed subtree of the document. This can be used to
* prevent some wrapping based attacks when encrypt-before-sign
* token protection is selected.
*
* @param requireSignedEncryptedDataElements
*/
public void setRequireSignedEncryptedDataElements(boolean requireSignedEncryptedDataElements) {
this.requireSignedEncryptedDataElements = requireSignedEncryptedDataElements;
}
/**
* Sets the CallbackHandler used for this request
* @param cb
*/
public void setCallbackHandler(CallbackHandler cb) {
callback = cb;
}
/**
* Returns the CallbackHandler used for this request.
* @return the CallbackHandler used for this request.
*/
public CallbackHandler getCallbackHandler() {
return callback;
}
public CallbackHandler getAttachmentCallbackHandler() {
return attachmentCallbackHandler;
}
public void setAttachmentCallbackHandler(CallbackHandler attachmentCallbackHandler) {
this.attachmentCallbackHandler = attachmentCallbackHandler;
}
/**
* Get the Validator instance corresponding to the QName
* @param qName the QName with which to find a Validator instance
* @return the Validator instance corresponding to the QName
* @throws WSSecurityException
*/
public Validator getValidator(QName qName) throws WSSecurityException {
// Check the custom Validator Map first
if (getMsgContext() instanceof Map<?,?>) {
@SuppressWarnings("unchecked")
Map<QName, Validator> validatorMap =
(Map<QName, Validator>)((Map<?,?>)getMsgContext()).get(ConfigurationConstants.VALIDATOR_MAP);
if (validatorMap != null && validatorMap.containsKey(qName)) {
return validatorMap.get(qName);
}
}
if (wssConfig != null) {
return wssConfig.getValidator(qName);
}
return null;
}
/**
* Set the replay cache for Timestamps
*/
public void setTimestampReplayCache(ReplayCache newCache) {
timestampReplayCache = newCache;
}
/**
* Get the replay cache for Timestamps
* @throws WSSecurityException
*/
public ReplayCache getTimestampReplayCache() throws WSSecurityException {
return timestampReplayCache;
}
/**
* Set the replay cache for Nonces
*/
public void setNonceReplayCache(ReplayCache newCache) {
nonceReplayCache = newCache;
}
/**
* Get the replay cache for Nonces
* @throws WSSecurityException
*/
public ReplayCache getNonceReplayCache() throws WSSecurityException {
return nonceReplayCache;
}
/**
* Set the replay cache for SAML2 OneTimeUse Assertions
*/
public void setSamlOneTimeUseReplayCache(ReplayCache newCache) {
samlOneTimeUseReplayCache = newCache;
}
/**
* Get the replay cache for SAML2 OneTimeUse Assertions
* @throws WSSecurityException
*/
public ReplayCache getSamlOneTimeUseReplayCache() throws WSSecurityException {
return samlOneTimeUseReplayCache;
}
/**
* Set the Signature Subject Cert Constraints
*/
public void setSubjectCertConstraints(Collection<Pattern> subjectCertConstraints) {
if (subjectCertConstraints != null) {
subjectDNPatterns.addAll(subjectCertConstraints);
}
}
/**
* Get the Signature Subject Cert Constraints
*/
public Collection<Pattern> getSubjectCertConstraints() {
return subjectDNPatterns;
}
/**
* Get the Signature Issuer DN Cert Constraints
* @return
*/
public Collection<Pattern> getIssuerDNPatterns() {
return issuerDNPatterns;
}
/**
* Set the Signature Issuer DN Cert Constraints
*
*/
public void setIssuerDNPatterns(Collection<Pattern> issuerDNPatterns) {
this.issuerDNPatterns = issuerDNPatterns;
}
/**
* Set the Audience Restrictions
*/
public void setAudienceRestrictions(List<String> audienceRestrictions) {
if (audienceRestrictions != null) {
this.audienceRestrictions.addAll(audienceRestrictions);
}
}
/**
* Get the Audience Restrictions
*/
public List<String> getAudienceRestrictions() {
return audienceRestrictions;
}
public void setIgnoredBSPRules(List<BSPRule> bspRules) {
ignoredBSPRules.clear();
ignoredBSPRules.addAll(bspRules);
}
public BSPEnforcer getBSPEnforcer() {
if (disableBSPEnforcement) {
return new BSPEnforcer(true);
}
return new BSPEnforcer(ignoredBSPRules);
}
public boolean isAppendSignatureAfterTimestamp() {
return appendSignatureAfterTimestamp;
}
public void setAppendSignatureAfterTimestamp(boolean appendSignatureAfterTimestamp) {
this.appendSignatureAfterTimestamp = appendSignatureAfterTimestamp;
}
public AlgorithmSuite getAlgorithmSuite() {
return algorithmSuite;
}
public void setAlgorithmSuite(AlgorithmSuite algorithmSuite) {
this.algorithmSuite = algorithmSuite;
}
public AlgorithmSuite getSamlAlgorithmSuite() {
return samlAlgorithmSuite;
}
public void setSamlAlgorithmSuite(AlgorithmSuite samlAlgorithmSuite) {
this.samlAlgorithmSuite = samlAlgorithmSuite;
}
public int getOriginalSignatureActionPosition() {
return originalSignatureActionPosition;
}
public void setOriginalSignatureActionPosition(int originalSignatureActionPosition) {
this.originalSignatureActionPosition = originalSignatureActionPosition;
}
public boolean isDisableBSPEnforcement() {
return disableBSPEnforcement;
}
public void setDisableBSPEnforcement(boolean disableBSPEnforcement) {
this.disableBSPEnforcement = disableBSPEnforcement;
}
public boolean isAllowRSA15KeyTransportAlgorithm() {
return allowRSA15KeyTransportAlgorithm;
}
public void setAllowRSA15KeyTransportAlgorithm(boolean allowRSA15KeyTransportAlgorithm) {
this.allowRSA15KeyTransportAlgorithm = allowRSA15KeyTransportAlgorithm;
}
public Certificate[] getTlsCerts() {
return tlsCerts;
}
public void setTlsCerts(Certificate[] tlsCerts) {
this.tlsCerts = tlsCerts;
}
public PasswordEncryptor getPasswordEncryptor() {
return passwordEncryptor;
}
public void setPasswordEncryptor(PasswordEncryptor passwordEncryptor) {
this.passwordEncryptor = passwordEncryptor;
}
public SignatureActionToken getSignatureToken() {
return signatureToken;
}
public void setSignatureToken(SignatureActionToken signatureToken) {
this.signatureToken = signatureToken;
}
public EncryptionActionToken getEncryptionToken() {
return encryptionToken;
}
public void setEncryptionToken(EncryptionActionToken encryptionToken) {
this.encryptionToken = encryptionToken;
}
public String getDerivedKeyTokenReference() {
return derivedKeyTokenReference;
}
public void setDerivedKeyTokenReference(String derivedKeyTokenReference) {
this.derivedKeyTokenReference = derivedKeyTokenReference;
}
public boolean isUse200512Namespace() {
return use200512Namespace;
}
public void setUse200512Namespace(boolean use200512Namespace) {
this.use200512Namespace = use200512Namespace;
}
public boolean isRequireTimestampExpires() {
return requireTimestampExpires;
}
public void setRequireTimestampExpires(boolean requireTimestampExpires) {
this.requireTimestampExpires = requireTimestampExpires;
}
public boolean isValidateSamlSubjectConfirmation() {
return validateSamlSubjectConfirmation;
}
public void setValidateSamlSubjectConfirmation(boolean validateSamlSubjectConfirmation) {
this.validateSamlSubjectConfirmation = validateSamlSubjectConfirmation;
}
public boolean isAllowNamespaceQualifiedPasswordTypes() {
return allowNamespaceQualifiedPasswordTypes;
}
public void setAllowNamespaceQualifiedPasswordTypes(boolean allowNamespaceQualifiedPasswordTypes) {
this.allowNamespaceQualifiedPasswordTypes = allowNamespaceQualifiedPasswordTypes;
}
public int getUtFutureTTL() {
return utFutureTTL;
}
public void setUtFutureTTL(int utFutureTTL) {
this.utFutureTTL = utFutureTTL;
}
public boolean isHandleCustomPasswordTypes() {
return handleCustomPasswordTypes;
}
public void setHandleCustomPasswordTypes(boolean handleCustomPasswordTypes) {
this.handleCustomPasswordTypes = handleCustomPasswordTypes;
}
public int getUtTTL() {
return utTTL;
}
public void setUtTTL(int utTTL) {
this.utTTL = utTTL;
}
public int getTimeStampTTL() {
return timeStampTTL;
}
public void setTimeStampTTL(int timeStampTTL) {
this.timeStampTTL = timeStampTTL;
}
public int getTimeStampFutureTTL() {
return timeStampFutureTTL;
}
public void setTimeStampFutureTTL(int timeStampFutureTTL) {
this.timeStampFutureTTL = timeStampFutureTTL;
}
public boolean isAllowUsernameTokenNoPassword() {
return allowUsernameTokenNoPassword;
}
public void setAllowUsernameTokenNoPassword(boolean allowUsernameTokenNoPassword) {
this.allowUsernameTokenNoPassword = allowUsernameTokenNoPassword;
}
public boolean isTimeStampStrict() {
return timeStampStrict;
}
public void setTimeStampStrict(boolean timeStampStrict) {
this.timeStampStrict = timeStampStrict;
}
public boolean isAddInclusivePrefixes() {
return addInclusivePrefixes;
}
public void setAddInclusivePrefixes(boolean addInclusivePrefixes) {
this.addInclusivePrefixes = addInclusivePrefixes;
}
public boolean isPrecisionInMilliSeconds() {
return precisionInMilliSeconds;
}
public void setPrecisionInMilliSeconds(boolean precisionInMilliSeconds) {
this.precisionInMilliSeconds = precisionInMilliSeconds;
}
public boolean isEnableSignatureConfirmation() {
return enableSignatureConfirmation;
}
public void setEnableSignatureConfirmation(boolean enableSignatureConfirmation) {
this.enableSignatureConfirmation = enableSignatureConfirmation;
}
public String getRequiredPasswordType() {
return requiredPasswordType;
}
public void setRequiredPasswordType(String requiredPasswordType) {
this.requiredPasswordType = requiredPasswordType;
}
public boolean isEncodePasswords() {
return encodePasswords;
}
public void setEncodePasswords(boolean encodePasswords) {
this.encodePasswords = encodePasswords;
}
public boolean isStoreBytesInAttachment() {
return storeBytesInAttachment;
}
public void setStoreBytesInAttachment(boolean storeBytesInAttachment) {
this.storeBytesInAttachment = storeBytesInAttachment;
}
public boolean isExpandXopInclude() {
return expandXopInclude;
}
public void setExpandXopInclude(boolean expandXopInclude) {
this.expandXopInclude = expandXopInclude;
}
public Serializer getEncryptionSerializer() {
return encryptionSerializer;
}
public void setEncryptionSerializer(Serializer encryptionSerializer) {
this.encryptionSerializer = encryptionSerializer;
}
public boolean isAddUsernameTokenCreated() {
return addUsernameTokenCreated;
}
public void setAddUsernameTokenCreated(boolean addUsernameTokenCreated) {
this.addUsernameTokenCreated = addUsernameTokenCreated;
}
public boolean isAddUsernameTokenNonce() {
return addUsernameTokenNonce;
}
public void setAddUsernameTokenNonce(boolean addUsernameTokenNonce) {
this.addUsernameTokenNonce = addUsernameTokenNonce;
}
public WSDocInfo getWsDocInfo() {
return wsDocInfo;
}
public void setWsDocInfo(WSDocInfo wsDocInfo) {
this.wsDocInfo = wsDocInfo;
}
public Provider getSignatureProvider() {
return signatureProvider;
}
/**
* Set a security Provider instance to use for Signature
*/
public void setSignatureProvider(Provider signatureProvider) {
this.signatureProvider = signatureProvider;
}
}