/** * 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.policyhandlers; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.common.i18n.Message; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.message.MessageUtils; import org.apache.cxf.ws.policy.AssertionInfo; import org.apache.cxf.ws.policy.AssertionInfoMap; import org.apache.cxf.ws.policy.PolicyException; import org.apache.cxf.ws.security.SecurityConstants; import org.apache.cxf.ws.security.policy.PolicyUtils; import org.apache.cxf.ws.security.tokenstore.SecurityToken; import org.apache.cxf.ws.security.tokenstore.TokenStoreUtils; import org.apache.neethi.Assertion; import org.apache.wss4j.policy.SP13Constants; import org.apache.wss4j.policy.SPConstants; import org.apache.wss4j.policy.SPConstants.IncludeTokenType; import org.apache.wss4j.policy.model.AbstractToken; import org.apache.wss4j.policy.model.AbstractTokenWrapper; import org.apache.wss4j.policy.model.AlgorithmSuite; import org.apache.wss4j.policy.model.AlgorithmSuite.AlgorithmSuiteType; import org.apache.wss4j.policy.model.HttpsToken; import org.apache.wss4j.policy.model.IssuedToken; import org.apache.wss4j.policy.model.KerberosToken; import org.apache.wss4j.policy.model.KeyValueToken; import org.apache.wss4j.policy.model.SamlToken; import org.apache.wss4j.policy.model.SecureConversationToken; import org.apache.wss4j.policy.model.SecurityContextToken; import org.apache.wss4j.policy.model.SpnegoContextToken; import org.apache.wss4j.policy.model.Trust10; import org.apache.wss4j.policy.model.Trust13; import org.apache.wss4j.policy.model.UsernameToken; import org.apache.wss4j.policy.model.Wss10; import org.apache.wss4j.policy.model.Wss11; import org.apache.wss4j.policy.model.X509Token; /** * Some common functionality to be shared between the two binding handlers (DOM + StAX) */ public abstract class AbstractCommonBindingHandler { private static final Logger LOG = LogUtils.getL7dLogger(AbstractCommonBindingHandler.class); protected final SoapMessage message; public AbstractCommonBindingHandler( SoapMessage msg ) { this.message = msg; } protected void unassertPolicy(Assertion assertion, String reason) { if (assertion == null) { return; } if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Not asserting " + assertion.getName() + ": " + reason); } AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> ais = aim.get(assertion.getName()); if (ais != null) { for (AssertionInfo ai : ais) { if (ai.getAssertion() == assertion) { ai.setNotAsserted(reason); } } } if (!assertion.isOptional()) { throw new PolicyException(new Message(reason, LOG)); } } protected void unassertPolicy(Assertion assertion, Exception reason) { if (assertion == null) { return; } if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Not asserting " + assertion.getName() + ": " + reason); } AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> ais = aim.get(assertion.getName()); if (ais != null) { for (AssertionInfo ai : ais) { if (ai.getAssertion() == assertion) { ai.setNotAsserted(reason.getMessage()); } } } if (!assertion.isOptional()) { throw new PolicyException(new Message(reason.getMessage(), LOG), reason); } } protected void assertTokenWrapper(AbstractTokenWrapper tokenWrapper) { if (tokenWrapper == null) { return; } assertPolicy(tokenWrapper.getName()); assertToken(tokenWrapper.getToken()); } protected void assertToken(AbstractToken token) { if (token == null) { return; } assertPolicy(token.getName()); String namespace = token.getName().getNamespaceURI(); if (token.getDerivedKeys() != null) { assertPolicy(new QName(namespace, token.getDerivedKeys().name())); } if (token instanceof X509Token) { X509Token x509Token = (X509Token)token; assertX509Token(x509Token); } else if (token instanceof HttpsToken) { HttpsToken httpsToken = (HttpsToken)token; if (httpsToken.getAuthenticationType() != null) { assertPolicy(new QName(namespace, httpsToken.getAuthenticationType().name())); } } else if (token instanceof KeyValueToken) { KeyValueToken keyValueToken = (KeyValueToken)token; if (keyValueToken.isRsaKeyValue()) { assertPolicy(new QName(namespace, SPConstants.RSA_KEY_VALUE)); } } else if (token instanceof UsernameToken) { UsernameToken usernameToken = (UsernameToken)token; assertUsernameToken(usernameToken); } else if (token instanceof SecureConversationToken) { SecureConversationToken scToken = (SecureConversationToken)token; assertSecureConversationToken(scToken); } else if (token instanceof SecurityContextToken) { SecurityContextToken scToken = (SecurityContextToken)token; assertSecurityContextToken(scToken); } else if (token instanceof SpnegoContextToken) { SpnegoContextToken scToken = (SpnegoContextToken)token; assertSpnegoContextToken(scToken); } else if (token instanceof IssuedToken) { IssuedToken issuedToken = (IssuedToken)token; assertIssuedToken(issuedToken); } else if (token instanceof KerberosToken) { KerberosToken kerberosToken = (KerberosToken)token; assertKerberosToken(kerberosToken); } else if (token instanceof SamlToken) { SamlToken samlToken = (SamlToken)token; assertSamlToken(samlToken); } } private void assertX509Token(X509Token token) { String namespace = token.getName().getNamespaceURI(); if (token.isRequireEmbeddedTokenReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_EMBEDDED_TOKEN_REFERENCE)); } if (token.isRequireIssuerSerialReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_ISSUER_SERIAL_REFERENCE)); } if (token.isRequireKeyIdentifierReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_KEY_IDENTIFIER_REFERENCE)); } if (token.isRequireThumbprintReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_THUMBPRINT_REFERENCE)); } if (token.getTokenType() != null) { assertPolicy(new QName(namespace, token.getTokenType().name())); } } private void assertUsernameToken(UsernameToken token) { String namespace = token.getName().getNamespaceURI(); if (token.getPasswordType() != null) { assertPolicy(new QName(namespace, token.getPasswordType().name())); } if (token.getUsernameTokenType() != null) { assertPolicy(new QName(namespace, token.getUsernameTokenType().name())); } if (token.isCreated()) { assertPolicy(SP13Constants.CREATED); } if (token.isNonce()) { assertPolicy(SP13Constants.NONCE); } } private void assertSecurityContextToken(SecurityContextToken token) { String namespace = token.getName().getNamespaceURI(); if (token.isRequireExternalUriReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_EXTERNAL_URI_REFERENCE)); } if (token.isSc10SecurityContextToken()) { assertPolicy(new QName(namespace, SPConstants.SC10_SECURITY_CONTEXT_TOKEN)); } if (token.isSc13SecurityContextToken()) { assertPolicy(new QName(namespace, SPConstants.SC13_SECURITY_CONTEXT_TOKEN)); } } private void assertSecureConversationToken(SecureConversationToken token) { assertSecurityContextToken(token); String namespace = token.getName().getNamespaceURI(); if (token.isMustNotSendAmend()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_AMEND)); } if (token.isMustNotSendCancel()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_CANCEL)); } if (token.isMustNotSendRenew()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_RENEW)); } } private void assertSpnegoContextToken(SpnegoContextToken token) { String namespace = token.getName().getNamespaceURI(); if (token.isMustNotSendAmend()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_AMEND)); } if (token.isMustNotSendCancel()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_CANCEL)); } if (token.isMustNotSendRenew()) { assertPolicy(new QName(namespace, SPConstants.MUST_NOT_SEND_RENEW)); } } private void assertIssuedToken(IssuedToken token) { String namespace = token.getName().getNamespaceURI(); if (token.isRequireExternalReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_EXTERNAL_REFERENCE)); } if (token.isRequireInternalReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_INTERNAL_REFERENCE)); } } private void assertKerberosToken(KerberosToken token) { String namespace = token.getName().getNamespaceURI(); if (token.isRequireKeyIdentifierReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_KEY_IDENTIFIER_REFERENCE)); } if (token.getApReqTokenType() != null) { assertPolicy(new QName(namespace, token.getApReqTokenType().name())); } } private void assertSamlToken(SamlToken token) { String namespace = token.getName().getNamespaceURI(); if (token.isRequireKeyIdentifierReference()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_KEY_IDENTIFIER_REFERENCE)); } if (token.getSamlTokenType() != null) { assertPolicy(new QName(namespace, token.getSamlTokenType().name())); } } protected void assertAlgorithmSuite(AlgorithmSuite algorithmSuite) { if (algorithmSuite == null) { return; } AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> algorithmSuiteAis = aim.get(algorithmSuite.getName()); for (AssertionInfo ai : algorithmSuiteAis) { ai.setAsserted(true); } AlgorithmSuiteType algorithmSuiteType = algorithmSuite.getAlgorithmSuiteType(); String namespace = algorithmSuiteType.getNamespace(); if (namespace != null) { Collection<AssertionInfo> algAis = aim.get(new QName(namespace, algorithmSuiteType.getName())); if (algAis != null) { for (AssertionInfo algAi : algAis) { algAi.setAsserted(true); } } } } protected void assertWSSProperties(String namespace) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> wss10Ais = aim.get(new QName(namespace, SPConstants.WSS10)); if (wss10Ais != null) { for (AssertionInfo ai : wss10Ais) { ai.setAsserted(true); Wss10 wss10 = (Wss10)ai.getAssertion(); assertWSS10Properties(wss10); } } Collection<AssertionInfo> wss11Ais = aim.get(new QName(namespace, SPConstants.WSS11)); if (wss11Ais != null) { for (AssertionInfo ai : wss11Ais) { ai.setAsserted(true); Wss11 wss11 = (Wss11)ai.getAssertion(); assertWSS10Properties(wss11); if (wss11.isMustSupportRefThumbprint()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_THUMBPRINT)); } if (wss11.isMustSupportRefEncryptedKey()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_ENCRYPTED_KEY)); } if (wss11.isRequireSignatureConfirmation()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_SIGNATURE_CONFIRMATION)); } } } } private void assertWSS10Properties(Wss10 wss10) { String namespace = wss10.getName().getNamespaceURI(); if (wss10.isMustSupportRefEmbeddedToken()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_EMBEDDED_TOKEN)); } if (wss10.isMustSupportRefKeyIdentifier()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_KEY_IDENTIFIER)); } if (wss10.isMustSupportRefIssuerSerial()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_ISSUER_SERIAL)); } if (wss10.isMustSupportRefExternalURI()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_REF_EXTERNAL_URI)); } } protected void assertTrustProperties(String namespace) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> trust10Ais = aim.get(new QName(namespace, SPConstants.TRUST_10)); if (trust10Ais != null) { for (AssertionInfo ai : trust10Ais) { ai.setAsserted(true); Trust10 trust10 = (Trust10)ai.getAssertion(); assertTrust10Properties(trust10); } } Collection<AssertionInfo> trust13Ais = aim.get(new QName(namespace, SPConstants.TRUST_13)); if (trust13Ais != null) { for (AssertionInfo ai : trust13Ais) { ai.setAsserted(true); Trust13 trust13 = (Trust13)ai.getAssertion(); assertTrust10Properties(trust13); if (trust13.isRequireRequestSecurityTokenCollection()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_REQUEST_SECURITY_TOKEN_COLLECTION)); } if (trust13.isRequireAppliesTo()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_APPLIES_TO)); } if (trust13.isScopePolicy15()) { assertPolicy(new QName(namespace, SPConstants.SCOPE_POLICY_15)); } if (trust13.isMustSupportInteractiveChallenge()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_INTERACTIVE_CHALLENGE)); } } } } private void assertTrust10Properties(Trust10 trust10) { String namespace = trust10.getName().getNamespaceURI(); if (trust10.isMustSupportClientChallenge()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_CLIENT_CHALLENGE)); } if (trust10.isMustSupportIssuedTokens()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_ISSUED_TOKENS)); } if (trust10.isMustSupportServerChallenge()) { assertPolicy(new QName(namespace, SPConstants.MUST_SUPPORT_SERVER_CHALLENGE)); } if (trust10.isRequireClientEntropy()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_CLIENT_ENTROPY)); } if (trust10.isRequireServerEntropy()) { assertPolicy(new QName(namespace, SPConstants.REQUIRE_SERVER_ENTROPY)); } } protected Collection<AssertionInfo> getAllAssertionsByLocalname(String localname) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); return PolicyUtils.getAllAssertionsByLocalname(aim, localname); } protected SoapMessage getMessage() { return message; } protected boolean isRequestor() { return MessageUtils.isRequestor(message); } protected boolean isTokenRequired(IncludeTokenType includeToken) { if (includeToken == IncludeTokenType.INCLUDE_TOKEN_NEVER) { return false; } else if (includeToken == IncludeTokenType.INCLUDE_TOKEN_ALWAYS) { return true; } else { boolean initiator = MessageUtils.isRequestor(message); if (initiator && (includeToken == IncludeTokenType.INCLUDE_TOKEN_ALWAYS_TO_RECIPIENT || includeToken == IncludeTokenType.INCLUDE_TOKEN_ONCE)) { return true; } else if (!initiator && includeToken == IncludeTokenType.INCLUDE_TOKEN_ALWAYS_TO_INITIATOR) { return true; } return false; } } protected Wss10 getWss10() { AssertionInfoMap aim = message.get(AssertionInfoMap.class); AssertionInfo ai = PolicyUtils.getFirstAssertionByLocalname(aim, SPConstants.WSS10); if (ai == null) { ai = PolicyUtils.getFirstAssertionByLocalname(aim, SPConstants.WSS11); } if (ai != null) { return (Wss10)ai.getAssertion(); } return null; } protected SecurityToken getSecurityToken() { SecurityToken st = (SecurityToken)message.getContextualProperty(SecurityConstants.TOKEN); if (st == null) { String id = (String)message.getContextualProperty(SecurityConstants.TOKEN_ID); if (id != null) { st = TokenStoreUtils.getTokenStore(message).getToken(id); } } return st; } protected void assertPolicy(QName name) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); PolicyUtils.assertPolicy(aim, name); } protected void assertPolicy(Assertion assertion) { if (assertion == null) { return; } if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Asserting " + assertion.getName()); } AssertionInfoMap aim = message.get(AssertionInfoMap.class); Collection<AssertionInfo> ais = aim.get(assertion.getName()); if (ais != null) { for (AssertionInfo ai : ais) { if (ai.getAssertion() == assertion) { ai.setAsserted(true); } } } } }