blob: 8fdb120512645bf70033eddf0b76a99979f26e9a [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.WSSConfig;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.Vector;
/**
* This is the base class for WS Security messages. It provides common functions
* and fields used by the specific message classes such as sign, encrypt, and
* username token.
*
* @author Werner Dittmann (Werner.Dittmann@t-online.de)
*/
public class WSBaseMessage {
protected String actor = null;
protected boolean mustunderstand = true;
protected String user = null;
protected String password = null;
protected int keyIdentifierType = WSConstants.ISSUER_SERIAL;
protected Vector parts = null;
protected int timeToLive = 300; // time between Created and Expires
protected boolean doDebug = false;
protected WSSConfig wssConfig = WSSConfig.getDefaultWSConfig();
/**
* Constructor.
*
* @deprecated replaced by {@link WSSecBase#WSSecBase()}
*/
public WSBaseMessage() {
}
/**
* Constructor. <p/>
*
* @param actor
* The actor name of the <code>wsse:Security</code> header
* @deprecated replaced by {@link WSSecBase#WSSecBase()} and
* {@link WSSecHeader} for actor specification.
*/
public WSBaseMessage(String actor) {
this(actor, true);
}
/**
* Constructor. <p/>
*
* @param actor
* The actor name of the <code>wsse:Security</code> header
* @param mu
* Set <code>mustUnderstand</code> to true or false
*
* @deprecated replaced by {@link WSSecBase#WSSecBase()} and
* {@link WSSecHeader} for actor and mustunderstand
* specification.
*/
public WSBaseMessage(String actor, boolean mu) {
setActor(actor);
setMustUnderstand(mu);
}
/**
* set actor name. <p/>
*
* @param act
* The actor name of the <code>wsse:Security</code> header
* @deprecated replaced by {@link WSSecHeader#setActor(String)}
*/
public void setActor(String act) {
actor = act;
}
/**
* Set the time to live. This is the time difference in seconds between the
* <code>Created</code> and the <code>Expires</code> in
* <code>Timestamp</code>. <p/>
*
* @param ttl
* The time to live in second
* @deprecated replaced by {@link WSSecTimestamp#setTimeToLive(int)}
*/
public void setTimeToLive(int ttl) {
timeToLive = ttl;
}
/**
* Set which parts of the message to encrypt/sign. <p/>
*
* @param parts
* The vector containing the WSEncryptionPart objects
* @deprecated replaced by {@link WSSecBase#setParts(Vector)}
*/
public void setParts(Vector parts) {
this.parts = parts;
}
/**
* Set the <code>mustUnderstand</code> flag for the
* <code>wsse:Security</code> header
*
* @param mu
* Set <code>mustUnderstand</code> to true or false
* @deprecated replaced by {@link WSSecHeader#setMustUnderstand(boolean)}
*/
public void setMustUnderstand(boolean mu) {
mustunderstand = mu;
}
/**
* Sets which key identifier to use. <p/> Defines the key identifier type to
* use in the {@link WSSignEnvelope#build(Document, Crypto) signature} or
* the {@link WSEncryptBody#build(Document, Crypto) ecnryption} function to
* set up the key identification elements.
*
* @param keyIdType
* @see WSConstants#ISSUER_SERIAL
* @see WSConstants#BST_DIRECT_REFERENCE
* @see WSConstants#X509_KEY_IDENTIFIER
* @see WSConstants#SKI_KEY_IDENTIFIER
* @deprecated replaced by {@link WSSecBase#setKeyIdentifierType(int)}
*/
public void setKeyIdentifierType(int keyIdType) {
keyIdentifierType = keyIdType;
}
/**
* Gets the value of the <code>keyIdentifyerType</code>.
*
* @return The <code>keyIdentifyerType</code>.
* @see WSConstants#ISSUER_SERIAL
* @see WSConstants#BST_DIRECT_REFERENCE
* @see WSConstants#X509_KEY_IDENTIFIER
* @see WSConstants#SKI_KEY_IDENTIFIER
* @deprecated replaced by {@link WSSecBase#getKeyIdentifierType()}
*/
public int getKeyIdentifierType() {
return keyIdentifierType;
}
/**
* @param wsConfig
* The wsConfig to set.
* @deprecated replaced by {@link WSSecBase#setWsConfig(WSSConfig)}
*/
public void setWsConfig(WSSConfig wsConfig) {
this.wssConfig = wsConfig;
}
/**
* Looks up or adds a body id. <p/> First try to locate the
* <code>wsu:Id</code> in the SOAP body element. If one is found, the
* value of the <code>wsu:Id</code> attribute is returned. Otherwise the
* methode generates a new <code>wsu:Id</code> and an appropriate value.
*
* @param doc
* The SOAP envelope as <code>Document</code>
* @return The value of the <code>wsu:Id</code> attribute of the SOAP body
* @throws Exception
* @deprecated replaced by {@link WSSecBase#setBodyID(Document)}
*/
protected String setBodyID(Document doc) throws Exception {
SOAPConstants soapConstants = WSSecurityUtil.getSOAPConstants(doc
.getDocumentElement());
Element bodyElement = (Element) WSSecurityUtil.getDirectChild(doc
.getFirstChild(), soapConstants.getBodyQName().getLocalPart(),
soapConstants.getEnvelopeURI());
if (bodyElement == null) {
throw new Exception("SOAP Body Element node not found");
}
return setWsuId(bodyElement);
}
protected String setWsuId(Element bodyElement) {
String id = null;
id = bodyElement.getAttributeNS(WSConstants.WSU_NS, "Id");
if ((id == null) || (id.length() == 0)) {
id = "id-" + Integer.toString(bodyElement.hashCode());
String prefix = WSSecurityUtil.setNamespace(bodyElement,
WSConstants.WSU_NS, WSConstants.WSU_PREFIX);
bodyElement.setAttributeNS(WSConstants.WSU_NS, prefix + ":Id", id);
}
return id;
}
/**
* Set the user and password info. <p/> Both information is used to get the
* user's private signing key.
*
* @param user
* This is the user's alias name in the keystore that identifies
* the private key to sign the document
* @param password
* The user's password to get the private signing key from the
* keystore
* @deprecated replaced by {@link WSSecBase#setUserInfo(String, String)}
*/
public void setUserInfo(String user, String password) {
this.user = user;
this.password = password;
}
/**
* 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
* @deprecated replaced by
* {@link WSSecHeader#insertSecurityHeader(Document)}
*/
protected Element insertSecurityHeader(Document doc) {
SOAPConstants soapConstants = WSSecurityUtil.getSOAPConstants(doc
.getDocumentElement());
// lookup a security header block that matches actor
Element securityHeader = WSSecurityUtil.getSecurityHeader(doc, actor,
soapConstants);
if (securityHeader == null) { // create if nothing found
securityHeader = WSSecurityUtil.findWsseSecurityHeaderBlock(doc,
doc.getDocumentElement(), actor, true);
String soapPrefix = WSSecurityUtil.getPrefixNS(soapConstants
.getEnvelopeURI(), securityHeader);
if (actor != null && actor.length() > 0) {
// Check for SOAP 1.2 here and use "role" instead of "actor"
securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
soapPrefix
+ ":"
+ soapConstants.getRoleAttributeQName()
.getLocalPart(), actor);
}
if (mustunderstand) {
securityHeader.setAttributeNS(soapConstants.getEnvelopeURI(),
soapPrefix + ":" + WSConstants.ATTR_MUST_UNDERSTAND,
soapConstants.getMustUnderstand());
}
}
return securityHeader;
}
}