<?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>RampartMessageData.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</a> &gt; <span class="el_source">RampartMessageData.java</span></div><h1>RampartMessageData.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;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.PolicyUtil;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyComponent;
import org.apache.neethi.PolicyEngine;
import org.apache.rahas.RahasConstants;
import org.apache.rahas.SimpleTokenStore;
import org.apache.rahas.TokenStorage;
import org.apache.rampart.handler.WSSHandlerConstants;
import org.apache.rampart.policy.RampartPolicyBuilder;
import org.apache.rampart.policy.RampartPolicyData;
import org.apache.rampart.policy.model.RampartConfig;
import org.apache.rampart.saml.SAMLAssertionHandler;
import org.apache.rampart.saml.SAMLAssertionHandlerFactory;
import org.apache.rampart.util.Axis2Util;
import org.apache.rampart.util.RampartUtil;
import org.apache.ws.secpolicy.SP11Constants;
import org.apache.ws.secpolicy.SP12Constants;
import org.apache.ws.secpolicy.WSSPolicyException;
import org.apache.ws.security.SOAPConstants;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSSConfig;
import org.apache.ws.security.WSSecurityEngineResult;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.conversation.ConversationConstants;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.apache.ws.security.handler.WSHandlerResult;
import org.apache.ws.security.message.WSSecHeader;
import org.apache.ws.security.message.token.SecurityContextToken;
import org.apache.ws.security.util.Loader;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;

import java.util.ArrayList;
import java.util.List;

public class RampartMessageData {
    
    /**
     * Axis2 parameter name to be used in the client's axis2 xml
     */
    public final static String KEY_RAMPART_POLICY = &quot;rampartPolicy&quot;;
    
    public final static String KEY_RAMPART_IN_POLICY = &quot;rampartInPolicy&quot;;
        
    public final static String KEY_RAMPART_OUT_POLICY = &quot;rampartOutPolicy&quot;;
    
    /**
     * Key to hold the populated RampartPolicyData object
     */
    public final static String RAMPART_POLICY_DATA = &quot;rampartPolicyData&quot;;
    
    public final static String RAMPART_STS_POLICY = &quot;rampartStsPolicy&quot;;
    
    /**
     * Key to hold the custom issued token identifier
     */
    public final static String KEY_CUSTOM_ISSUED_TOKEN = &quot;customIssuedToken&quot;;
    
    /**
     * Key to hold username which was used to authenticate
     */
    public final static String USERNAME = &quot;username&quot;;

    /**
     *
     */
    public final static String SIGNATURE_CERT_ALIAS = &quot;signatureCertAlias&quot;;

    /**
     * Key to hold the WS-Trust version
     */
    public final static String KEY_WST_VERSION = &quot;wstVersion&quot;;
    
    public final static String PARAM_CLIENT_SIDE = &quot;CLIENT_SIDE&quot;;

    /**
     * Key to hold the WS-SecConv version
     */
    public final static String KEY_WSSC_VERSION = &quot;wscVersion&quot;;

    public static final String KEY_SCT_ISSUER_POLICY = &quot;sct-issuer-policy&quot;;
    
    public final static String CANCEL_REQUEST = &quot;cancelrequest&quot;;
    
    public final static String SCT_ID = &quot;sctID&quot;;

    public final static String X509_CERT =&quot;X509Certificate&quot;;
    
<span class="fc" id="L116">    private MessageContext msgContext = null;</span>

<span class="fc" id="L118">    private RampartPolicyData policyData = null;</span>

<span class="fc" id="L120">    private WSSecHeader secHeader = null;</span>

<span class="fc" id="L122">    private WSSConfig config = null;</span>
    
<span class="fc" id="L124">    private int timeToLive = 300;</span>
    
<span class="fc" id="L126">    private int timestampMaxSkew = 0;</span>
    
    private String timestampId;
    
    private Document document;

    private TokenStorage tokenStorage;
    
    /**
     * WS-Trust version to use.
     * 
     * Possible values:
     * RahasConstants.VERSION_05_02
     * RahasConstants.VERSION_05_12
     */
    
<span class="fc" id="L142">    private int wstVersion = RahasConstants.VERSION_05_12;</span>
    
<span class="fc" id="L144">    private int secConvVersion = ConversationConstants.VERSION_05_12;</span>
    
    /*
     * IssuedTokens or SecurityContextTokens can be used
     * as the encryption token, signature token
     */
    private String issuedEncryptionTokenId;
    
    private String issuedSignatureTokenId;
    
    /**
     * The service policy extracted from the message context.
     * If policy is specified in the RampartConfig &lt;b&gt;this&lt;/b&gt; will take precedence
     */
    private Policy servicePolicy;

