<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>RampartPolicyBuilder.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="right"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.html" class="el_package">org.apache.rampart.policy</a> &gt; <span class="el_source">RampartPolicyBuilder.java</span></div><h1>RampartPolicyBuilder.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * 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 &quot;AS IS&quot; 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.rampart.policy;

import org.apache.axis2.policy.model.MTOMAssertion;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.neethi.Assertion;
import org.apache.rampart.policy.model.RampartConfig;
import org.apache.ws.secpolicy.WSSPolicyException;
import org.apache.ws.secpolicy.model.AsymmetricBinding;
import org.apache.ws.secpolicy.model.Binding;
import org.apache.ws.secpolicy.model.ContentEncryptedElements;
import org.apache.ws.secpolicy.model.EncryptionToken;
import org.apache.ws.secpolicy.model.Header;
import org.apache.ws.secpolicy.model.InitiatorToken;
import org.apache.ws.secpolicy.model.ProtectionToken;
import org.apache.ws.secpolicy.model.RecipientToken;
import org.apache.ws.secpolicy.model.RequiredElements;
import org.apache.ws.secpolicy.model.SignatureToken;
import org.apache.ws.secpolicy.model.SignedEncryptedElements;
import org.apache.ws.secpolicy.model.SignedEncryptedParts;
import org.apache.ws.secpolicy.model.SupportingToken;
import org.apache.ws.secpolicy.model.SymmetricAsymmetricBindingBase;
import org.apache.ws.secpolicy.model.SymmetricBinding;
import org.apache.ws.secpolicy.model.TransportBinding;
import org.apache.ws.secpolicy.model.TransportToken;
import org.apache.ws.secpolicy.model.Trust10;
import org.apache.ws.secpolicy.model.Wss10;
import org.apache.ws.secpolicy.model.Wss11;

import java.util.Iterator;
import java.util.List;

