| /** |
| * 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.stax.setup; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.regex.Pattern; |
| import java.util.regex.PatternSyntaxException; |
| |
| import javax.security.auth.callback.CallbackHandler; |
| import javax.xml.namespace.QName; |
| |
| import org.apache.wss4j.common.ConfigurationConstants; |
| import org.apache.wss4j.common.cache.ReplayCache; |
| import org.apache.wss4j.common.crypto.Crypto; |
| import org.apache.wss4j.common.crypto.CryptoFactory; |
| import org.apache.wss4j.common.crypto.JasyptPasswordEncryptor; |
| import org.apache.wss4j.common.crypto.PasswordEncryptor; |
| import org.apache.wss4j.common.ext.WSSecurityException; |
| import org.apache.wss4j.common.util.Loader; |
| import org.apache.wss4j.stax.ext.WSSConstants; |
| import org.apache.wss4j.stax.ext.WSSConstants.UsernameTokenPasswordType; |
| import org.apache.wss4j.stax.ext.WSSSecurityProperties; |
| import org.apache.wss4j.stax.securityToken.WSSecurityTokenConstants; |
| import org.apache.wss4j.stax.validate.Validator; |
| import org.apache.xml.security.stax.ext.SecurePart; |
| import org.apache.xml.security.stax.ext.XMLSecurityConstants.Action; |
| |
| /** |
| * This utility class converts between a Map<String, Object> and a WSSSecurityProperties class |
| */ |
| public final class ConfigurationConverter { |
| |
| private static final org.slf4j.Logger LOG = |
| org.slf4j.LoggerFactory.getLogger(ConfigurationConverter.class); |
| |
| private ConfigurationConverter() { |
| // complete |
| } |
| |
| public static WSSSecurityProperties convert(Map<String, Object> config) { |
| WSSSecurityProperties properties = new WSSSecurityProperties(); |
| |
| if (config == null) { |
| return properties; |
| } |
| |
| parseActions(config, properties); |
| parseUserProperties(config, properties); |
| parseCallback(config, properties); |
| parseCrypto(config, properties); |
| parseBooleanProperties(config, properties); |
| parseNonBooleanProperties(config, properties); |
| |
| return properties; |
| } |
| |
| public static void parseActions( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| String action = getString(ConfigurationConstants.ACTION, config); |
| |
| String actionToParse = action; |
| if (actionToParse == null) { |
| return; |
| } |
| actionToParse = actionToParse.trim(); |
| if ("".equals(actionToParse)) { |
| return; |
| } |
| String[] single = actionToParse.split("\\s"); |
| List<Action> actions = new ArrayList<>(); |
| for (int i = 0; i < single.length; i++) { |
| if (single[i].equals(ConfigurationConstants.USERNAME_TOKEN)) { |
| actions.add(WSSConstants.USERNAMETOKEN); |
| } else if (single[i].equals(ConfigurationConstants.SIGNATURE)) { |
| actions.add(WSSConstants.SIGNATURE); |
| } else if (single[i].equals(ConfigurationConstants.ENCRYPT) |
| || single[i].equals(ConfigurationConstants.ENCRYPTION)) { |
| actions.add(WSSConstants.ENCRYPTION); |
| } else if (single[i].equals(ConfigurationConstants.SAML_TOKEN_UNSIGNED)) { |
| actions.add(WSSConstants.SAML_TOKEN_UNSIGNED); |
| } else if (single[i].equals(ConfigurationConstants.SAML_TOKEN_SIGNED)) { |
| actions.add(WSSConstants.SAML_TOKEN_SIGNED); |
| } else if (single[i].equals(ConfigurationConstants.TIMESTAMP)) { |
| actions.add(WSSConstants.TIMESTAMP); |
| } else if (single[i].equals(ConfigurationConstants.USERNAME_TOKEN_SIGNATURE)) { |
| actions.add(WSSConstants.USERNAMETOKEN_SIGNED); |
| } else if (single[i].equals(ConfigurationConstants.SIGNATURE_DERIVED)) { |
| actions.add(WSSConstants.SIGNATURE_WITH_DERIVED_KEY); |
| } else if (single[i].equals(ConfigurationConstants.ENCRYPT_DERIVED) |
| || single[i].equals(ConfigurationConstants.ENCRYPTION_DERIVED)) { |
| actions.add(WSSConstants.ENCRYPTION_WITH_DERIVED_KEY); |
| } else if (single[i].equals(ConfigurationConstants.SIGNATURE_WITH_KERBEROS_TOKEN)) { |
| actions.add(WSSConstants.SIGNATURE_WITH_KERBEROS_TOKEN); |
| } else if (single[i].equals(ConfigurationConstants.ENCRYPT_WITH_KERBEROS_TOKEN) |
| || single[i].equals(ConfigurationConstants.ENCRYPTION_WITH_KERBEROS_TOKEN)) { |
| actions.add(WSSConstants.ENCRYPTION_WITH_KERBEROS_TOKEN); |
| } else if (single[i].equals(ConfigurationConstants.KERBEROS_TOKEN)) { |
| actions.add(WSSConstants.KERBEROS_TOKEN); |
| } else if (single[i].equals(ConfigurationConstants.CUSTOM_TOKEN)) { |
| actions.add(WSSConstants.CUSTOM_TOKEN); |
| } /* else if (single[i].equals(ConfigurationConstants.USERNAME_TOKEN_NO_PASSWORD)) { |
| actions.add(WSConstants.UT_NOPASSWORD); |
| } */ |
| } |
| |
| boolean sigConf = |
| decodeBooleanConfigValue(ConfigurationConstants.ENABLE_SIGNATURE_CONFIRMATION, false, config); |
| if (sigConf) { |
| actions.add(WSSConstants.SIGNATURE_CONFIRMATION); |
| } |
| |
| properties.setActions(actions); |
| } |
| |
| public static void parseUserProperties( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| String user = getString(ConfigurationConstants.USER, config); |
| properties.setTokenUser(user); |
| |
| String actor = getString(ConfigurationConstants.ACTOR, config); |
| properties.setActor(actor); |
| |
| String encUser = getString(ConfigurationConstants.ENCRYPTION_USER, config); |
| if (encUser == null) { |
| encUser = user; |
| } |
| properties.setEncryptionUser(encUser); |
| if (ConfigurationConstants.USE_REQ_SIG_CERT.equals(encUser)) { |
| properties.setUseReqSigCertForEncryption(true); |
| } |
| |
| String sigUser = getString(ConfigurationConstants.SIGNATURE_USER, config); |
| if (sigUser == null) { |
| sigUser = user; |
| } |
| properties.setSignatureUser(sigUser); |
| } |
| |
| public static void parseCrypto( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| Object passwordEncryptorObj = |
| config.get(ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE); |
| PasswordEncryptor passwordEncryptor = null; |
| if (passwordEncryptorObj instanceof PasswordEncryptor) { |
| passwordEncryptor = (PasswordEncryptor)passwordEncryptorObj; |
| } |
| if (passwordEncryptor == null) { |
| CallbackHandler callbackHandler = properties.getCallbackHandler(); |
| if (callbackHandler != null) { |
| passwordEncryptor = new JasyptPasswordEncryptor(callbackHandler); |
| } |
| } |
| |
| String sigPropRef = getString(ConfigurationConstants.SIG_PROP_REF_ID, config); |
| boolean foundSigRef = false; |
| if (sigPropRef != null) { |
| Object sigRef = config.get(sigPropRef); |
| if (sigRef instanceof Crypto) { |
| foundSigRef = true; |
| properties.setSignatureCrypto((Crypto)sigRef); |
| } else if (sigRef instanceof Properties) { |
| foundSigRef = true; |
| properties.setSignatureCryptoProperties((Properties)sigRef, passwordEncryptor); |
| } |
| if (foundSigRef && properties.getSignatureUser() == null) { |
| properties.setSignatureUser(getDefaultX509Identifier(properties, true)); |
| } |
| } |
| |
| if (!foundSigRef) { |
| String sigPropFile = getString(ConfigurationConstants.SIG_PROP_FILE, config); |
| if (sigPropFile != null) { |
| try { |
| Properties sigProperties = |
| CryptoFactory.getProperties(sigPropFile, getClassLoader()); |
| properties.setSignatureCryptoProperties(sigProperties, passwordEncryptor); |
| if (properties.getSignatureUser() == null) { |
| properties.setSignatureUser(getDefaultX509Identifier(properties, true)); |
| } |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| |
| String sigVerPropRef = getString(ConfigurationConstants.SIG_VER_PROP_REF_ID, config); |
| boolean foundSigVerRef = false; |
| if (sigVerPropRef != null) { |
| Object sigVerRef = config.get(sigVerPropRef); |
| if (sigVerRef instanceof Crypto) { |
| foundSigVerRef = true; |
| properties.setSignatureVerificationCrypto((Crypto)sigVerRef); |
| } else if (sigVerRef instanceof Properties) { |
| foundSigVerRef = true; |
| properties.setSignatureVerificationCryptoProperties((Properties)sigVerRef, passwordEncryptor); |
| } |
| } |
| |
| if (!foundSigVerRef) { |
| String sigPropFile = getString(ConfigurationConstants.SIG_VER_PROP_FILE, config); |
| if (sigPropFile != null) { |
| try { |
| Properties sigProperties = |
| CryptoFactory.getProperties(sigPropFile, getClassLoader()); |
| properties.setSignatureVerificationCryptoProperties(sigProperties, passwordEncryptor); |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| |
| String encPropRef = getString(ConfigurationConstants.ENC_PROP_REF_ID, config); |
| boolean foundEncRef = false; |
| if (encPropRef != null) { |
| Object encRef = config.get(encPropRef); |
| if (encRef instanceof Crypto) { |
| foundEncRef = true; |
| properties.setEncryptionCrypto((Crypto)encRef); |
| } else if (encRef instanceof Properties) { |
| foundEncRef = true; |
| properties.setEncryptionCryptoProperties((Properties)encRef, passwordEncryptor); |
| } |
| } |
| |
| if (!foundEncRef) { |
| String encPropFile = getString(ConfigurationConstants.ENC_PROP_FILE, config); |
| if (encPropFile != null) { |
| try { |
| Properties encProperties = |
| CryptoFactory.getProperties(encPropFile, getClassLoader()); |
| properties.setEncryptionCryptoProperties(encProperties, passwordEncryptor); |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| |
| String decPropRef = getString(ConfigurationConstants.DEC_PROP_REF_ID, config); |
| boolean foundDecRef = false; |
| if (decPropRef != null) { |
| Object decRef = config.get(decPropRef); |
| if (decRef instanceof Crypto) { |
| foundDecRef = true; |
| properties.setDecryptionCrypto((Crypto)decRef); |
| } else if (decRef instanceof Properties) { |
| foundDecRef = true; |
| properties.setDecryptionCryptoProperties((Properties)decRef, passwordEncryptor); |
| } |
| } |
| |
| if (!foundDecRef) { |
| String encPropFile = getString(ConfigurationConstants.DEC_PROP_FILE, config); |
| if (encPropFile != null) { |
| try { |
| Properties encProperties = |
| CryptoFactory.getProperties(encPropFile, getClassLoader()); |
| properties.setDecryptionCryptoProperties(encProperties, passwordEncryptor); |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| } |
| |
| public static String getDefaultX509Identifier( |
| WSSSecurityProperties properties, boolean signature |
| ) { |
| try { |
| Crypto crypto = null; |
| if (signature) { |
| crypto = properties.getSignatureCrypto(); |
| } else { |
| crypto = properties.getEncryptionCrypto(); |
| } |
| if (crypto != null) { |
| return crypto.getDefaultX509Identifier(); |
| } |
| } catch (WSSecurityException e) { |
| LOG.debug(e.getMessage(), e); |
| } |
| return null; |
| } |
| |
| public static void parseCallback( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| Object pwPropRef = config.get(ConfigurationConstants.PW_CALLBACK_REF); |
| if (pwPropRef instanceof CallbackHandler) { |
| properties.setCallbackHandler((CallbackHandler)pwPropRef); |
| } else { |
| String pwCallback = getString(ConfigurationConstants.PW_CALLBACK_CLASS, config); |
| if (pwCallback != null) { |
| try { |
| CallbackHandler pwCallbackHandler = loadCallbackHandler(pwCallback); |
| properties.setCallbackHandler(pwCallbackHandler); |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| |
| Object samlPropRef = config.get(ConfigurationConstants.SAML_CALLBACK_REF); |
| if (samlPropRef instanceof CallbackHandler) { |
| properties.setSamlCallbackHandler((CallbackHandler)samlPropRef); |
| } else { |
| String samlCallback = getString(ConfigurationConstants.SAML_CALLBACK_CLASS, config); |
| if (samlCallback != null) { |
| try { |
| CallbackHandler samlCallbackHandler = loadCallbackHandler(samlCallback); |
| properties.setSamlCallbackHandler(samlCallbackHandler); |
| } catch (WSSecurityException e) { |
| LOG.error(e.getMessage(), e); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Load a CallbackHandler instance. |
| * @param callbackHandlerClass The class name of the CallbackHandler instance |
| * @return a CallbackHandler instance |
| * @throws WSSecurityException |
| */ |
| public static CallbackHandler loadCallbackHandler( |
| String callbackHandlerClass |
| ) throws WSSecurityException { |
| |
| Class<? extends CallbackHandler> cbClass = null; |
| CallbackHandler cbHandler = null; |
| try { |
| cbClass = |
| Loader.loadClass(getClassLoader(), |
| callbackHandlerClass, |
| CallbackHandler.class); |
| } catch (ClassNotFoundException e) { |
| throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, e, |
| "empty", |
| new Object[] {"WSHandler: cannot load callback handler class: " |
| + callbackHandlerClass} |
| ); |
| } |
| try { |
| cbHandler = cbClass.newInstance(); |
| } catch (Exception e) { |
| throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, e, |
| "empty", |
| new Object[] {"WSHandler: cannot create instance of callback handler: " |
| + callbackHandlerClass} |
| ); |
| } |
| return cbHandler; |
| } |
| |
| private static ClassLoader getClassLoader() { |
| try { |
| return Loader.getTCL(); |
| } catch (Exception ex) { |
| return null; |
| } |
| } |
| |
| public static void parseBooleanProperties( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| //outbound sigConf is configured as an Action, see parseActions() |
| boolean sigConf = |
| decodeBooleanConfigValue(ConfigurationConstants.ENABLE_SIGNATURE_CONFIRMATION, false, config); |
| properties.setEnableSignatureConfirmationVerification(sigConf); |
| |
| boolean mustUnderstand = |
| decodeBooleanConfigValue(ConfigurationConstants.MUST_UNDERSTAND, true, config); |
| properties.setMustUnderstand(mustUnderstand); |
| |
| boolean bspCompliant = |
| decodeBooleanConfigValue(ConfigurationConstants.IS_BSP_COMPLIANT, true, config); |
| properties.setDisableBSPEnforcement(!bspCompliant); |
| |
| boolean inclPrefixes = |
| decodeBooleanConfigValue(ConfigurationConstants.ADD_INCLUSIVE_PREFIXES, true, config); |
| properties.setAddExcC14NInclusivePrefixes(inclPrefixes); |
| |
| boolean nonce = |
| decodeBooleanConfigValue(ConfigurationConstants.ADD_USERNAMETOKEN_NONCE, false, config); |
| properties.setAddUsernameTokenNonce(nonce); |
| |
| boolean created = |
| decodeBooleanConfigValue(ConfigurationConstants.ADD_USERNAMETOKEN_CREATED, false, config); |
| properties.setAddUsernameTokenCreated(created); |
| |
| boolean customPasswordTypes = |
| decodeBooleanConfigValue(ConfigurationConstants.HANDLE_CUSTOM_PASSWORD_TYPES, false, config); |
| properties.setHandleCustomPasswordTypes(customPasswordTypes); |
| |
| boolean allowNoPassword = |
| decodeBooleanConfigValue(ConfigurationConstants.ALLOW_USERNAMETOKEN_NOPASSWORD, false, config); |
| properties.setAllowUsernameTokenNoPassword(allowNoPassword); |
| |
| boolean enableRevocation = |
| decodeBooleanConfigValue(ConfigurationConstants.ENABLE_REVOCATION, false, config); |
| properties.setEnableRevocation(enableRevocation); |
| |
| boolean singleCert = |
| decodeBooleanConfigValue(ConfigurationConstants.USE_SINGLE_CERTIFICATE, true, config); |
| properties.setUseSingleCert(singleCert); |
| |
| boolean derivedKeyMAC = |
| decodeBooleanConfigValue(ConfigurationConstants.USE_DERIVED_KEY_FOR_MAC, true, config); |
| properties.setUseDerivedKeyForMAC(derivedKeyMAC); |
| |
| boolean timestampStrict = |
| decodeBooleanConfigValue(ConfigurationConstants.TIMESTAMP_STRICT, true, config); |
| properties.setStrictTimestampCheck(timestampStrict); |
| |
| boolean allowRSA15 = |
| decodeBooleanConfigValue(ConfigurationConstants.ALLOW_RSA15_KEY_TRANSPORT_ALGORITHM, false, config); |
| properties.setAllowRSA15KeyTransportAlgorithm(allowRSA15); |
| |
| boolean validateSamlSubjectConf = |
| decodeBooleanConfigValue(ConfigurationConstants.VALIDATE_SAML_SUBJECT_CONFIRMATION, true, config); |
| properties.setValidateSamlSubjectConfirmation(validateSamlSubjectConf); |
| |
| boolean includeSignatureToken = |
| decodeBooleanConfigValue(ConfigurationConstants.INCLUDE_SIGNATURE_TOKEN, false, config); |
| properties.setIncludeSignatureToken(includeSignatureToken); |
| |
| boolean includeEncryptionToken = |
| decodeBooleanConfigValue(ConfigurationConstants.INCLUDE_ENCRYPTION_TOKEN, false, config); |
| properties.setIncludeEncryptionToken(includeEncryptionToken); |
| |
| boolean encryptSymmetricEncryptionKey = |
| decodeBooleanConfigValue(ConfigurationConstants.ENC_SYM_ENC_KEY, true, config); |
| properties.setEncryptSymmetricEncryptionKey(encryptSymmetricEncryptionKey); |
| |
| boolean use200512Namespace = |
| decodeBooleanConfigValue(ConfigurationConstants.USE_2005_12_NAMESPACE, true, config); |
| properties.setUse200512Namespace(use200512Namespace); |
| |
| boolean requireTimestampExpires = |
| decodeBooleanConfigValue(ConfigurationConstants.REQUIRE_TIMESTAMP_EXPIRES, false, config); |
| properties.setRequireTimestampExpires(requireTimestampExpires); |
| } |
| |
| public static void parseNonBooleanProperties( |
| Map<String, Object> config, |
| WSSSecurityProperties properties |
| ) { |
| String pwType = getString(ConfigurationConstants.PASSWORD_TYPE, config); |
| if ("PasswordDigest".equals(pwType)) { |
| properties.setUsernameTokenPasswordType(UsernameTokenPasswordType.PASSWORD_DIGEST); |
| } else if ("PasswordText".equals(pwType)) { |
| properties.setUsernameTokenPasswordType(UsernameTokenPasswordType.PASSWORD_TEXT); |
| } else if ("PasswordNone".equals(pwType)) { |
| properties.setUsernameTokenPasswordType(UsernameTokenPasswordType.PASSWORD_NONE); |
| } |
| |
| String signatureKeyIdentifier = getString(ConfigurationConstants.SIG_KEY_ID, config); |
| WSSecurityTokenConstants.KeyIdentifier convSigKeyIdentifier = |
| convertKeyIdentifier(signatureKeyIdentifier); |
| if (convSigKeyIdentifier != null) { |
| properties.setSignatureKeyIdentifier(convSigKeyIdentifier); |
| } |
| |
| String sigAlgo = getString(ConfigurationConstants.SIG_ALGO, config); |
| properties.setSignatureAlgorithm(sigAlgo); |
| |
| String sigDigestAlgo = getString(ConfigurationConstants.SIG_DIGEST_ALGO, config); |
| properties.setSignatureDigestAlgorithm(sigDigestAlgo); |
| |
| String sigC14nAlgo = getString(ConfigurationConstants.SIG_C14N_ALGO, config); |
| properties.setSignatureCanonicalizationAlgorithm(sigC14nAlgo); |
| |
| Object sigParts = config.get(ConfigurationConstants.SIGNATURE_PARTS); |
| configureParts(sigParts, properties, sigDigestAlgo, true, true); |
| |
| sigParts = config.get(ConfigurationConstants.OPTIONAL_SIGNATURE_PARTS); |
| configureParts(sigParts, properties, sigDigestAlgo, false, true); |
| |
| String iterations = getString(ConfigurationConstants.DERIVED_KEY_ITERATIONS, config); |
| if (iterations != null) { |
| int iIterations = Integer.parseInt(iterations); |
| properties.setDerivedKeyIterations(iIterations); |
| } |
| |
| String encKeyIdentifier = getString(ConfigurationConstants.ENC_KEY_ID, config); |
| WSSecurityTokenConstants.KeyIdentifier convEncKeyIdentifier = |
| convertKeyIdentifier(encKeyIdentifier); |
| if (convEncKeyIdentifier != null) { |
| properties.setEncryptionKeyIdentifier(convEncKeyIdentifier); |
| } |
| |
| Object encParts = config.get(ConfigurationConstants.ENCRYPTION_PARTS); |
| configureParts(encParts, properties, null, true, false); |
| |
| encParts = config.get(ConfigurationConstants.OPTIONAL_ENCRYPTION_PARTS); |
| configureParts(encParts, properties, null, false, false); |
| |
| String encSymcAlgo = getString(ConfigurationConstants.ENC_SYM_ALGO, config); |
| properties.setEncryptionSymAlgorithm(encSymcAlgo); |
| |
| String encKeyTransport = getString(ConfigurationConstants.ENC_KEY_TRANSPORT, config); |
| properties.setEncryptionKeyTransportAlgorithm(encKeyTransport); |
| |
| String encDigestAlgo = getString(ConfigurationConstants.ENC_DIGEST_ALGO, config); |
| properties.setEncryptionKeyTransportDigestAlgorithm(encDigestAlgo); |
| |
| String encMGFAlgo = getString(ConfigurationConstants.ENC_MGF_ALGO, config); |
| properties.setEncryptionKeyTransportMGFAlgorithm(encMGFAlgo); |
| |
| // Subject Cert Constraints |
| String certConstraints = |
| getString(ConfigurationConstants.SIG_SUBJECT_CERT_CONSTRAINTS, config); |
| if (certConstraints != null) { |
| String certConstraintsSeparator = |
| getString(ConfigurationConstants.SIG_CERT_CONSTRAINTS_SEPARATOR, config); |
| if (certConstraintsSeparator == null || certConstraintsSeparator.isEmpty()) { |
| certConstraintsSeparator = ","; |
| } |
| Collection<Pattern> subjectCertConstraints = |
| getCertConstraints(certConstraints, certConstraintsSeparator); |
| properties.setSubjectCertConstraints(subjectCertConstraints); |
| } |
| // Subject Cert Constraints |
| String issuerCertConstraintsString = |
| getString(ConfigurationConstants.SIG_ISSUER_CERT_CONSTRAINTS, config); |
| if (issuerCertConstraintsString != null) { |
| String certConstraintsSeparator = |
| getString(ConfigurationConstants.SIG_CERT_CONSTRAINTS_SEPARATOR, config); |
| if (certConstraintsSeparator == null || certConstraintsSeparator.isEmpty()) { |
| certConstraintsSeparator = ","; |
| } |
| Collection<Pattern> issuerCertConstraints = |
| getCertConstraints(certConstraints, certConstraintsSeparator); |
| properties.setIssuerDNConstraints(issuerCertConstraints); |
| } |
| |
| properties.setUtTTL(decodeTimeToLive(config, false)); |
| properties.setUtFutureTTL(decodeFutureTimeToLive(config, false)); |
| properties.setTimestampTTL(decodeTimeToLive(config, true)); |
| properties.setTimeStampFutureTTL(decodeFutureTimeToLive(config, true)); |
| |
| @SuppressWarnings("unchecked") |
| final Map<QName, Validator> validatorMap = |
| (Map<QName, Validator>)config.get(ConfigurationConstants.VALIDATOR_MAP); |
| if (validatorMap != null) { |
| for (Map.Entry<QName, Validator> entry : validatorMap.entrySet()) { |
| properties.addValidator(entry.getKey(), entry.getValue()); |
| } |
| } |
| |
| ReplayCache nonceCache = |
| (ReplayCache)config.get(ConfigurationConstants.NONCE_CACHE_INSTANCE); |
| if (nonceCache != null) { |
| properties.setNonceReplayCache(nonceCache); |
| } |
| |
| ReplayCache timestampCache = |
| (ReplayCache)config.get(ConfigurationConstants.TIMESTAMP_CACHE_INSTANCE); |
| if (timestampCache != null) { |
| properties.setTimestampReplayCache(timestampCache); |
| } |
| |
| ReplayCache samlOneTimeUseCache = |
| (ReplayCache)config.get(ConfigurationConstants.SAML_ONE_TIME_USE_CACHE_INSTANCE); |
| if (samlOneTimeUseCache != null) { |
| properties.setSamlOneTimeUseReplayCache(samlOneTimeUseCache); |
| } |
| |
| String derivedSignatureKeyLength = getString(ConfigurationConstants.DERIVED_SIGNATURE_KEY_LENGTH, config); |
| if (derivedSignatureKeyLength != null) { |
| int sigLength = Integer.parseInt(derivedSignatureKeyLength); |
| properties.setDerivedSignatureKeyLength(sigLength); |
| } |
| |
| String derivedEncryptionKeyLength = getString(ConfigurationConstants.DERIVED_ENCRYPTION_KEY_LENGTH, config); |
| if (derivedEncryptionKeyLength != null) { |
| int encLength = Integer.parseInt(derivedEncryptionKeyLength); |
| properties.setDerivedEncryptionKeyLength(encLength); |
| } |
| |
| String derivedTokenReference = getString(ConfigurationConstants.DERIVED_TOKEN_REFERENCE, config); |
| WSSConstants.DerivedKeyTokenReference convertedDerivedTokenReference = |
| convertDerivedReference(derivedTokenReference); |
| if (convertedDerivedTokenReference != null) { |
| properties.setDerivedKeyTokenReference(convertedDerivedTokenReference); |
| } |
| |
| String derivedKeyIdentifier = getString(ConfigurationConstants.DERIVED_TOKEN_KEY_ID, config); |
| WSSecurityTokenConstants.KeyIdentifier convertedDerivedKeyIdentifier = |
| convertKeyIdentifier(derivedKeyIdentifier); |
| if (convertedDerivedKeyIdentifier != null) { |
| properties.setDerivedKeyKeyIdentifier(convertedDerivedKeyIdentifier); |
| } |
| } |
| |
| private static Collection<Pattern> getCertConstraints(String certConstraints, String certConstraintsSeparator) { |
| String[] certConstraintsList = certConstraints.split(certConstraintsSeparator); |
| if (certConstraintsList != null && certConstraintsList.length > 0) { |
| Collection<Pattern> certConstraintsCollection = |
| new ArrayList<>(certConstraintsList.length); |
| for (String certConstraint : certConstraintsList) { |
| try { |
| certConstraintsCollection.add(Pattern.compile(certConstraint.trim())); |
| } catch (PatternSyntaxException ex) { |
| LOG.error(ex.getMessage(), ex); |
| } |
| } |
| |
| return certConstraintsCollection; |
| } |
| return Collections.emptyList(); |
| } |
| |
| private static void configureParts(Object secureParts, WSSSecurityProperties properties, |
| String digestAlgo, boolean required, boolean signature) { |
| if (secureParts != null) { |
| if (secureParts instanceof String) { |
| List<SecurePart> parts = new ArrayList<>(); |
| splitEncParts((String)secureParts, parts, WSSConstants.NS_SOAP11); |
| for (SecurePart part : parts) { |
| part.setRequired(required); |
| if (signature) { |
| part.setDigestMethod(digestAlgo); |
| properties.addSignaturePart(part); |
| } else { |
| properties.addEncryptionPart(part); |
| } |
| } |
| } else if (secureParts instanceof List<?>) { |
| List<?> sigPartsList = (List<?>)secureParts; |
| for (Object obj : sigPartsList) { |
| if (obj instanceof SecurePart) { |
| SecurePart securePart = (SecurePart)obj; |
| securePart.setRequired(required); |
| if (signature) { |
| securePart.setDigestMethod(digestAlgo); |
| properties.addSignaturePart(securePart); |
| } else { |
| properties.addEncryptionPart(securePart); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| public static WSSConstants.DerivedKeyTokenReference convertDerivedReference(String derivedTokenReference) { |
| if ("EncryptedKey".equals(derivedTokenReference)) { |
| return WSSConstants.DerivedKeyTokenReference.EncryptedKey; |
| } else if ("DirectReference".equals(derivedTokenReference)) { |
| return WSSConstants.DerivedKeyTokenReference.DirectReference; |
| } else if ("SecurityContextToken".equals(derivedTokenReference)) { |
| return WSSConstants.DerivedKeyTokenReference.SecurityContextToken; |
| } |
| return null; |
| } |
| |
| public static WSSecurityTokenConstants.KeyIdentifier convertKeyIdentifier(String keyIdentifier) { |
| if ("IssuerSerial".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KeyIdentifier_IssuerSerial; |
| } else if ("DirectReference".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KEYIDENTIFIER_SECURITY_TOKEN_DIRECT_REFERENCE; |
| } else if ("X509KeyIdentifier".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KeyIdentifier_X509KeyIdentifier; |
| } else if ("Thumbprint".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KEYIDENTIFIER_THUMBPRINT_IDENTIFIER; |
| } else if ("SKIKeyIdentifier".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KeyIdentifier_SkiKeyIdentifier; |
| } else if ("EncryptedKeySHA1".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KEYIDENTIFIER_ENCRYPTED_KEY_SHA1_IDENTIFIER; |
| } else if ("EncryptedKey".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KeyIdentifier_EncryptedKey; |
| } else if ("KeyValue".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KeyIdentifier_KeyValue; |
| } else if ("KerberosSHA1".equals(keyIdentifier)) { |
| return WSSecurityTokenConstants.KEYIDENTIFIER_KERBEROS_SHA1_IDENTIFIER; |
| } |
| return null; |
| } |
| |
| private static int decodeTimeToLive(Map<String, Object> config, boolean timestamp) { |
| String tag = ConfigurationConstants.TTL_TIMESTAMP; |
| if (!timestamp) { |
| tag = ConfigurationConstants.TTL_USERNAMETOKEN; |
| } |
| String ttl = getString(tag, config); |
| int defaultTimeToLive = 300; |
| if (ttl != null) { |
| try { |
| int ttlI = Integer.parseInt(ttl); |
| if (ttlI < 0) { |
| return defaultTimeToLive; |
| } |
| return ttlI; |
| } catch (NumberFormatException e) { |
| return defaultTimeToLive; |
| } |
| } |
| return defaultTimeToLive; |
| } |
| |
| private static int decodeFutureTimeToLive(Map<String, Object> config, boolean timestamp) { |
| String tag = ConfigurationConstants.TTL_FUTURE_TIMESTAMP; |
| if (!timestamp) { |
| tag = ConfigurationConstants.TTL_FUTURE_USERNAMETOKEN; |
| } |
| String ttl = getString(tag, config); |
| int defaultFutureTimeToLive = 60; |
| if (ttl != null) { |
| try { |
| int ttlI = Integer.parseInt(ttl); |
| if (ttlI < 0) { |
| return defaultFutureTimeToLive; |
| } |
| return ttlI; |
| } catch (NumberFormatException e) { |
| return defaultFutureTimeToLive; |
| } |
| } |
| return defaultFutureTimeToLive; |
| } |
| |
| private static String getString(String tag, Map<String, Object> config) { |
| Object value = config.get(tag); |
| if (value instanceof String) { |
| return (String)value; |
| } |
| return null; |
| } |
| |
| private static boolean decodeBooleanConfigValue( |
| String tag, boolean defaultToTrue, Map<String, Object> config |
| ) { |
| String value = getString(tag, config); |
| |
| if ("0".equals(value) || "false".equals(value)) { |
| return false; |
| } |
| if ("1".equals(value) || "true".equals(value)) { |
| return true; |
| } |
| |
| return defaultToTrue; |
| } |
| |
| private static void splitEncParts(String tmpS, List<SecurePart> parts, String soapNS) { |
| SecurePart encPart = null; |
| String[] rawParts = tmpS.split(";"); |
| |
| for (int i = 0; i < rawParts.length; i++) { |
| String[] partDef = rawParts[i].split("}"); |
| |
| if (partDef.length == 1) { |
| QName qname = new QName(soapNS, partDef[0].trim()); |
| encPart = new SecurePart(qname, SecurePart.Modifier.Content); |
| } else if (partDef.length == 2) { |
| String mode = partDef[0].trim().substring(1); |
| String element = partDef[1].trim(); |
| |
| if ("Content".equals(mode)) { |
| encPart = new SecurePart(element, SecurePart.Modifier.Content); |
| } else { |
| encPart = new SecurePart(element, SecurePart.Modifier.Element); |
| } |
| } else if (partDef.length == 3) { |
| String mode = partDef[0].trim(); |
| if (mode.length() <= 1) { |
| mode = "Content"; |
| } else { |
| mode = mode.substring(1); |
| } |
| String nmSpace = partDef[1].trim(); |
| if (nmSpace.length() <= 1) { |
| nmSpace = soapNS; |
| } else { |
| nmSpace = nmSpace.substring(1); |
| if ("Null".equals(nmSpace)) { |
| nmSpace = null; |
| } |
| } |
| String element = partDef[2].trim(); |
| |
| QName qname = new QName(nmSpace, element); |
| if ("Content".equals(mode)) { |
| encPart = new SecurePart(qname, SecurePart.Modifier.Content); |
| } else { |
| encPart = new SecurePart(qname, SecurePart.Modifier.Element); |
| } |
| } |
| |
| parts.add(encPart); |
| } |
| } |
| |
| } |