    private boolean isInitiator;
    
    private boolean sender;
    
    private ClassLoader customClassLoader;
    
    private SOAPConstants soapConstants;

<span class="fc" id="L168">    public RampartMessageData(MessageContext msgCtx, boolean sender) throws RampartException {</span>
        
<span class="fc" id="L170">        this.msgContext = msgCtx;</span>
        
        try {
            
            // First obtain the axis service as we have to do a null check, there can be situations 
            // where Axis Service is null
<span class="fc" id="L176">            AxisService axisService = msgCtx.getAxisService();            </span>
                    
<span class="pc bpc" id="L178" title="1 of 4 branches missed.">            if(axisService != null &amp;&amp; axisService.getParameter(PARAM_CLIENT_SIDE) != null) {</span>
<span class="fc" id="L179">                this.isInitiator = true;</span>
            } else {
<span class="fc bfc" id="L181" title="All 2 branches covered.">                this.isInitiator = !msgCtx.isServerSide();</span>
                //TODO if Axis Service is null at this point, do we have to create a dummy one ??    
<span class="pc bpc" id="L183" title="1 of 4 branches missed.">                if(this.isInitiator &amp;&amp; axisService != null ) {</span>
<span class="fc" id="L184">                    Parameter clientSideParam = new Parameter();</span>
<span class="fc" id="L185">                    clientSideParam.setName(PARAM_CLIENT_SIDE);</span>
<span class="fc" id="L186">                    clientSideParam.setLocked(true);</span>
<span class="fc" id="L187">                    msgCtx.getAxisService().addParameter(clientSideParam);</span>
                }
            }

<span class="fc bfc" id="L191" title="All 2 branches covered.">            if(msgCtx.getProperty(KEY_RAMPART_POLICY) != null) {</span>
<span class="fc" id="L192">                this.servicePolicy = (Policy)msgCtx.getProperty(KEY_RAMPART_POLICY);</span>
            }


            // Checking which flow we are in
<span class="fc" id="L197">            int flow = msgCtx.getFLOW();</span>
            
            // If we are IN flow or IN_FAULT flow and the KEY_RAMPART_IN_POLICY is set , we set the
            // merge that policy to the KEY_RAMPART_POLICY if it is present. Else we set 
            // KEY_RAMPART_IN_POLICY as the service policy
<span class="pc bpc" id="L202" title="1 of 6 branches missed.">            if ( (flow == MessageContext.IN_FLOW || flow == MessageContext.IN_FAULT_FLOW ) </span>
                    &amp;&amp;  msgCtx.getProperty(KEY_RAMPART_IN_POLICY) != null) {
<span class="nc bnc" id="L204" title="All 2 branches missed.">                if ( this.servicePolicy == null ) {</span>
<span class="nc" id="L205">                    this.servicePolicy = (Policy)msgCtx.getProperty(KEY_RAMPART_IN_POLICY);</span>
                } else {
<span class="nc" id="L207">                    this.servicePolicy = this.servicePolicy.merge((Policy)msgCtx</span>
                            .getProperty(KEY_RAMPART_IN_POLICY));
                }
                
            // If we are OUT flow or OUT_FAULT flow and the KEY_RAMPART_OUT_POLICY is set , we set 
            // the merge that policy to the KEY_RAMPART_POLICY if it is present. Else we set 
            // KEY_RAMPART_OUT_POLICY as the service policy    
<span class="pc bpc" id="L214" title="1 of 6 branches missed.">            } else if ( (flow == MessageContext.OUT_FLOW || flow == MessageContext.OUT_FAULT_FLOW ) </span>
                    &amp;&amp;  msgCtx.getProperty(KEY_RAMPART_OUT_POLICY) != null) {
<span class="nc bnc" id="L216" title="All 2 branches missed.">                if (this.servicePolicy == null) {</span>
<span class="nc" id="L217">                    this.servicePolicy = (Policy)msgCtx.getProperty(KEY_RAMPART_OUT_POLICY);</span>
                } else {
<span class="nc" id="L219">                    this.servicePolicy = this.servicePolicy.merge((Policy)msgCtx</span>
                            .getProperty(KEY_RAMPART_OUT_POLICY));
                }
            }
            
            /*
             * Init policy:
             * When creating the RampartMessageData instance we 
             * extract the service policy is set in the msgCtx.
             * If it is missing then try to obtain from the configuration files.
             */

<span class="fc bfc" id="L231" title="All 2 branches covered.">            if (this.servicePolicy == null) {</span>
                try {
<span class="fc" id="L233">                    this.servicePolicy = msgCtx.getEffectivePolicy();</span>
<span class="fc" id="L234">                } catch (NullPointerException e) {</span>
                    //TODO remove this once AXIS2-4114 is fixed
<span class="pc bpc" id="L236" title="1 of 2 branches missed.">                    if (axisService != null) {</span>
<span class="fc" id="L237">                        List&lt;PolicyComponent&gt; policyList = new ArrayList&lt;PolicyComponent&gt;();</span>
<span class="fc" id="L238">                        policyList.addAll(axisService.getPolicySubject().getAttachedPolicyComponents());</span>
<span class="fc" id="L239">                        AxisConfiguration axisConfiguration = axisService.getAxisConfiguration();</span>
<span class="fc" id="L240">                        policyList.addAll(axisConfiguration.getPolicySubject().getAttachedPolicyComponents());</span>
<span class="fc" id="L241">                        this.servicePolicy = PolicyUtil.getMergedPolicy(policyList, axisService);</span>
                    }
<span class="fc" id="L243">                }</span>
            }

<span class="fc bfc" id="L246" title="All 2 branches covered.">            if(this.servicePolicy == null) {</span>
<span class="fc" id="L247">                Parameter param = msgCtx.getParameter(RampartMessageData.KEY_RAMPART_POLICY);</span>
<span class="pc bpc" id="L248" title="1 of 2 branches missed.">                if(param != null) {</span>
<span class="nc" id="L249">                    OMElement policyElem = param.getParameterElement().getFirstElement();</span>
<span class="nc" id="L250">                    this.servicePolicy = PolicyEngine.getPolicy(policyElem);</span>
                }
            }
            
<span class="fc bfc" id="L254" title="All 2 branches covered.">            if(this.servicePolicy != null){</span>
<span class="fc" id="L255">                List it = (List)this.servicePolicy.getAlternatives().next();</span>

                //Process policy and build policy data
<span class="fc" id="L258">                this.policyData = RampartPolicyBuilder.build(it);</span>

                //Set the version
<span class="fc" id="L261">                setWSSecurityVersions(this.policyData.getWebServiceSecurityPolicyNS());</span>
            }

            
<span class="fc bfc" id="L265" title="All 2 branches covered.">            if(this.policyData != null) {</span>

                // Get the SOAP envelope as document, then create a security
                // header and insert into the document (Envelope)
                // WE SHOULD ONLY DO THE CONVERTION IF THERE IS AN APPLICABLE POLICY
<span class="fc" id="L270">                this.document = Axis2Util.getDocumentFromSOAPEnvelope(msgCtx.getEnvelope(), true);</span>
<span class="fc" id="L271">                msgCtx.setEnvelope((SOAPEnvelope)this.document.getDocumentElement());</span>

<span class="fc" id="L273">                this.soapConstants = WSSecurityUtil.getSOAPConstants(this.document.getDocumentElement());</span>

                // Update the Rampart Config if RampartConfigCallbackHandler is present in the
                // RampartConfig
                
<span class="fc" id="L278">                RampartConfigCallbackHandler rampartConfigCallbackHandler = RampartUtil</span>
                        .getRampartConfigCallbackHandler(msgCtx, policyData);
                
<span class="fc bfc" id="L281" title="All 2 branches covered.">                if (rampartConfigCallbackHandler != null) {</span>
<span class="fc" id="L282">                    rampartConfigCallbackHandler.update(policyData.getRampartConfig());</span>
                }

                // Update TTL and max skew time
<span class="fc" id="L286">                RampartConfig policyDataRampartConfig = policyData.getRampartConfig();</span>
<span class="pc bpc" id="L287" title="1 of 2 branches missed.">                if (policyDataRampartConfig != null) {</span>
<span class="fc" id="L288">                    String timeToLiveString = policyDataRampartConfig.getTimestampTTL();</span>
<span class="pc bpc" id="L289" title="2 of 4 branches missed.">                    if (timeToLiveString != null &amp;&amp; !timeToLiveString.equals(&quot;&quot;)) {</span>
<span class="fc" id="L290">                        this.setTimeToLive(Integer.parseInt(timeToLiveString));</span>
                    }

<span class="fc" id="L293">                    String maxSkewString = policyDataRampartConfig.getTimestampMaxSkew();</span>
<span class="pc bpc" id="L294" title="2 of 4 branches missed.">                    if (maxSkewString != null &amp;&amp; !maxSkewString.equals(&quot;&quot;)) {</span>
<span class="fc" id="L295">                        this.setTimestampMaxSkew(Integer.parseInt(maxSkewString));</span>
                    }
                }
                
                //Check for RST and RSTR for an SCT
<span class="fc" id="L300">                String wsaAction = msgContext.getWSAAction();</span>
<span class="fc bfc" id="L301" title="All 4 branches covered.">                if(WSSHandlerConstants.RST_ACTON_SCT.equals(wsaAction)</span>
                        || WSSHandlerConstants.RSTR_ACTON_SCT.equals(wsaAction)) {
                    //submissive version
<span class="fc" id="L304">                    setTrustParameters();</span>
<span class="fc bfc" id="L305" title="All 4 branches covered.">                }else if(WSSHandlerConstants.RST_ACTON_SCT_STANDARD.equals(wsaAction)</span>
                        || WSSHandlerConstants.RSTR_ACTON_SCT_STANDARD.equals(wsaAction)) {
                    //standard policy spec 1.2
<span class="fc" id="L308">                    setTrustParameters();</span>
                }
            }
            
            
<span class="fc" id="L313">            this.sender = sender;</span>
            
<span class="fc" id="L315">            OperationContext opCtx = this.msgContext.getOperationContext();</span>
            
<span class="fc bfc" id="L317" title="All 4 branches covered.">            if(!this.isInitiator &amp;&amp; this.sender) {</span>
                //Get hold of the incoming msg ctx
                MessageContext inMsgCtx;
<span class="pc bpc" id="L320" title="1 of 6 branches missed.">                if (opCtx != null</span>
                        &amp;&amp; (inMsgCtx = opCtx
                                .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE)) != null
                                &amp;&amp; msgContext.getProperty(WSHandlerConstants.RECV_RESULTS) == null) {
<span class="fc" id="L324">                    msgContext.setProperty(WSHandlerConstants.RECV_RESULTS, </span>
                            inMsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS));
                    
                    //If someone set the sct_id externally use it at the receiver
<span class="fc" id="L328">                    msgContext.setProperty(SCT_ID, inMsgCtx.getProperty(SCT_ID));</span>
                }
            }
            
<span class="fc bfc" id="L332" title="All 4 branches covered.">            if(this.isInitiator &amp;&amp; !this.sender) {</span>
                MessageContext outMsgCtx;
<span class="pc bpc" id="L334" title="1 of 4 branches missed.">                if (opCtx != null</span>
                        &amp;&amp; (outMsgCtx = opCtx
                                .getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE)) != null) {
                    
                    //If someone set the sct_id externally use it at the receiver
<span class="fc" id="L339">                    msgContext.setProperty(SCT_ID, outMsgCtx.getProperty(SCT_ID));</span>
                }
            }
            
           // Check whether RampartConfig is present 
