a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: MessageProcessor.java,v 1.3 2008/06/25 05:47:22 qcheng Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.liberty.ws.soapbinding;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.soap.SOAPBody;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.soap.SOAPMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.soap.SOAPHeader;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.xml.soap.SOAPException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.security.auth.Subject;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.servlet.http.HttpServletRequest;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.ByteArrayOutputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.io.ByteArrayInputStream;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.security.cert.Certificate;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.ArrayList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Iterator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Document;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Element;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.Node;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport org.w3c.dom.NodeList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.wsse.BinarySecurityToken;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.common.wsse.WSSEConstants;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.security.SecurityUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.security.SecurityTokenManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.security.SecurityAssertion;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.ResourceOffering;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.DiscoveryClient;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.QueryResponse;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.Description;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.liberty.ws.disco.ServiceInstance;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml.common.SAMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.xml.XMLUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The class <code>MessageProcessor</code> is used to process the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * <code>SOAPMessage</code> for the JSR 196 providers. This API will
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * be used by both the client and server providers for securing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and validating the request/responses between the web services
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * applications.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class MessageProcessor {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private SOAPProviderConfig _config = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String correlationId = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private MessageProcessor() {}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructor
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param config SOAPConfiguration that will be used to validate
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the SOAPMessage.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public MessageProcessor(SOAPProviderConfig config) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this._config = config;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This method is used to validate the SOAP Message Request by the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * processing rules of Liberty SOAPBinding specifications.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param soapMessage SOAPMessage that needs to be validated.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param subject Subject that may be used to populate the authenticated
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * entity/user principal and any other credential information.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sharedData that may be used to store any data needed between
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the request and response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param httpRequest HttpServletRequest associated with this SOAP
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Message request.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return Object Credential object after successful validation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws SOAPBindingException for any error occured during validation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public Object validateRequest(SOAPMessage soapMessage,Subject subject,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map sharedData,HttpServletRequest httpRequest)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("SOAPProvider.validateRequest : Init");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message req = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster req = new Message(soapMessage);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sharedData.put(SOAPBindingConstants.LIBERTY_REQUEST, req);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(req.getSecurityProfileType() != Message.ANONYMOUS &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster !SecurityUtils.verifyMessage(req)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.validateRequest: Signature"+
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Verification failed.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotVerifySignature"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.enforceProcessingRules(req, null, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(_config != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String authMech = req.getAuthenticationMechanism();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(authMech == null ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster !_config.getSupportedAuthenticationMechanisms()
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .contains(authMech)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("unsupportedAuthMech"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("nullConfiguration"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return _config.getAuthenticator().authenticate(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster req, subject, sharedData, httpRequest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SOAPBindingException sbe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.validateRequest: Request" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Validation has failed.", sbe);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw sbe;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SOAPFaultException sfe) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.validateRequest: SOAPFault" +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Exception.", sfe);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("soapFaultException"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Secures the SOAP Message response by adding necessary headers to the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * given SOAP Message and also signs the message if it is required.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param soapMessage SOAP Message that needs to be secured.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sharedData Any shared data that may be needed between the request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SOAPMessage Secured SOAP Message by adding liberty headers
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and also signs the message if configured.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws SOAPBindingException for any failure.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public SOAPMessage secureResponse (SOAPMessage soapMessage, Map sharedData)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("MessageProcessor.secureResponse : Init");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message req = (Message)sharedData.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPBindingConstants.LIBERTY_REQUEST);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster addCorrelationHeader(soapMessage, req);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(_config.isResponseSignEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage = signMessage(soapMessage, null, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("MessageProcessor.secureResponse: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster XMLUtils.print(soapMessage.getSOAPPart().getEnvelope()));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return soapMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.secureResponse: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Failed in securing the response", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("secureResponseFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Secures the request by getting the credential from the discovery
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * service.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param offering Resource Offering of the discovery service.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param credentials List of credentials that are required to access
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the discovery service.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param serviceType Service Type that the discovery service should
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * need to look for.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param soapMessage SOAPMessage that needs to be secured.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sharedData Any shared data that may be used between the request
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * and the response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SOAPMessage Secured SOAP Message.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws SOAPBindingException for any failure.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public SOAPMessage secureRequest(ResourceOffering offering,List credentials,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String serviceType,SOAPMessage
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage,Map sharedData)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("MessageProcessor.secureRequest:Init");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPHeader header = addCorrelationHeader(soapMessage, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster QueryResponse discoResponse =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getWebserviceOffering(offering, credentials, serviceType);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("MessageProcessor.secureRequest: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Discovery Response: " + discoResponse.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ResourceOffering serviceOffering =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (ResourceOffering)discoResponse.getResourceOffering().get(0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List creds = discoResponse.getCredentials();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String securityProfile = processResourceOffering(serviceOffering);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SecurityAssertion securityAssertion = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // If the security profile is of SAML or Bearer insert a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // security token for this profile.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (securityProfile.equals(Message.NULL_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_BEARER) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_BEARER) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_BEARER) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_BEARER_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_BEARER_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_BEARER_WSF11)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(creds != null && creds.size() != 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityAssertion = (SecurityAssertion)creds.get(0);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityAssertion.addToParent(header);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (securityProfile.equals(Message.NULL_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.NULL_X509_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.TLS_X509_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityProfile.equals(Message.CLIENT_TLS_X509_WSF11)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage = signMessage(soapMessage, securityProfile,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityAssertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (Utils.debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.message("MessageProcessor.secureRequest: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster XMLUtils.print(soapMessage.getSOAPPart().getEnvelope()));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return soapMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.secureRequest: Failure in " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Securing the request.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("secureRequestFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Validates the SOAP Response from the service and verifies the signature
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * if needed.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param soapMessage SOAPMessage that needs to be validated.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param sharedData Any shared data that may be required between the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * request and the response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SOAPMessage Validated SOAP Response.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws SOAPBindingException for any failure.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public SOAPMessage validateResponse(SOAPMessage soapMessage,Map sharedData)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Message msg = new Message(soapMessage);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(_config.isResponseSignEnabled() &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster !SecurityUtils.verifyMessage(msg)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotVerifySignature"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.enforceProcessingRules(msg, null, true);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return soapMessage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.validateResponse: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster " Response validation failed.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("validateResponseFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Signs the message.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param soapMessage SOAPMessage that needs to be signed.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param profile Security profile that needs to be used for signing.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param assertion Security Assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SOAPMessage signed SOAPMessage.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private SOAPMessage signMessage(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPMessage soapMessage,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String profile,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SecurityAssertion assertion
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster )
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPHeader soapHeader =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.getSOAPPart().getEnvelope().getHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(soapHeader == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.getSOAPPart().getEnvelope().addHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPBody soapBody =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.getSOAPPart().getEnvelope().getBody();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(soapBody == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("nullSOAPBody"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String bodyId = SAMLUtils.generateID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapBody.setAttributeNS(WSSEConstants.NS_WSU_WSF11,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster WSSEConstants.WSU_ID, bodyId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List ids = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ids.add(bodyId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(correlationId != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ids.add(correlationId);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Certificate cert = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Element sigElem = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ByteArrayInputStream bin = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ByteArrayOutputStream bop = new ByteArrayOutputStream();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Document doc = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(profile == null ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.NULL_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.TLS_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.CLIENT_TLS_X509) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.NULL_X509_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.TLS_X509_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.CLIENT_TLS_X509_WSF11)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster BinarySecurityToken binaryToken = addBinaryToken(soapMessage);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cert = SecurityUtils.getCertificate(binaryToken);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.writeTo(bop);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bin = new ByteArrayInputStream(bop.toByteArray());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doc = XMLUtils.toDOMDocument(bin, Utils.debug);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sigElem = SecurityUtils.getSignatureManager().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signWithWSSX509TokenProfile(doc, cert, "", ids,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPBindingConstants.WSF_11_VERSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if(profile.equals(Message.NULL_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.CLIENT_TLS_SAML) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.NULL_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.TLS_SAML_WSF11) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster profile.equals(Message.CLIENT_TLS_SAML_WSF11)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cert = SecurityUtils.getCertificate(assertion);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.writeTo(bop);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster new ByteArrayInputStream(bop.toByteArray());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bin = new ByteArrayInputStream(bop.toByteArray());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster doc = XMLUtils.toDOMDocument(bin, Utils.debug);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sigElem = SecurityUtils.getSignatureManager().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster signWithWSSSAMLTokenProfile(doc, cert,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster assertion.getAssertionID(), "", ids,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPBindingConstants.WSF_11_VERSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(sigElem == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.signMessage: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SigElement is null");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotSignMessage"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Element securityHeader = getSecurityHeader(soapMessage);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster securityHeader.appendChild(securityHeader.getOwnerDocument().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster importNode(sigElem, true));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return Utils.DocumentToSOAPMessage(sigElem.getOwnerDocument());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.signMessage: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Signing failed.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotSignMessage"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Adds the correlation header.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param msg SOAP Message that needs to be added with Correlation header.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param req Message Request, if present adds the correlation header
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * reference.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SOAPHeader SOAP Header with Correlation header.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @throws SOAPBindingException if there is an error.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private SOAPHeader addCorrelationHeader(SOAPMessage msg, Message req)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPHeader header =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster msg.getSOAPPart().getEnvelope().getHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(header == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster header = msg.getSOAPPart().getEnvelope().addHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CorrelationHeader cHeader = new CorrelationHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster correlationId = cHeader.getId();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(req != null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cHeader.setRefToMessageID(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster req.getCorrelationHeader().getMessageID());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cHeader.addToParent(header);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return header;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.addCorrealtionHeader: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Could not add correlation header", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotAddCorrelationHeader"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Adds binary token to the security header.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private BinarySecurityToken addBinaryToken(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPMessage msg
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ) throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPHeader header =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster msg.getSOAPPart().getEnvelope().getHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(header == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster header = msg.getSOAPPart().getEnvelope().addHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SecurityTokenManager manager = new SecurityTokenManager(null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster BinarySecurityToken binaryToken =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster manager.getX509CertificateToken();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binaryToken.setWSFVersion(SOAPBindingConstants.WSF_11_VERSION);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster binaryToken.addToParent(header);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return binaryToken;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.addBinaryToken: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Could not add binary security token", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("cannotAddCorrelationHeader"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns web service offering by making a discovery query.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private QueryResponse getWebserviceOffering(ResourceOffering offering,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List credentials,String serviceType)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(serviceType);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster DiscoveryClient client = new DiscoveryClient(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster offering, null, null, credentials);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return client.getResourceOffering(list);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.getWebserviceOffering : " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Failed in discovery query.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("discoveryQueryFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns security profile after parsing the resource offering.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String processResourceOffering(ResourceOffering offering)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ServiceInstance si = offering.getServiceInstance();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List descriptions = si.getDescription();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(descriptions == null || descriptions.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor:processResourceOffering: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "descriptions are null.");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("noDescriptions"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Iterator iter = descriptions.iterator();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster while(iter.hasNext()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Description desc = (Description)iter.next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List secMechIDs = desc.getSecurityMechID();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (secMechIDs == null || secMechIDs.isEmpty()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "MessageProcessor.processResourceOffering:"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + " security Mechs are empty");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("noSecurityMechs"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (String)secMechIDs.iterator().next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster //It should not come over here.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("noSecurityMechs"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception ex) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcessor.processResourceOffering: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Failed in processing the resource offering.", ex);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("processOfferingFailed"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Returns the security header element.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private Element getSecurityHeader(SOAPMessage soapMessage)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throws SOAPBindingException {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SOAPHeader header =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster soapMessage.getSOAPPart().getEnvelope().getHeader();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NodeList headerChildNodes = header.getChildNodes();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if((headerChildNodes == null) ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (headerChildNodes.getLength() == 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("noSecurityHeader"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for(int i=0; i < headerChildNodes.getLength(); i++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Node currentNode = headerChildNodes.item(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if(currentNode.getNodeType() != Node.ELEMENT_NODE) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster continue;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if((WSSEConstants.TAG_SECURITYT.equals(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentNode.getLocalName())) &&
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (WSSEConstants.NS_WSSE_WSF11.equals(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster currentNode.getNamespaceURI()))) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return (Element)currentNode;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (SOAPException se) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.debug.error("MessageProcess.getSecurityHeader:: " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SOAPException", se);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SOAPBindingException(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Utils.bundle.getString("noSecurityHeader"));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}