<span class="nc" id="L48">public class RampartPolicyBuilder {</span>
    
<span class="fc" id="L50">    private static Log log = LogFactory.getLog(RampartPolicyBuilder.class);</span>

    /**
     * Compile the parsed security data into one Policy data block.
     * 
     * This methods loops over all top level Policy Engine data elements,
     * extracts the parsed parameters and sets them into a single data block.
     * During this processing the method prepares the parameters in a format
     * that is ready for processing by the WSS4J functions.
     * 
     * &lt;p/&gt;
     * 
     * The WSS4J policy enabled handler takes this data block to control the
     * setup of the security header.
     * 
     * @param topLevelAssertions
     *            The iterator of the top level policy assertions
     * @return The compile Policy data block.
     * @throws WSSPolicyException
     */
    public static RampartPolicyData build(List&lt;Assertion&gt; topLevelAssertions)
            throws WSSPolicyException {
        
<span class="fc" id="L73">        RampartPolicyData rpd = new RampartPolicyData();</span>
        
<span class="fc bfc" id="L75" title="All 2 branches covered.">        for (Iterator&lt;Assertion&gt; iter = topLevelAssertions.iterator(); iter.hasNext();) {</span>
<span class="fc" id="L76">            Assertion assertion = (Assertion) iter.next();</span>
<span class="fc bfc" id="L77" title="All 2 branches covered.">            if (assertion instanceof Binding) {</span>

<span class="fc" id="L79">                setWebServiceSecurityPolicyNS(assertion, rpd);</span>

<span class="fc bfc" id="L81" title="All 2 branches covered.">                if (assertion instanceof SymmetricBinding) {</span>
<span class="fc" id="L82">                    processSymmetricPolicyBinding((SymmetricBinding) assertion, rpd);</span>
<span class="fc bfc" id="L83" title="All 2 branches covered.">                } else if(assertion instanceof AsymmetricBinding) {</span>
<span class="fc" id="L84">                    processAsymmetricPolicyBinding((AsymmetricBinding) assertion, rpd);</span>
                } else {
<span class="fc" id="L86">                    processTransportBinding((TransportBinding) assertion, rpd);</span>
                }
                
                /*
                 * Don't change the order of Wss11 / Wss10 instance checks
                 * because Wss11 extends Wss10 - thus first check Wss11.
                 */
<span class="fc bfc" id="L93" title="All 2 branches covered.">            } else if (assertion instanceof Wss11) {</span>
<span class="fc" id="L94">                processWSS11((Wss11) assertion, rpd);</span>
<span class="fc bfc" id="L95" title="All 2 branches covered.">            } else if (assertion instanceof Wss10) {</span>
<span class="fc" id="L96">                processWSS10((Wss10) assertion, rpd);</span>
<span class="fc bfc" id="L97" title="All 2 branches covered.">            } else if (assertion instanceof SignedEncryptedElements) {</span>
<span class="fc" id="L98">                processSignedEncryptedElements((SignedEncryptedElements) assertion,</span>
                        rpd);
<span class="fc bfc" id="L100" title="All 2 branches covered.">            } else if (assertion instanceof SignedEncryptedParts) {</span>
<span class="fc" id="L101">                processSignedEncryptedParts((SignedEncryptedParts) assertion, rpd);</span>
<span class="fc bfc" id="L102" title="All 2 branches covered.">            } else if ( assertion instanceof RequiredElements) {   </span>
<span class="fc" id="L103">                processRequiredElements((RequiredElements)assertion, rpd);</span>
<span class="fc bfc" id="L104" title="All 2 branches covered.">            } else if (assertion instanceof ContentEncryptedElements) { </span>
<span class="fc" id="L105">                processContentEncryptedElements((ContentEncryptedElements) assertion, rpd);</span>
<span class="fc bfc" id="L106" title="All 2 branches covered.">            }else if (assertion instanceof SupportingToken) {</span>

                //Set policy version. Cos a supporting token can appear along without a binding
<span class="fc" id="L109">                setWebServiceSecurityPolicyNS(assertion, rpd);</span>

<span class="fc" id="L111">                processSupportingTokens((SupportingToken) assertion, rpd);</span>
<span class="fc bfc" id="L112" title="All 2 branches covered.">            } else if (assertion instanceof Trust10) {</span>
<span class="fc" id="L113">                processTrust10((Trust10)assertion, rpd);</span>
<span class="fc bfc" id="L114" title="All 2 branches covered.">            } else if (assertion instanceof RampartConfig) {</span>
<span class="fc" id="L115">                processRampartConfig((RampartConfig)assertion, rpd);</span>
<span class="pc bpc" id="L116" title="1 of 2 branches missed.">            } else if (assertion instanceof MTOMAssertion){</span>
<span class="nc" id="L117">            	processMTOMSerialization((MTOMAssertion)assertion, rpd);</span>
            } else {
<span class="pc bpc" id="L119" title="1 of 2 branches missed.">                if (log.isDebugEnabled()) {</span>
<span class="nc" id="L120">                    log.debug(&quot;Unknown top level PED found: &quot;</span>
                            + assertion.getClass().getName());
                }
            }
<span class="fc" id="L124">        }</span>
        
<span class="fc" id="L126">        return rpd;</span>
    }

    /**
     * Sets web service security policy version. The policy version is extracted from an assertion.
     * But if namespace is already set this method will just return.
     * @param assertion The assertion to get policy namespace.
     */
    private static void setWebServiceSecurityPolicyNS(Assertion assertion, RampartPolicyData policyData) {

<span class="fc bfc" id="L136" title="All 2 branches covered.">        if (policyData.getWebServiceSecurityPolicyNS() == null) {</span>
<span class="fc" id="L137">            policyData.setWebServiceSecurityPolicyNS(assertion.getName().getNamespaceURI());</span>
        }        
<span class="fc" id="L139">    }</span>

 
    
    /**
     * @param binding
     * @param rpd
     */
    private static void processTransportBinding(TransportBinding binding, RampartPolicyData rpd) {
<span class="fc" id="L148">        binding(binding, rpd);</span>
<span class="fc" id="L149">        rpd.setTransportBinding(true);</span>
<span class="fc" id="L150">        rpd.setTokenProtection(binding.isTokenProtection());</span>
<span class="fc" id="L151">        TransportToken transportToken = binding.getTransportToken();</span>
<span class="pc bpc" id="L152" title="1 of 2 branches missed.">        if ( transportToken != null ) {</span>
<span class="fc" id="L153">            rpd.setTransportToken(transportToken.getTransportToken());</span>
        }
<span class="fc" id="L155">    }</span>

    /**
     * Add TRust10 assertion info into rampart policy data
     * @param trust10
     * @param rpd
     */
    private static void processTrust10(Trust10 trust10, RampartPolicyData rpd) {
<span class="fc" id="L163">        rpd.setTrust10(trust10);</span>
<span class="fc" id="L164">    }</span>

    /**
     * Add the rampart configuration information into rampart policy data.
     * @param config
     * @param rpd
     */
    private static void processRampartConfig(RampartConfig config, RampartPolicyData rpd) {
<span class="fc" id="L172">        rpd.setRampartConfig(config);</span>
<span class="fc" id="L173">    }</span>

    /**
     * Evaluate the symmetric policy binding data.
     * 
     * @param symmBinding
     *            The binding data
     * @param rpd
     *            The WSS4J data to initialize
     * @throws WSSPolicyException
     */
    private static void processSymmetricPolicyBinding(
            SymmetricBinding symmBinding, RampartPolicyData rpd)
            throws WSSPolicyException {
<span class="fc" id="L187">        rpd.setSymmetricBinding(true);</span>
<span class="fc" id="L188">        binding(symmBinding, rpd);</span>
<span class="fc" id="L189">        symmAsymmBinding(symmBinding, rpd);</span>
<span class="fc" id="L190">        symmetricBinding(symmBinding, rpd);</span>
<span class="fc" id="L191">    }</span>

    private static void processWSS10(Wss10 wss10, RampartPolicyData rpd) {
<span class="fc" id="L194">        rpd.setWss10(wss10);</span>
<span class="fc" id="L195">    }</span>

    /**
     * Evaluate the asymmetric policy binding data.
     * 
     * @param binding
     *            The binding data
     * @param rpd
     *            The WSS4J data to initialize
     * @throws WSSPolicyException
     */
    private static void processAsymmetricPolicyBinding(
            AsymmetricBinding binding, RampartPolicyData rpd)
            throws WSSPolicyException {
<span class="fc" id="L209">        rpd.setAsymmetricBinding(true);</span>
<span class="fc" id="L210">        binding(binding, rpd);</span>
<span class="fc" id="L211">        symmAsymmBinding(binding, rpd);</span>
<span class="fc" id="L212">        asymmetricBinding(binding, rpd);</span>
<span class="fc" id="L213">    }</span>

    private static void processWSS11(Wss11 wss11, RampartPolicyData rpd) {
<span class="fc" id="L216">        rpd.setSignatureConfirmation(wss11.isRequireSignatureConfirmation());</span>
<span class="fc" id="L217">        rpd.setWss11(wss11);</span>
<span class="fc" id="L218">    }</span>

    /**
     * Populate elements to sign and/or encrypt with the message tokens.
     * 
     * @param see
     *            The data describing the elements (XPath)
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void processSignedEncryptedElements(
            SignedEncryptedElements see, RampartPolicyData rpd) {
<span class="fc" id="L230">        Iterator&lt;String&gt; it = see.getXPathExpressions().iterator();</span>
<span class="fc bfc" id="L231" title="All 2 branches covered.">        if (see.isSignedElemets()) {</span>
<span class="fc bfc" id="L232" title="All 2 branches covered.">            while (it.hasNext()) {</span>
<span class="fc" id="L233">                rpd.setSignedElements(it.next());</span>
            }
        } else {
<span class="fc bfc" id="L236" title="All 2 branches covered.">            while (it.hasNext()) {</span>
<span class="fc" id="L237">                rpd.setEncryptedElements(it.next());</span>
            }
        }
<span class="fc" id="L240">        rpd.addDeclaredNamespaces(see.getDeclaredNamespaces());</span>
<span class="fc" id="L241">    }</span>

    /**
     * Populate parts to sign and/or encrypt with the message tokens.
     * 
     * @param sep
     *            The data describing the parts
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void processSignedEncryptedParts(SignedEncryptedParts sep,
            RampartPolicyData rpd) {
<span class="fc" id="L253">        Iterator&lt;Header&gt; it = sep.getHeaders().iterator();</span>
<span class="fc bfc" id="L254" title="All 2 branches covered.">        if (sep.isSignedParts()) {</span>
<span class="fc" id="L255">            rpd.setSignBody(sep.isBody());</span>
<span class="fc" id="L256">            rpd.setSignAttachments(sep.isAttachments());</span>
<span class="fc" id="L257">            rpd.setSignAllHeaders(sep.isSignAllHeaders());</span>
<span class="fc" id="L258">           	rpd.setSignBodyOptional(sep.isOptional());</span>
<span class="fc" id="L259">           	rpd.setSignAttachmentsOptional(sep.isOptional());</span>
<span class="fc bfc" id="L260" title="All 2 branches covered.">            while (it.hasNext()) {</span>
<span class="fc" id="L261">                Header header = it.next();</span>
<span class="fc" id="L262">                rpd.addSignedPart(header.getNamespace(), header.getName());</span>
<span class="fc" id="L263">            }</span>
        } else {
<span class="fc" id="L265">            rpd.setEncryptBody(sep.isBody());</span>
<span class="fc" id="L266">            rpd.setEncryptAttachments(sep.isAttachments());</span>
<span class="fc" id="L267">            rpd.setEncryptBodyOptional(sep.isOptional());</span>
<span class="fc" id="L268">           	rpd.setEncryptAttachmentsOptional(sep.isOptional());</span>
<span class="fc bfc" id="L269" title="All 2 branches covered.">            while (it.hasNext()) {</span>
<span class="fc" id="L270">                Header header = it.next();</span>
<span class="fc" id="L271">                rpd.setEncryptedParts(header.getNamespace(), header.getName(),&quot;Header&quot;);</span>
<span class="fc" id="L272">            }</span>
        }
<span class="fc" id="L274">    }</span>
    
    private static void processContentEncryptedElements(ContentEncryptedElements cee,
            RampartPolicyData rpd) {
        
<span class="fc" id="L279">        Iterator&lt;String&gt; it = cee.getXPathExpressions().iterator();     </span>
<span class="fc bfc" id="L280" title="All 2 branches covered.">        while (it.hasNext()) {</span>
<span class="fc" id="L281">            rpd.setContentEncryptedElements(it.next());</span>
        }
<span class="fc" id="L283">        rpd.addDeclaredNamespaces(cee.getDeclaredNamespaces());</span>
<span class="fc" id="L284">    }</span>

    private static void processRequiredElements(RequiredElements req,
            RampartPolicyData rpd) {
        
<span class="fc" id="L289">        Iterator&lt;String&gt; it = req.getXPathExpressions().iterator();     </span>
<span class="fc bfc" id="L290" title="All 2 branches covered.">        while (it.hasNext()) {</span>
<span class="fc" id="L291">            rpd.setRequiredElements(it.next());</span>
        }
<span class="fc" id="L293">        rpd.addDeclaredNamespaces(req.getDeclaredNamespaces());</span>
<span class="fc" id="L294">    }</span>
    /**
     * Evaluate policy data that is common to all bindings.
     * 
     * @param binding
     *            The common binding data
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void binding(Binding binding, RampartPolicyData rpd) {
<span class="fc" id="L304">        rpd.setLayout(binding.getLayout().getValue());</span>
<span class="fc" id="L305">        rpd.setIncludeTimestamp(binding.isIncludeTimestamp());</span>
<span class="fc" id="L306">        rpd.setIncludeTimestampOptional(binding.isIncludeTimestampOptional());</span>
<span class="fc" id="L307">        rpd.setAlgorithmSuite(binding.getAlgorithmSuite());</span>
<span class="fc" id="L308">    }</span>

    /**
     * Evaluate policy data that is common to symmetric and asymmetric bindings.
     * 
     * @param binding
     *            The symmetric/asymmetric binding data
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void symmAsymmBinding(
            SymmetricAsymmetricBindingBase binding, RampartPolicyData rpd) {
<span class="fc" id="L320">        rpd.setEntireHeadersAndBodySignatures(binding</span>
                .isEntireHeadersAndBodySignatures());
<span class="fc" id="L322">        rpd.setProtectionOrder(binding.getProtectionOrder());</span>
<span class="fc" id="L323">        rpd.setSignatureProtection(binding.isSignatureProtection());</span>
<span class="fc" id="L324">        rpd.setTokenProtection(binding.isTokenProtection());</span>
<span class="fc" id="L325">        rpd.setAlgorithmSuite(binding.getAlgorithmSuite());</span>
<span class="fc" id="L326">    }</span>

    /**
     * Evaluate policy data that is specific to symmetric binding.
     * 
     * @param binding
     *            The symmetric binding data
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void symmetricBinding(SymmetricBinding binding,
            RampartPolicyData rpd) throws WSSPolicyException {
<span class="fc" id="L338">        Assertion token = binding.getProtectionToken();</span>
        
<span class="pc bpc" id="L340" title="1 of 2 branches missed.">        if (token != null) {</span>
<span class="fc" id="L341">            rpd.setProtectionToken(((ProtectionToken)token).getProtectionToken());</span>
        } else {
<span class="nc" id="L343">            Assertion encrToken = binding.getEncryptionToken();</span>
<span class="nc" id="L344">            Assertion sigToken = binding.getSignatureToken();</span>
<span class="nc bnc" id="L345" title="All 4 branches missed.">            if (token == null &amp;&amp; sigToken == null) {</span>
<span class="nc" id="L346">                throw new WSSPolicyException(&quot;Symmetric binding should have a Protection token or&quot; +</span>
                		                &quot; both Signature and Encryption tokens defined&quot;);
            }
<span class="nc" id="L349">            rpd.setEncryptionToken(</span>
                    ((EncryptionToken) encrToken).getEncryptionToken());
<span class="nc" id="L351">            rpd.setSignatureToken(((SignatureToken) sigToken).getSignatureToken());</span>
        }
<span class="fc" id="L353">    }</span>

    /**
     * Evaluate policy data that is specific to asymmetric binding.
     * 
     * @param binding
     *            The asymmetric binding data
     * @param rpd
     *            The WSS4J data to initialize
     */
    private static void asymmetricBinding(AsymmetricBinding binding,
            RampartPolicyData rpd) throws WSSPolicyException {
<span class="fc" id="L365">    	RecipientToken rt = binding.getRecipientToken();</span>
<span class="fc" id="L366">    	InitiatorToken it = binding.getInitiatorToken();</span>
<span class="pc bpc" id="L367" title="2 of 4 branches missed.">        if (rt == null || it == null) {</span>
<span class="nc" id="L368">            throw new WSSPolicyException(&quot;Asymmetric binding should have both Initiator and &quot; +</span>
            		                                                &quot;Recipient tokens defined&quot;);
        }
<span class="fc" id="L371">        rpd.setRecipientToken(rt.getReceipientToken());</span>
<span class="fc" id="L372">        rpd.setInitiatorToken(it.getInitiatorToken());</span>
<span class="fc" id="L373">    }</span>

    private static void processSupportingTokens(SupportingToken token,
            RampartPolicyData rpd) throws WSSPolicyException {
<span class="fc" id="L377">        rpd.setSupportingTokens(token);</span>
<span class="fc" id="L378">    }</span>
    
   
    private static void processMTOMSerialization(MTOMAssertion mtomAssertion, RampartPolicyData rpd)
    {
<span class="nc" id="L383">    		rpd.setMTOMAssertion(mtomAssertion);</span>
<span class="nc" id="L384">    }</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.6.1.201212231917</span></div></body></html>