<span class="pc bpc" id="L344" title="1 of 4 branches missed.">           if (this.policyData != null &amp;&amp; this.policyData.getRampartConfig() != null) {</span>
               
<span class="fc" id="L346">               boolean timestampPrecisionInMilliseconds = Boolean.valueOf(this.policyData</span>
                       .getRampartConfig().getTimestampPrecisionInMilliseconds()).booleanValue();
               
               // This is not the default behavior, we clone the default WSSConfig to prevent this 
               // affecting globally 
<span class="pc bpc" id="L351" title="1 of 2 branches missed.">               if (timestampPrecisionInMilliseconds == WSSConfig.getNewInstance()</span>
                                                           .isPrecisionInMilliSeconds()) {
<span class="fc" id="L353">                   this.config = WSSConfig.getNewInstance();</span>
               } else {
<span class="nc" id="L355">                   this.config = RampartUtil.getWSSConfigInstance();</span>
<span class="nc" id="L356">                   this.config.setPrecisionInMilliSeconds(timestampPrecisionInMilliseconds);               </span>
               }
<span class="fc" id="L358">           } else {</span>
<span class="fc" id="L359">               this.config = WSSConfig.getNewInstance();</span>
           }
            
           // To handle scenarios where password type is not set by default.
<span class="fc" id="L363">            this.config.setHandleCustomPasswordTypes(true);</span>

