blob: 46624295b7f3d23b18eae43b8522a87ba232c4e6 [file] [log] [blame]
/*
* Copyright 2003-2004 The Apache Software Foundation.
*
* Licensed 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.ws.security.message;
import org.apache.ws.security.SOAPConstants;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* This class implements WS Security header.
*
* Setup a Security header with a specified actor and mustunderstand flag.
*
* <p/>
*
* The defaults for actor and mustunderstand are: empty <code>actor</code> and
* <code>mustunderstand</code> is true.
*
* @author Werner Dittmann (Werner.Dittmann@apache.org)
*/
public class WSSecHeader {
protected String actor = null;
protected boolean mustunderstand = true;
protected boolean doDebug = false;
private Element securityHeader = null;
/**
* Constructor.
*/
public WSSecHeader() {
}
/**
* Constructor.
*
* @param actor
* The actor name of the <code>wsse:Security</code> header
*/
public WSSecHeader(String actor) {
this(actor, true);
}
/**
* Constructor.
*
* @param act
* The actor name of the <code>wsse:Security</code> header
* @param mu
* Set <code>mustUnderstand</code> to true or false
*/
public WSSecHeader(String act, boolean mu) {
actor = act;
mustunderstand = mu;
}
/**
* set actor name.
*
* @param act
* The actor name of the <code>wsse:Security</code> header
*/
public void setActor(String act) {
actor = act;
}
/**
* Set the <code>mustUnderstand</code> flag for the
* <code>wsse:Security</code> header.
*
* @param mu
* Set <code>mustUnderstand</code> to true or false
*/
public void setMustUnderstand(boolean mu) {
mustunderstand = mu;
}
/**
* Get the security header element of this instance.
*
* @return The security header element.
*/
public Element getSecurityHeader() {
return securityHeader;
}
/**
* Returns whether the security header is empty
*
* @return true if empty or if there is no security header
* false if non empty security header
*/
public boolean isEmpty(Document doc) {
if (securityHeader == null) {
securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
.getDocumentElement(), actor, false);
if ( securityHeader == null ) {
return true;
}
}
if ( securityHeader.getChildNodes().getLength() == 0 ) {
return true;
} else {
return false;
}
}
/**
* Creates a security header and inserts it as child into the SOAP Envelope.
*
* <p/>
*
* Check if a WS Security header block for an actor is already available in
* the document. If a header block is found return it, otherwise a new
* wsse:Security header block is created and the attributes set
*
* @param doc
* A SOAP envelope as <code>Document</code>
* @return A <code>wsse:Security</code> element
*/
public Element insertSecurityHeader(Document doc) {
/*
* If there is already a security header in this instance just return it
*/
if (securityHeader != null) {
return securityHeader;
}
SOAPConstants soapConstants = WSSecurityUtil.getSOAPConstants(doc
.getDocumentElement());
securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
.getDocumentElement(), actor, true);
String soapPrefix = WSSecurityUtil.getPrefixNS(soapConstants
.getEnvelopeURI(), securityHeader);
if (actor != null && actor.length() > 0) {
securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
soapPrefix
+ ":"
+ soapConstants.getRoleAttributeQName()
.getLocalPart(), actor);
}
if (mustunderstand) {
securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
soapPrefix + ":" + WSConstants.ATTR_MUST_UNDERSTAND,
soapConstants.getMustUnderstand());
}
return securityHeader;
}
public void removeSecurityHeader(Document doc) {
if (securityHeader == null) {
securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc, doc
.getDocumentElement(), actor, false);
if ( securityHeader == null ) {
return;
}
}
Node parent = securityHeader.getParentNode();
parent.removeChild(securityHeader);
}
}