blob: b049ca1c57b9261db4b2704c9ecf2834a15d2494 [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.sandbox.security.trust2;
import org.apache.ws.sandbox.security.trust2.exception.NoRequestType;
import org.apache.ws.sandbox.security.trust2.exception.NoSoapBody;
import org.apache.ws.sandbox.security.trust2.exception.TrustException;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.ws.security.SOAPConstants;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSSConfig;
import org.apache.ws.security.message.token.UsernameToken;
import org.apache.ws.security.util.WSSecurityUtil;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.net.URI;
/**
* @author ddelvecc
* <p/>
* A class for adding a WS-Trust RequestSecurityToken element to a SOAP envelope (an XML document).
*/
public class WSAddTokenRequest {
private URI action = null;
private RequestSecurityToken tokenRequest;
public WSAddTokenRequest(RequestSecurityToken tokenRequest) {
this.tokenRequest = tokenRequest;
}
/**
* Adds the standard Action element corresponding to the RequestType specified in the RequestSecurityToken message being used.
* If the request type is non-standard (not Issue, Renew, Validate), the Action URI added will be the same as the RequestType URI.
*
* @throws NoRequestType
*/
public void addAction() throws NoRequestType {
action = TrustConstants.getActionRequest(tokenRequest.getRequestType());
if (action == null) {
throw new NoRequestType("Cannot generate standard action element, no requestType specified.");
}
}
/**
* Adds a custom Action element to the SOAP header. See WS-Addressing specs for more details.
*
* @param action The action URI to add.
*/
public void addAction(URI action) {
this.action = action;
}
/**
* Adds a new <code>RequestSecurityToken</code> to a soap envelope.
* <p/>
*
* @param doc The SOAP enevlope as W3C document
* @return Document with RequestSecurityToken added
* @throws DOMException NoRequestType NoSoapBody
*/
public Document build(Document doc) throws DOMException, TrustException {
SOAPConstants soapConsts = WSSecurityUtil.getSOAPConstants(doc.getDocumentElement());
if (action != null) {
Element envelope = doc.getDocumentElement();
Element soapHeader = (Element) WSSecurityUtil.getDirectChild(doc.getFirstChild(), soapConsts.getHeaderQName().getLocalPart(),
soapConsts.getEnvelopeURI());
if (soapHeader == null) {
soapHeader = createElementInSameNamespace(envelope, soapConsts.getHeaderQName().getLocalPart());
soapHeader = WSSecurityUtil.prependChildElement(doc, envelope, soapHeader, true);
}
Element actionElement = doc.createElementNS(TrustConstants.WSA_NS, TrustConstants.WST_PREFIX + TrustConstants.ACTION_TAG);
Node actionContent = doc.createTextNode(action.toString());
actionElement.appendChild(actionContent);
soapHeader.appendChild(actionElement);
}
Element soapBody = WSSecurityUtil.findBodyElement(doc, soapConsts);
if (soapBody == null) {
throw new NoSoapBody("A SOAP Body element is needed to insert the <RequestSecurityToken>.");
}
setWsuId(soapBody);
if (tokenRequest != null)
soapBody.appendChild(tokenRequest.getElement());
return doc;
}
/**
* create a new element in the same namespace
* <p/>
*
* @param parent
* @param localName
* @return
*/
private static Element createElementInSameNamespace(Element parent, String localName) {
String prefix = parent.getPrefix();
if (prefix == null) {
prefix = "";
}
String qName = prefix + ":" + localName;
String nsUri = parent.getNamespaceURI();
return parent.getOwnerDocument().createElementNS(nsUri, qName);
}
private String setWsuId(Element bodyElement) {
String 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;
}
public static void main(String[] args) throws Exception {
SOAPEnvelope env = new SOAPEnvelope();
Document doc = env.getAsDocument();
WSSConfig wssConfig = WSSConfig.getDefaultWSConfig();
RequestSecurityToken tokenRequest = new RequestSecurityToken(doc, TrustConstants.REQUEST_ISSUE);
tokenRequest.setContext(new URI("http://context.context"));
tokenRequest.setTokenType(TokenTypes.X509);
UsernameToken userToken = new UsernameToken(wssConfig.isPrecisionInMilliSeconds(), doc);
userToken.setName("bob");
userToken.setPassword("bobspass");
tokenRequest.setBase(new SecurityTokenOrReference(userToken));
UsernameToken user2Token = new UsernameToken(wssConfig.isPrecisionInMilliSeconds(), doc);
user2Token.setName("joe");
user2Token.setPassword("bobspass");
tokenRequest.addSupporting(new SecurityTokenOrReference(user2Token));
UsernameToken user3Token = new UsernameToken(wssConfig.isPrecisionInMilliSeconds(), doc);
user3Token.setName("mike");
user3Token.setPassword("bobspass");
tokenRequest.addSupporting(new SecurityTokenOrReference(user3Token));
WSAddTokenRequest builder = new WSAddTokenRequest(tokenRequest);
builder.addAction();
doc = builder.build(doc);
/*
WSSignEnvelope builder = new WSSignEnvelope();
builder.setUserInfo(credName, password);
builder.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
doc = builder.build(env.getAsDocument(), CryptoFactory.getInstance(cryptoPropFile));
*/
System.out.println("\n============= Request ==============");
System.out.println(org.apache.axis.utils.XMLUtils.DocumentToString(doc));
}
}