<span class="pc bpc" id="L365" title="1 of 2 branches missed.">            if (axisService != null) { </span>
<span class="fc" id="L366">                this.customClassLoader = axisService.getClassLoader(); </span>
            } 
            
<span class="fc bfc" id="L369" title="All 4 branches covered.">            if(this.sender &amp;&amp; this.policyData != null) {</span>
<span class="fc" id="L370">                this.secHeader = new WSSecHeader();</span>
<span class="fc" id="L371">                secHeader.insertSecurityHeader(this.document);</span>
            }
            
<span class="nc" id="L374">        } catch (AxisFault e) {</span>
<span class="nc" id="L375">            throw new RampartException(&quot;errorInExtractingMsgProps&quot;, e);</span>
<span class="nc" id="L376">        } catch (WSSPolicyException e) {</span>
<span class="nc" id="L377">            throw new RampartException(&quot;errorInExtractingMsgProps&quot;, e);</span>
<span class="nc" id="L378">        } catch (WSSecurityException e) {</span>
<span class="nc" id="L379">            throw new RampartException(&quot;errorInExtractingMsgProps&quot;, e);</span>
<span class="fc" id="L380">        }</span>
        
<span class="fc" id="L382">    }</span>

    private void setWSSecurityVersions(String namespace) throws RampartException {

<span class="pc bpc" id="L386" title="2 of 4 branches missed.">        if (namespace == null || namespace.equals(&quot;&quot;)) {</span>
<span class="nc" id="L387">            throw new RampartException(&quot;Security policy namespace cannot be null.&quot;);</span>
        }

<span class="fc bfc" id="L390" title="All 2 branches covered.">        if (SP11Constants.SP_NS.equals(namespace)) {</span>
<span class="fc" id="L391">            this.wstVersion = RahasConstants.VERSION_05_02;</span>
<span class="fc" id="L392">            this.secConvVersion = ConversationConstants.VERSION_05_02;</span>
<span class="pc bpc" id="L393" title="1 of 2 branches missed.">        } else if (SP12Constants.SP_NS.equals(namespace)) {</span>
<span class="fc" id="L394">            this.wstVersion = RahasConstants.VERSION_05_12;</span>
<span class="fc" id="L395">            this.secConvVersion = ConversationConstants.VERSION_05_12;</span>
        } else {
<span class="nc" id="L397">            throw new RampartException(&quot;Invalid namespace received, &quot; + namespace);</span>
        }

<span class="fc" id="L400">    }</span>

    private void setTrustParameters() throws RampartException {

<span class="fc bfc" id="L404" title="All 2 branches covered.">        if (this.policyData.getIssuerPolicy() == null) {</span>
<span class="fc" id="L405">            return;</span>
        }

<span class="fc" id="L408">        this.servicePolicy = this.policyData.getIssuerPolicy();</span>

<span class="fc" id="L410">        RampartConfig rampartConfig = policyData.getRampartConfig();</span>
<span class="pc bpc" id="L411" title="1 of 2 branches missed.">        if (rampartConfig != null) {</span>
            /*
            * Copy crypto info into the new issuer policy
            */
<span class="fc" id="L415">            RampartConfig rc = new RampartConfig();</span>
<span class="fc" id="L416">            rc.setEncrCryptoConfig(rampartConfig.getEncrCryptoConfig());</span>
<span class="fc" id="L417">            rc.setSigCryptoConfig(rampartConfig.getSigCryptoConfig());</span>
<span class="fc" id="L418">            rc.setDecCryptoConfig(rampartConfig.getDecCryptoConfig());</span>
<span class="fc" id="L419">            rc.setUser(rampartConfig.getUser());</span>
<span class="fc" id="L420">            rc.setUserCertAlias(rc.getUserCertAlias());</span>
<span class="fc" id="L421">            rc.setEncryptionUser(rampartConfig.getEncryptionUser());</span>
<span class="fc" id="L422">            rc.setPwCbClass(rampartConfig.getPwCbClass());</span>
<span class="fc" id="L423">            rc.setSSLConfig(rampartConfig.getSSLConfig());</span>

<span class="fc" id="L425">            this.servicePolicy.addAssertion(rc);</span>
        }

<span class="fc" id="L428">        List it = (List) this.servicePolicy.getAlternatives().next();</span>

        //Process policy and build policy data
        try {
<span class="fc" id="L432">            this.policyData = RampartPolicyBuilder.build(it);</span>
<span class="nc" id="L433">        } catch (WSSPolicyException e) {</span>
<span class="nc" id="L434">            throw new RampartException(&quot;errorInExtractingMsgProps&quot;, e);</span>
<span class="fc" id="L435">        }</span>

<span class="fc" id="L437">    }</span>

    /**
     * @return Returns the document.
     */
    public Document getDocument() {
<span class="fc" id="L443">        return document;</span>
    }

    /**
     * @param document The document to set.
     * @deprecated document is derived from MessageContext passed in constructor
     */
    public void setDocument(Document document) {
<span class="nc" id="L451">        this.document = document;</span>
<span class="nc" id="L452">    }</span>

    /**
     * @return Returns the timeToLive.
     */
    public int getTimeToLive() {
<span class="nc" id="L458">        return timeToLive;</span>
    }

    /**
     * @param timeToLive The timeToLive to set.
     */
    public void setTimeToLive(int timeToLive) {
<span class="fc" id="L465">        this.timeToLive = timeToLive;</span>
<span class="fc" id="L466">    }</span>

    /**
     * @return Returns the timestampMaxSkew.
     */
    public int getTimestampMaxSkew() {
<span class="nc" id="L472">        return timestampMaxSkew;</span>
    }

    /**
     * @param timestampMaxSkew The timestampMaxSkew to set.
     */
    public void setTimestampMaxSkew(int timestampMaxSkew) {
<span class="fc" id="L479">        this.timestampMaxSkew = timestampMaxSkew;</span>
<span class="fc" id="L480">    }</span>

    /**
     * @return Returns the config.
     */
    public WSSConfig getConfig() {
<span class="fc" id="L486">        return config;</span>
    }

    /**
     * @param config
     *            The config to set.
     */
    public void setConfig(WSSConfig config) {
<span class="nc" id="L494">        this.config = config;</span>
<span class="nc" id="L495">    }</span>

    /**
     * @return Returns the msgContext.
     */
    public MessageContext getMsgContext() {
<span class="fc" id="L501">        return msgContext;</span>
    }

    /**
     * @param msgContext The msgContext to set.
     * @deprecated MessageContext is set in constructor
     */
    public void setMsgContext(MessageContext msgContext) {
<span class="nc" id="L509">        this.msgContext = msgContext;</span>
<span class="nc" id="L510">    }</span>

    /**
     * @return Returns the policyData.
     */
    public RampartPolicyData getPolicyData() {
<span class="fc" id="L516">        return policyData;</span>
    }

    /**
     * @param policyData The policyData to set.
     * @deprecated Policy data determined within constructor
     */
    public void setPolicyData(RampartPolicyData policyData) throws RampartException {
<span class="nc" id="L524">        this.policyData = policyData;</span>
        
        try {
            //if client side then check whether sig conf enabled 
            //and get hold of the stored signature values
<span class="nc bnc" id="L529" title="All 6 branches missed.">            if(this.isInitiator &amp;&amp; !this.sender &amp;&amp; policyData.isSignatureConfirmation()) {</span>
<span class="nc" id="L530">                OperationContext opCtx = msgContext.getOperationContext();</span>
<span class="nc" id="L531">                MessageContext outMsgCtx = opCtx</span>
                        .getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
<span class="nc" id="L533">                msgContext.setProperty(WSHandlerConstants.SEND_SIGV, outMsgCtx</span>
                        .getProperty(WSHandlerConstants.SEND_SIGV));
            }
<span class="nc" id="L536">        } catch (AxisFault e) {</span>
<span class="nc" id="L537">            throw new RampartException(&quot;errorGettingSignatureValuesForSigconf&quot;, e);</span>
<span class="nc" id="L538">        }</span>
<span class="nc" id="L539">    }</span>

    /**
     * @return Returns the secHeader.
     */
    public WSSecHeader getSecHeader() {
<span class="fc" id="L545">        return secHeader;</span>
    }

    /**
     * @param secHeader
     *            The secHeader to set.
     */
    public void setSecHeader(WSSecHeader secHeader) {
<span class="nc" id="L553">        this.secHeader = secHeader;</span>
<span class="nc" id="L554">    }</span>

    /**
     * @return Returns the issuedEncryptionTokenId.
     */
    public String getIssuedEncryptionTokenId() {
<span class="fc" id="L560">        return issuedEncryptionTokenId;</span>
    }

    /**
     * @param issuedEncryptionTokenId The issuedEncryptionTokenId to set.
     */
    public void setIssuedEncryptionTokenId(String issuedEncryptionTokenId) {
<span class="nc" id="L567">        this.issuedEncryptionTokenId = issuedEncryptionTokenId;</span>
<span class="nc" id="L568">    }</span>

    /**
     * @return Returns the issuedSignatureTokenId.
     */
    public String getIssuedSignatureTokenId() {
<span class="nc bnc" id="L574" title="All 2 branches missed.">        if(this.isInitiator) {</span>
<span class="nc" id="L575">            return issuedSignatureTokenId;</span>
        } else {
            //Pick the first SAML token
            //TODO : This is a hack , MUST FIX
            //get the sec context id from the req msg ctx
<span class="nc" id="L580">            List&lt;WSHandlerResult&gt; results</span>
                    = (List&lt;WSHandlerResult&gt;)this.msgContext.getProperty(WSHandlerConstants.RECV_RESULTS);
<span class="nc bnc" id="L582" title="All 2 branches missed.">            for (WSHandlerResult result : results) {</span>
<span class="nc" id="L583">                List&lt;WSSecurityEngineResult&gt; wsSecEngineResults = result.getResults();</span>

<span class="nc bnc" id="L585" title="All 2 branches missed.">                for (WSSecurityEngineResult wsSecEngineResult : wsSecEngineResults) {</span>
<span class="nc" id="L586">                    final Integer actInt =</span>
                            (Integer) wsSecEngineResult.get(WSSecurityEngineResult.TAG_ACTION);
<span class="nc bnc" id="L588" title="All 2 branches missed.">                    if (WSConstants.ST_UNSIGNED == actInt) {</span>
<span class="nc" id="L589">                        final Object assertion =</span>
                                wsSecEngineResult.get(WSSecurityEngineResult.TAG_SAML_ASSERTION);
<span class="nc" id="L591">                        SAMLAssertionHandler samlAssertionHandler</span>
                                = SAMLAssertionHandlerFactory.createAssertionHandler(assertion);

<span class="nc" id="L594">                        return samlAssertionHandler.getAssertionId();</span>
                    }

<span class="nc" id="L597">                }</span>
<span class="nc" id="L598">            }</span>
<span class="nc" id="L599">            return null;</span>
        }
    }

    /**
     * @param issuedSignatureTokenId The issuedSignatureTokenId to set.
     */
    public void setIssuedSignatureTokenId(String issuedSignatureTokenId) {
<span class="nc" id="L607">        this.issuedSignatureTokenId = issuedSignatureTokenId;</span>
<span class="nc" id="L608">    }</span>

    /**
     * @return Returns the secConvTokenId.
     */
    public String getSecConvTokenId() {
<span class="fc" id="L614">        String id = null;</span>
        
<span class="fc bfc" id="L616" title="All 2 branches covered.">        if(this.isInitiator) {</span>
<span class="fc" id="L617">            String contextIdentifierKey = RampartUtil.getContextIdentifierKey(this.msgContext);</span>
<span class="fc" id="L618">            id = (String) RampartUtil.getContextMap(this.msgContext).get(contextIdentifierKey);</span>
<span class="fc" id="L619">        } else {</span>
            //get the sec context id from the req msg ctx
<span class="fc" id="L621">            List&lt;WSHandlerResult&gt; results = (List&lt;WSHandlerResult&gt;)this.msgContext.getProperty(WSHandlerConstants.RECV_RESULTS);</span>
<span class="fc bfc" id="L622" title="All 2 branches covered.">            for (WSHandlerResult result : results) {</span>
<span class="fc" id="L623">                List&lt;WSSecurityEngineResult&gt; wsSecEngineResults = result.getResults();</span>

<span class="fc bfc" id="L625" title="All 2 branches covered.">                for (WSSecurityEngineResult wsSecEngineResult : wsSecEngineResults) {</span>
<span class="fc" id="L626">                    final Integer actInt =</span>
                            (Integer) wsSecEngineResult.get(WSSecurityEngineResult.TAG_ACTION);
<span class="fc bfc" id="L628" title="All 2 branches covered.">                    if (WSConstants.SCT == actInt) {</span>
<span class="fc" id="L629">                        final SecurityContextToken sct =</span>
                                ((SecurityContextToken) wsSecEngineResult
                                        .get(WSSecurityEngineResult.TAG_SECURITY_CONTEXT_TOKEN));
<span class="fc" id="L632">                        id = sct.getID();</span>
                    }

<span class="fc" id="L635">                }</span>
<span class="fc" id="L636">            }</span>
        }

<span class="pc bpc" id="L639" title="1 of 4 branches missed.">        if(id == null || id.length() == 0) {</span>
            //If we can't find the sec conv token id up to this point then
            //check if someone has specified which one to use
<span class="fc" id="L642">            id = (String)this.msgContext.getProperty(SCT_ID);</span>
        }
        
<span class="fc" id="L645">        return id;</span>
    }

    /**
     * @param secConvTokenId The secConvTokenId to set.
     */
    public void setSecConvTokenId(String secConvTokenId) {
<span class="fc" id="L652">        String contextIdentifierKey = RampartUtil.getContextIdentifierKey(this.msgContext);</span>
<span class="fc" id="L653">        RampartUtil.getContextMap(this.msgContext).put(</span>
                                                    contextIdentifierKey,
                                                    secConvTokenId);
<span class="fc" id="L656">    }</span>



    /**
     * @return Returns the tokenStorage.
     */
    public TokenStorage getTokenStorage() throws RampartException {

<span class="fc bfc" id="L665" title="All 2 branches covered.">        if(this.tokenStorage != null) {</span>
<span class="fc" id="L666">            return this.tokenStorage;</span>
        }

<span class="fc" id="L669">        TokenStorage storage = (TokenStorage) this.msgContext.getConfigurationContext().getProperty(</span>
                        TokenStorage.TOKEN_STORAGE_KEY);

<span class="fc bfc" id="L672" title="All 2 branches covered.">        if (storage != null) {</span>
<span class="fc" id="L673">            this.tokenStorage = storage;</span>
        } else {
<span class="pc bpc" id="L675" title="2 of 4 branches missed.">            if (this.policyData.getRampartConfig() != null &amp;&amp;</span>
                    this.policyData.getRampartConfig().getTokenStoreClass() != null) {
<span class="nc" id="L677">                Class stClass = null;</span>
<span class="nc" id="L678">                String storageClass = this.policyData.getRampartConfig()</span>
                        .getTokenStoreClass();
                try {
<span class="nc" id="L681">                    stClass = Loader.loadClass(this.customClassLoader, storageClass);</span>
<span class="nc" id="L682">                } catch (ClassNotFoundException e) {</span>
<span class="nc" id="L683">                    throw new RampartException(</span>
                            &quot;WSHandler: cannot load token storage class: &quot;
                                    + storageClass, e);
<span class="nc" id="L686">                }</span>
                try {
<span class="nc" id="L688">                    this.tokenStorage = (TokenStorage) stClass.newInstance();</span>
<span class="nc" id="L689">                } catch (java.lang.Exception e) {</span>
<span class="nc" id="L690">                    throw new RampartException(</span>
                            &quot;Cannot create instance of token storage: &quot;
                                    + storageClass, e);
<span class="nc" id="L693">                }</span>
<span class="nc" id="L694">            } else {</span>
<span class="fc" id="L695">                this.tokenStorage = new SimpleTokenStore();</span>
                
            }
            
            //Set the storage instance
<span class="fc" id="L700">            this.msgContext.getConfigurationContext().setProperty(</span>
                    TokenStorage.TOKEN_STORAGE_KEY, this.tokenStorage);
        }
        
        
<span class="fc" id="L705">        return tokenStorage;</span>
    }

    /**
     * @param tokenStorage The tokenStorage to set.
     */
    public void setTokenStorage(TokenStorage tokenStorage) {
<span class="nc" id="L712">        this.tokenStorage = tokenStorage;</span>
<span class="nc" id="L713">    }</span>

    /**
     * @return Returns the wstVersion.
     */
    public int getWstVersion() {
<span class="fc" id="L719">        return wstVersion;</span>
    }

    /**
     * @param wstVersion The wstVersion to set.
     * @deprecated This is defined by the class.
     */
    public void setWstVersion(int wstVersion) {
<span class="nc" id="L727">        this.wstVersion = wstVersion;</span>
<span class="nc" id="L728">    }</span>

    /**
     * @return Returns the secConvVersion.
     */
    public int getSecConvVersion() {
<span class="fc" id="L734">        return secConvVersion;</span>
    }

    /**
     * @return Returns the servicePolicy.
     */
    public Policy getServicePolicy() {
<span class="fc" id="L741">        return servicePolicy;</span>
    }

    /**
     * @param servicePolicy The servicePolicy to set.
     * @deprecated servicePolicy determined in constructor
     */
    public void setServicePolicy(Policy servicePolicy) {
<span class="nc" id="L749">        this.servicePolicy = servicePolicy;</span>
<span class="nc" id="L750">    }</span>
    
    /**
     * @return Returns the timestampId.
     */
    public String getTimestampId() {
<span class="fc" id="L756">        return timestampId;</span>
    }

    /**
     * @param timestampId The timestampId to set.
     */
    public void setTimestampId(String timestampId) {
<span class="fc" id="L763">        this.timestampId = timestampId;</span>
<span class="fc" id="L764">    }</span>

    /**
     * @return Returns the Initiator value
     */
    public boolean isInitiator() {
<span class="fc" id="L770">        return isInitiator;</span>
    }

    /**
     * Returns the custom class loader if we are using one
     * @return Returns the custom class loader if we are using one
     */
    public ClassLoader getCustomClassLoader() {
<span class="fc" id="L778">        return customClassLoader;</span>
    }

    /**
     * Returns an &lt;code&gt;org.apache.ws.security.SOAPConstants&lt;/code&gt; instance 
     * with soap version information of this request. 
     * @return Returns soap version information of this request
     */
    public SOAPConstants getSoapConstants() {
<span class="fc" id="L787">        return soapConstants;</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>