org.wso2.carbon.identity.sts.mex.MexGetService.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.identity.sts.mex.MexGetService.java

Source

/*                                                                             
 * Copyright 2005,2006 WSO2, Inc. http://www.wso2.org
 *                                                                             
 * 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.wso2.carbon.identity.sts.mex;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.util.Base64;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.AddressingConstants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.addressing.EndpointReferenceHelper;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.mex.om.Metadata;
import org.apache.axis2.mex.om.MetadataSection;
import org.apache.axis2.namespace.Constants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.rahas.RahasConstants;
import org.wso2.carbon.identity.base.IdentityConstants;
import org.wso2.carbon.identity.base.IdentityException;
import org.wso2.carbon.identity.core.util.KeyUtil;
import org.wso2.carbon.service.mgt.ServiceAdmin;

import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.namespace.QName;

import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MexGetService {

    private static Log log = LogFactory.getLog(MexGetService.class);
    private static final String IDENTITY_LN = "Identity";
    private static final String KEY_INFO_LN = "KeyInfo";
    private static final String X509DATA_LN = "X509Data";
    private static final String X509CERT_LN = "X509Certificate";
    private static final String WSA_PREFIX = "a"; // workaround for oM bug

    public OMElement get(OMElement element) throws AxisFault {
        OMElement elem = null;

        if (log.isDebugEnabled()) {
            log.debug("begin Mex get");
        }

        MessageContext msgCtx = MessageContext.getCurrentMessageContext();
        String service = msgCtx.getAxisService().getName();

        ServiceAdmin admin = new ServiceAdmin();
        String stsName = null;
        if (service.equals(IdentityConstants.SERVICE_NAME_MEX_UT)) {
            stsName = IdentityConstants.SERVICE_NAME_STS_UT;
        } else if (service.equals(IdentityConstants.SERVICE_NAME_MEX_IC)) {
            stsName = IdentityConstants.SERVICE_NAME_STS_IC;
        } else if (service.equals(IdentityConstants.SERVICE_NAME_MEX_UT_SYMM)) {
            stsName = IdentityConstants.SERVICE_NAME_STS_UT_SYMM;
        } else if (service.equals(IdentityConstants.SERVICE_NAME_MEX_IC_SYMM)) {
            stsName = IdentityConstants.SERVICE_NAME_STS_IC_SYMM;
        } else if (service.equals(IdentityConstants.OpenId.SERVICE_NAME_MEX_OPENID)) {
            stsName = IdentityConstants.OpenId.SERVICE_NAME_STS_OPENID;
        } else if (service.equals(IdentityConstants.OpenId.SERVICE_NAME_MEX_IC_OPENID)) {
            stsName = IdentityConstants.OpenId.SERVICE_NAME_STS_IC_OPENID;
        } else {
            throw new AxisFault("Invalid Mex Service");
        }

        OMElement retElement = admin.getWSDL(stsName).getFirstElement();
        OMElement defElement = retElement.getFirstChildWithName(new QName(Constants.NS_URI_WSDL11, "definitions"));
        setIdentityAddressing(defElement);
        MetadataSection section = new MetadataSection();
        section.setDialect("http://schemas.xmlsoap.org/wsdl/");
        section.setinlineData(defElement);
        section.setIdentifier(RahasConstants.WST_NS_05_02);

        List lst = new ArrayList();
        lst.add(section);

        Metadata mdata = new Metadata();
        mdata.setMetadatSections(lst);

        elem = mdata.toOM();

        if (log.isDebugEnabled()) {
            log.debug("Mex processing DONE -> RESPONSE : " + elem);
        }

        return elem;
    }

    private void setIdentityAddressing(OMElement definitionElement) throws AxisFault {
        if (log.isDebugEnabled()) {
            log.debug("setIdentityAddressing");
        }

        Iterator ite = definitionElement.getChildrenWithName(new QName(Constants.NS_URI_WSDL11, "service"));
        OMElement serviceElem = null;
        if (ite.hasNext()) {
            serviceElem = (OMElement) ite.next();
        } else {
            throw new AxisFault(
                    "Cannot find element Nampsace :" + Constants.NS_URI_WSDL11 + " || Local Name : service");
        }

        OMFactory factory = definitionElement.getOMFactory();
        OMNamespace wsaNs = factory.createOMNamespace(AddressingConstants.Final.WSA_NAMESPACE, WSA_PREFIX);
        definitionElement.declareNamespace(wsaNs);

        String value = IdentityConstants.SERVICE_NAME_STS_UT;
        X509Certificate cert;
        try {
            cert = KeyUtil.getCertificateToIncludeInMex(value);
        } catch (IdentityException e) {
            throw new AxisFault(e.getMessage(), e);
        }

        if (cert == null) {
            throw new AxisFault("STS's certificate is null");
        }

        Iterator portIte = serviceElem.getChildElements();
        while (portIte.hasNext()) {
            OMElement portElem = (OMElement) portIte.next();
            if ("port".equals(portElem.getLocalName())) {
                addIIdentityAddressing(portElem, cert);
            }
        }
    }

    /**
     * This method adds EndPointReference element into Port element of the WSDL
     */
    private void addIIdentityAddressing(OMElement portElem, X509Certificate cert) throws AxisFault {

        if (log.isDebugEnabled()) {
            log.debug("addIIdentityAddressing - port Element found");
        }

        try {

            Iterator ite = portElem.getChildElements();
            String address = null;
            while (ite.hasNext()) {
                OMElement elem = (OMElement) ite.next();
                if ("address".equals(elem.getLocalName())) {
                    address = elem.getAttributeValue(new QName("", "location"));
                    break; // only one address element
                }
            }

            if (address == null) {
                throw new AxisFault("Address inside Port Element is null");
            }

            EndpointReference ref = new EndpointReference(address);

            OMFactory factory = portElem.getOMFactory(); // this is an OM bug
            // OMFactory factory = OMAbstractFactory.getOMFactory();
            OMElement identityElem = factory
                    .createOMElement(new QName(IdentityConstants.IDENTITY_ADDRESSING_NS, IDENTITY_LN));

            OMNamespace ns = factory.createOMNamespace(XMLSignature.XMLNS, "dsig");
            OMElement keyInfoElem = factory.createOMElement(KEY_INFO_LN, ns);
            OMElement X509DataElem = factory.createOMElement(X509DATA_LN, ns);
            OMElement X509CertElem = factory.createOMElement(X509CERT_LN, ns);

            byte[] byteArray = cert.getEncoded();
            X509CertElem.setText(Base64.encode(byteArray));
            X509DataElem.addChild(X509CertElem);
            keyInfoElem.addChild(X509DataElem);
            identityElem.addChild(keyInfoElem);
            ArrayList lst = new ArrayList();
            lst.add(identityElem);
            ref.setExtensibleElements(lst);

            QName qname = new QName(AddressingConstants.Final.WSA_NAMESPACE, "EndpointReference", WSA_PREFIX);
            OMElement refElem = EndpointReferenceHelper.toOM(factory, ref, qname,
                    AddressingConstants.Final.WSA_NAMESPACE);
            portElem.addChild(refElem);

        } catch (Exception e) {
            throw new AxisFault(e.getMessage(), e);
        }
    }
}