alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Glassfish example source code file (CSIV2TaggedComponentInfo.java)

This example Glassfish source code file (CSIV2TaggedComponentInfo.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Glassfish tags/keywords

compoundsecmech, compoundsecmech, corba, creating, default_realm, ejbdescriptor, ejbiorconfigurationdescriptor, ejbiorconfigurationdescriptor, iiop, io, log, logging, sas_contextsec, string, string, tls_sec_trans, transportaddress, transportaddress, util

The Glassfish CSIV2TaggedComponentInfo.java source code

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.enterprise.iiop.security;

import java.util.Iterator ;
import java.util.Set ;
import java.util.Properties ;
import java.util.List ;

import java.util.logging.Level ;
import java.util.logging.Logger ;

import java.io.IOException ;

import org.omg.CORBA.ORB;

import com.sun.enterprise.util.Utility;
import com.sun.enterprise.deployment.EjbIORConfigurationDescriptor;
import com.sun.enterprise.deployment.EjbDescriptor;

import com.sun.logging.LogDomains ;

import com.sun.corba.ee.spi.ior.TaggedComponent ;
import com.sun.corba.ee.spi.ior.IOR;

import com.sun.corba.ee.spi.ior.iiop.IIOPProfile;
import com.sun.corba.ee.spi.ior.iiop.IIOPProfileTemplate;

import com.sun.corba.ee.spi.orbutil.generic.UnaryFunction;

import com.sun.corba.ee.spi.folb.SocketInfo ;

import com.sun.corba.ee.impl.encoding.CDRInputObject;
import com.sun.corba.ee.impl.encoding.CDROutputObject;
import com.sun.corba.ee.impl.encoding.EncapsInputStream;

// The following classes are generated from CSIIOP.idl
import com.sun.corba.ee.org.omg.CSIIOP.CompoundSecMech ;
import com.sun.corba.ee.org.omg.CSIIOP.CompoundSecMechList ;
import com.sun.corba.ee.org.omg.CSIIOP.CompoundSecMechListHelper ;
import com.sun.corba.ee.org.omg.CSIIOP.EstablishTrustInClient ;
import com.sun.corba.ee.org.omg.CSIIOP.EstablishTrustInTarget ;
import com.sun.corba.ee.org.omg.CSIIOP.IdentityAssertion ;
import com.sun.corba.ee.org.omg.CSIIOP.Integrity ;
import com.sun.corba.ee.org.omg.CSIIOP.Confidentiality ;
import com.sun.corba.ee.org.omg.CSIIOP.SAS_ContextSec ;
import com.sun.corba.ee.org.omg.CSIIOP.AS_ContextSec ;
import com.sun.corba.ee.org.omg.CSIIOP.ServiceConfiguration ;
import com.sun.corba.ee.org.omg.CSIIOP.TLS_SEC_TRANS ;
import com.sun.corba.ee.org.omg.CSIIOP.TLS_SEC_TRANSHelper ;
import com.sun.corba.ee.org.omg.CSIIOP.TAG_NULL_TAG ;
import com.sun.corba.ee.org.omg.CSIIOP.TAG_CSI_SEC_MECH_LIST ;
import com.sun.corba.ee.org.omg.CSIIOP.TAG_TLS_SEC_TRANS ;
import com.sun.corba.ee.org.omg.CSIIOP.TransportAddress ;
import org.glassfish.enterprise.iiop.api.GlassFishORBHelper;
import org.omg.CORBA.INV_POLICY;
import org.omg.PortableInterceptor.IORInfo;

import org.glassfish.enterprise.iiop.impl.CSIv2Policy;
import org.jvnet.hk2.component.Habitat;
/** 
 * This is the class that manages the CSIV2 tagged component information
 * in the IORs.
 * Note: For supporting FLOB in a cluster/EE mode we need to register the CSIV2TaggedComponentHandlerImpl
 * with the GlassFishORBManager.
 * @author Vivek Nagar
 * @author Harpreet Singh
 * @author Ken Cavanaugh
 */

public final class CSIV2TaggedComponentInfo
{
    public static final int SUPPORTED_IDENTITY_TOKEN_TYPES = 15;

    private static final String DEFAULT_REALM = "default";
    private static final Logger _logger ;
    private static final org.omg.IOP.TaggedComponent NULL_TAGGED_COMPONENT ;

    static{
	byte[] b = {} ;
	NULL_TAGGED_COMPONENT = new org.omg.IOP.TaggedComponent(
	    TAG_NULL_TAG.value, b);
	_logger = LogDomains.getLogger(CSIV2TaggedComponentInfo.class,LogDomains.SECURITY_LOGGER);
    }

    // Realm name is first picked up from the application object.
    // If the realm is unpopulated here, then we query it from
    // the IORDescriptor(as in for a standalone ejb case).
    // The fallback is "default"
  //  private String _realm_name = null;
 //   private byte[] _realm_name_bytes = null;
    private ORB orb;
    private int sslMutualAuthPort;
    private GlassFishORBHelper orbHelper;
    
    
    public CSIV2TaggedComponentInfo(ORB orb, Habitat habitat) {
	this.orb = orb;	
        orbHelper = Lookups.getGlassFishORBHelper(habitat);
    }

    public CSIV2TaggedComponentInfo(ORB orb, int sslMutualAuthPort , Habitat habitat) {
	this( orb, habitat ) ;
	this.sslMutualAuthPort = sslMutualAuthPort ;
    }

    public  EjbDescriptor getEjbDescriptor( IORInfo iorInfo ) {
	CSIv2Policy csiv2Policy = null;
	try {
	    csiv2Policy = (CSIv2Policy)iorInfo.get_effective_policy(
                orbHelper.getCSIv2PolicyType());
	} catch ( INV_POLICY ex ) {
	    _logger.log(Level.FINE, 
			"CSIV2TaggedComponentInfo.getEjbDescriptor: CSIv2Policy not present");
	}
	    
	// Add CSIv2 tagged component for this EJB type.
	if(_logger.isLoggable(Level.FINE)) {
	    _logger.log(Level.FINE, 
			"TxSecIORInterceptor.establish_components: CSIv2Policy: " + csiv2Policy);
	}

	EjbDescriptor ejbDesc = null ;
	if (csiv2Policy != null)
	    ejbDesc = csiv2Policy.getEjbDescriptor() ;

	return ejbDesc ;
    }

    /**
     * Create the security mechanism list tagged component based 
     * on the deployer specified configuration information.
     * This method is on the server side for all ejbs in the
     * non-cluster app server case. 
     */
    public org.omg.IOP.TaggedComponent createSecurityTaggedComponent(
	int sslPort, EjbDescriptor desc) {

        org.omg.IOP.TaggedComponent tc = null;
	try {
            if (_logger.isLoggable(Level.FINE)) {
                _logger.log(Level.FINE, "IIOP: Creating a Security Tagged Component");
            }
	    
            // get the realm from the application object.
            //_realm_name = desc.getApplication().getRealm();
            CompoundSecMech[] mechList = createCompoundSecMechs(sslPort, desc);
            tc = createCompoundSecMechListComponent(mechList);
        } catch(Exception e) {
            _logger.log(Level.SEVERE,"iiop.createcompund_exception",e);
        }

        return tc;
    }

    /** Create the CSIv2 tagged component for a clustered app server.
     */
    public org.omg.IOP.TaggedComponent createSecurityTaggedComponent(
	List<SocketInfo> socketInfos, EjbDescriptor desc)
    {
        org.omg.IOP.TaggedComponent tc = null;
        if (desc != null) {
            try {
                if (_logger.isLoggable(Level.FINE)) {
                    _logger.log(Level.FINE, "IIOP: Creating a Security Tagged Component");
                }

                // get the realm from the application object.
                //  _realm_name = desc.getApplication().getRealm();
                CompoundSecMech[] mechList = createCompoundSecMechs( socketInfos, desc ) ;
                tc =  createCompoundSecMechListComponent(mechList);
            } catch(Exception e) {
                _logger.log(Level.SEVERE,"iiop.createcompund_exception",e);
            }
        }

        return tc;
    }

    private boolean getBooleanValue(Properties props, String name ) {
	String val = props.getProperty( name, "false" ) ;
	boolean result = val.equals( "true" ) ;
	return result ;
    }

    /**
     * This method is called on the server side for all non-EJB POAs. 
     */
    public org.omg.IOP.TaggedComponent createSecurityTaggedComponent(int sslPort ) {

        org.omg.IOP.TaggedComponent tc = null;

	try {
	    Properties props = orbHelper.getCSIv2Props();
	    boolean sslRequired = getBooleanValue(props,
		GlassFishORBHelper.ORB_SSL_SERVER_REQUIRED);
	    boolean clientAuthRequired = getBooleanValue(props,
		GlassFishORBHelper.ORB_CLIENT_AUTH_REQUIRED);

	    CompoundSecMech[] mechList = new CompoundSecMech[1]; 

	    org.omg.IOP.TaggedComponent transportMech = createSSLInfo(
		sslPort, null, sslRequired);
	    
	    // Create AS_Context
	    AS_ContextSec asContext = createASContextSec(null, DEFAULT_REALM);

	    // Create SAS_Context
	    SAS_ContextSec sasContext = createSASContextSec(null);

	    short targetRequires = 
		    (clientAuthRequired ? EstablishTrustInClient.value : 0);

	    // Convert Profile.TaggedComponent to org.omg.IOP.TaggedComponent
	    mechList[0] = new CompoundSecMech(targetRequires, 
		transportMech, asContext, sasContext);

	    tc =  createCompoundSecMechListComponent(mechList);
        } catch(Exception e) {
            _logger.log(Level.SEVERE,"iiop.createcompund_exception",e);
        }
        return tc;
    }

    private org.omg.IOP.TaggedComponent createCompoundSecMechListComponent(
	CompoundSecMech[] mechList) {

 	CDROutputObject out = (CDROutputObject) orb.create_output_stream();
	out.putEndian();

	boolean stateful = false; 
	CompoundSecMechList list = new CompoundSecMechList(
	    stateful, mechList);
	CompoundSecMechListHelper.write(out, list);
	byte[] buf = out.toByteArray();
	org.omg.IOP.TaggedComponent tc = new org.omg.IOP.TaggedComponent( 
	    TAG_CSI_SEC_MECH_LIST.value, buf ) ;
	return tc;
    }

    private Set<EjbIORConfigurationDescriptor> getIORConfigurationDescriptors( 
	EjbDescriptor desc ) {

        if (desc == null) {
            return null ;
        }

	Set iorDescSet = desc.getIORConfigurationDescriptors();
	int size = iorDescSet.size();
	if (size == 0) {
	    // No IOR config descriptors:
	    // Either none were configured or 1.2.x app.

	    // Create an IOR config desc with SSL supported
	    EjbIORConfigurationDescriptor eDesc = 
		new EjbIORConfigurationDescriptor();
	    eDesc.setIntegrity(
		EjbIORConfigurationDescriptor.SUPPORTED);
	    eDesc.setConfidentiality(
		EjbIORConfigurationDescriptor.SUPPORTED);
	    eDesc.setEstablishTrustInClient(
		EjbIORConfigurationDescriptor.SUPPORTED);
	    iorDescSet.add(eDesc);
	    size = 1;

	    // Check if method permissions are set on the descriptor.
	    // If they are then enable username_password mechanism in as_context
	    Set permissions = desc.getPermissionedRoles();
	    if (permissions.size() > 0) {
                if(_logger.isLoggable(Level.FINE)){
                    _logger.log(Level.FINE,"IIOP:Application has protected methods");
                }

	        eDesc.setAuthMethodRequired(true);
                String realmName = DEFAULT_REALM;


                if (desc.getApplication() != null) {
                    realmName = desc.getApplication().getRealm();
                }
                
                if (realmName == null) {
                    realmName = DEFAULT_REALM;
                }
                eDesc.setRealmName(realmName);
	    }
	}

	return (Set<EjbIORConfigurationDescriptor>)iorDescSet ;
    }
    
    // Type of simple closure used for createCompoundSecMechs
    private interface DescriptorMaker extends
	UnaryFunction<EjbIORConfigurationDescriptor,org.omg.IOP.TaggedComponent> { } 

    /**
     * Create the security mechanisms. Only 1 such mechanism is created
     * although the spec allows multiple mechanisms (in decreasing order
     * of preference).  Note that creating more than one CompoundSecMech
     * here will cause getSecurityMechanisms to fail, as it supports
     * only one CompoundSecMech.
     */
    private CompoundSecMech[] createCompoundSecMechs(
	DescriptorMaker maker, EjbDescriptor desc) throws IOException {

        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP: Creating CompoundSecMech");
        }

        if (desc == null) {
            return null ;
        }

	Set iorDescSet = getIORConfigurationDescriptors( desc ) ;

        CompoundSecMech[] mechList = new CompoundSecMech[iorDescSet.size()]; 
	Iterator<EjbIORConfigurationDescriptor> itr = iorDescSet.iterator();
        if(_logger.isLoggable(Level.FINE)){
	    	_logger.log(Level.FINE,"IORDescSet SIZE:" + iorDescSet.size());
	}
        String realmName = DEFAULT_REALM;

	for(int i = 0; i < iorDescSet.size(); i++) {
	    EjbIORConfigurationDescriptor iorDesc = itr.next();
            int target_requires = getTargetRequires(iorDesc);
	    org.omg.IOP.TaggedComponent comp = maker.evaluate( iorDesc ) ;
	    
            if(desc != null && desc.getApplication() != null)  {
                realmName = desc.getApplication().getRealm();
            }

            if(realmName == null) {
                realmName = iorDesc.getRealmName();
            }

            if(realmName == null) {
                realmName = DEFAULT_REALM;
            }
            // Create AS_Context
            AS_ContextSec asContext = createASContextSec(iorDesc, realmName);
	    
            // Create SAS_Context
            SAS_ContextSec sasContext = createSASContextSec(iorDesc);
	    
	    // update the target requires value
	    int targ_req = target_requires | asContext.target_requires
		| sasContext.target_requires;
	    
            // Convert Profile.TaggedComponent to org.omg.IOP.TaggedComponent
            mechList[i] = new CompoundSecMech((short)targ_req,
                            comp, asContext, sasContext);
	}
        return mechList;
    }

    private CompoundSecMech[] createCompoundSecMechs( 
	final List<SocketInfo> socketInfos,
	final EjbDescriptor desc ) throws IOException {

	DescriptorMaker maker = new DescriptorMaker() {
	    public org.omg.IOP.TaggedComponent evaluate( EjbIORConfigurationDescriptor desc ) {
		return createSSLInfo( socketInfos, desc, false ) ;
	    }
	} ;

	return createCompoundSecMechs( maker, desc ) ;
    }

    private CompoundSecMech[] createCompoundSecMechs( 
	final int sslPort,
	final EjbDescriptor desc ) throws IOException {

	DescriptorMaker maker = new DescriptorMaker() {
	    public org.omg.IOP.TaggedComponent evaluate( EjbIORConfigurationDescriptor desc ) {
		return createSSLInfo( sslPort, desc, false ) ;
	    }
	} ;

	return createCompoundSecMechs( maker, desc ) ;
    }

    /**
     * Create the AS layer context within a compound mechanism definition.
     */
    public AS_ContextSec createASContextSec(
			EjbIORConfigurationDescriptor iorDesc, String realmName)
        		throws IOException
    {
        AS_ContextSec asContext = null;
        int target_supports = 0;
        int target_requires = 0;
        byte[] client_authentication_mechanism = {};
        byte[] target_name = {} ;
        String authMethod  = null;
        boolean authMethodRequired = false;

        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP: Creating AS_Context");
        }

        // If AS_ContextSec is not required to be generated in an IOR,
        // then optimize the code by not generating and filling in fields that are
        // irrelevant.

        if (iorDesc != null) {
            authMethod = iorDesc.getAuthenticationMethod();
            authMethodRequired = iorDesc.isAuthMethodRequired();
	}

        if ((authMethod != null) && 
	    (authMethod.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE))) {

            asContext = new AS_ContextSec((short)target_supports, 
		(short)target_requires, client_authentication_mechanism, 
		target_name);

            return asContext;
	}
            
        /** Functionality for Realm Per App
         * Try to get the realm from the descriptor, else fill in default
         */
  /*      if(_realm_name == null){// realm name should be populated at this point
            if(iorDesc != null){
                _realm_name = iorDesc.getRealmName();
            }

            if(_realm_name == null){
                _realm_name = DEFAULT_REALM;
                if(_logger.isLoggable(Level.FINE)){
                    _logger.log(Level.FINE, "IIOP:AS_Context: Realm Name = null,"
                                + " setting default realm for logging in");
                }
            }
        }*/

        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP:AS_Context: Realm Name for login = "+
                        realmName);
        }

        if (realmName == null) {
            realmName = iorDesc.getRealmName();
        }
        if (realmName == null) {
            realmName = DEFAULT_REALM;
        }
        byte[] _realm_name_bytes = realmName.getBytes();
        
        target_name = GSSUtils.createExportedName(
                               GSSUtils.GSSUP_MECH_OID,
		               _realm_name_bytes);

        target_supports = EstablishTrustInClient.value;

        if  (authMethodRequired){
            target_requires = EstablishTrustInClient.value;
        }

        client_authentication_mechanism = GSSUtils.getMechanism();

        asContext = new AS_ContextSec((short)target_supports,
                                        (short)target_requires,
                                        client_authentication_mechanism,
                                        target_name);

        return asContext;
    }

    /**
     * Create the SAS layer context within a compound mechanism definition.
     */
    public SAS_ContextSec createSASContextSec(
		    EjbIORConfigurationDescriptor iorDesc)
        	    throws IOException
    {
        SAS_ContextSec sasContext = null;
	// target_supports = 0 means that target supports ITTAbsent
        int target_supports = 0;
        int target_requires = 0;
        ServiceConfiguration[] priv = new ServiceConfiguration[0];
        String callerPropagation = null;
        byte[][] mechanisms = {};
        
        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP: Creating SAS_Context");
        }


	// this shall be non-zero if target_supports is non-zero
	int supported_identity_token_type = 0;

        if (iorDesc != null) {
            callerPropagation = iorDesc.getCallerPropagation();
        }

        if ((callerPropagation != null) 
	    && (callerPropagation.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE))){
            sasContext = new SAS_ContextSec((short)target_supports,
                                            (short)target_requires,
                                            priv, mechanisms,
					    supported_identity_token_type);
            return sasContext;
	}

	target_supports = IdentityAssertion.value;

        byte[] upm = GSSUtils.getMechanism(); // Only username_password mechanism
        mechanisms = new byte[1][upm.length];
        for(int i = 0; i < upm.length; i++) {
            mechanisms[0][i] = upm[i];
        }

	// para 166 of CSIv2 spec says that the bit corresponding to the
	// ITTPrincipalName is non-zero if supported_mechanism has atleast
	// 1 element. Supported_mechanism has the value of GSSUP OID
	if (target_supports != 0){
	    supported_identity_token_type = SUPPORTED_IDENTITY_TOKEN_TYPES;
        }

        sasContext = new SAS_ContextSec((short)target_supports,
                                        (short)target_requires,
                                        priv, mechanisms,
					supported_identity_token_type);

        return sasContext;
    }

    /**
     * Get the value of target_supports for the transport layer.
     */
    public int getTargetSupports(EjbIORConfigurationDescriptor iorDesc)
    {
	if ( iorDesc == null ) {
            return 0;
        }

	int supports = 0;
	String integrity = iorDesc.getIntegrity();
	if(!integrity.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE)) {
	    supports = supports | Integrity.value;
	}

	String confidentiality = iorDesc.getConfidentiality();
	if(!confidentiality.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE)) {
	    supports = supports | Confidentiality.value;
	}

	String establishTrustInTarget = iorDesc.getEstablishTrustInTarget();
	if(!establishTrustInTarget.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE)) {
	    supports = supports | EstablishTrustInTarget.value;
	}

	String establishTrustInClient = iorDesc.getEstablishTrustInClient();
	if(!establishTrustInClient.equalsIgnoreCase(EjbIORConfigurationDescriptor.NONE)) {
	    supports = supports | EstablishTrustInClient.value;
	}

	return supports;
    }

    /**
     * Get the value of target_requires for the transport layer.
     */
    public int getTargetRequires(EjbIORConfigurationDescriptor iorDesc)
    {
	if ( iorDesc == null ) {
            return 0;
        }

	int requires = 0;
	String integrity = iorDesc.getIntegrity();
	if(integrity.equalsIgnoreCase(EjbIORConfigurationDescriptor.REQUIRED)) {
	    requires = requires | Integrity.value;
	}

	String confidentiality = iorDesc.getConfidentiality();
	if(confidentiality.equalsIgnoreCase(EjbIORConfigurationDescriptor.REQUIRED)) {
	    requires = requires | Confidentiality.value;
	}

	String establishTrustInTarget = iorDesc.getEstablishTrustInTarget();
	if(establishTrustInTarget.equalsIgnoreCase(EjbIORConfigurationDescriptor.REQUIRED)) {
	    requires = requires | EstablishTrustInTarget.value;
	}

	String establishTrustInClient = iorDesc.getEstablishTrustInClient();
	if(establishTrustInClient.equalsIgnoreCase(EjbIORConfigurationDescriptor.REQUIRED)) {
	    requires = requires | EstablishTrustInClient.value;
	}

	return requires;
    }

    private int getTargetSupportsDefault( EjbIORConfigurationDescriptor desc ) {
	int targetSupports = 0 ;
	if (desc == null)
	    targetSupports = Integrity.value | Confidentiality.value 
		| EstablishTrustInClient.value | EstablishTrustInTarget.value;
	else
	    targetSupports = getTargetSupports(desc);

	return targetSupports ;
    }

    private int getTargetRequiresDefault( EjbIORConfigurationDescriptor desc, boolean sslRequired ) {
	int targetRequires = 0 ;
	if (desc == null) {
	    if (sslRequired)
		targetRequires = Integrity.value | Confidentiality.value 
		    | EstablishTrustInClient.value;
	} else {
	    targetRequires = getTargetRequires(desc);
	}

	return targetRequires ;
    }

    private org.omg.IOP.TaggedComponent createTlsSecTransComponent( 
	int targetSupports, int targetRequires, TransportAddress[] listTa ) {

	TLS_SEC_TRANS tls_sec = new TLS_SEC_TRANS(
	    (short)targetSupports, (short)targetRequires, listTa);

 	CDROutputObject out = (CDROutputObject) orb.create_output_stream();
 	out.putEndian() ; 
 	TLS_SEC_TRANSHelper.write((org.omg.CORBA.portable.OutputStream)out, tls_sec);

	byte[] buf = out.toByteArray() ;
	
	// create new Tagged Component for SSL
	org.omg.IOP.TaggedComponent tc = new org.omg.IOP.TaggedComponent(
			TAG_TLS_SEC_TRANS.value, buf ) ;
	return tc;
    }

    private TransportAddress[] generateTransportAddresses(
	int sslPort ) {

	String hostName = Utility.getLocalAddress();
	short shortPort = Utility.intToShort(sslPort);
	TransportAddress ta = new TransportAddress(hostName, shortPort);
	TransportAddress[] listTa = new TransportAddress[] { ta } ;

	return listTa;
    }

    private TransportAddress[] generateTransportAddresses( 
	List<SocketInfo> socketInfos ) {

        TransportAddress[] listTa = new TransportAddress[socketInfos.size()];
	for(int i=0; i<socketInfos.size(); i++){
            SocketInfo socketInfo = socketInfos.get(i);
            int sslport = socketInfo.port();
            String host = socketInfo.host();
            short short_port = Utility.intToShort(sslport);
            TransportAddress ta = new TransportAddress(host, short_port);
            listTa[i] = ta;
        }
	return listTa;
    }

    /**
     * Create the SSL tagged component within a compound mechanism
     * definition.
     */
    private org.omg.IOP.TaggedComponent createSSLInfo(
	int sslport, 
	EjbIORConfigurationDescriptor iorDesc, boolean sslRequired ) {

	int targetSupports = getTargetSupportsDefault( iorDesc ) ;
	int targetRequires = getTargetRequiresDefault( iorDesc, sslRequired ) ;
	boolean mutualAuthRequired = (iorDesc != null) &&
	    ((targetRequires & EstablishTrustInClient.value) ==
	     EstablishTrustInClient.value) ;
        int ssl_port = mutualAuthRequired ? sslMutualAuthPort : sslport; 
	
        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP: Creating Transport Mechanism for sslport "
		+ ssl_port );
        }

        /* 
         * if both targetSupports and targetRequires are zero, then the 
         * mechanism does not support a transport_mechanism and hence
         * a TAG_NULL_TAG must be generated.
         */

        if ( (targetSupports | targetRequires) == 0  || ssl_port == -1) {
	     return NULL_TAGGED_COMPONENT ;
	}

	TransportAddress[] listTa = generateTransportAddresses( ssl_port ) ;
	return createTlsSecTransComponent( targetSupports, targetRequires, listTa ) ;
    }

    private org.omg.IOP.TaggedComponent createSSLInfo(
	List<SocketInfo> socketInfos, 
        EjbIORConfigurationDescriptor iorDesc, boolean sslRequired ) {

	int targetSupports = getTargetSupportsDefault( iorDesc ) ;
	int targetRequires = getTargetRequiresDefault( iorDesc, sslRequired ) ;
	
        if(_logger.isLoggable(Level.FINE)){
            _logger.log(Level.FINE, "IIOP: Creating Transport Mechanism for socketInfos "
		+ socketInfos );
        }

        /* 
         * if both targetSupports and targetRequires are zero, then the 
         * mechanism does not support a transport_mechanism and hence
         * a TAG_NULL_TAG must be generated.
         */

        if ( (targetSupports | targetRequires) == 0 ) {
	     return NULL_TAGGED_COMPONENT ;
	}

	TransportAddress[] listTa = generateTransportAddresses(socketInfos);
	return createTlsSecTransComponent( targetSupports, targetRequires, listTa ) ;
    }

    /**
     * This method determines if all the mechanisms defined in the
     * CSIV2 CompoundSecMechList structure require protected 
     * invocations.
     */
    public boolean allMechanismsRequireSSL(Set iorDescSet) {
	int size = iorDescSet.size();
	if(size == 0) {
	    return false;
	}

	Iterator<EjbIORConfigurationDescriptor> itr = 
	    iorDescSet.iterator();

	for(int i = 0; i < size; i++) {
	    EjbIORConfigurationDescriptor iorDesc = itr.next();
            int target_requires = getTargetRequires(iorDesc);
	    if(target_requires == 0) {
		return false;
	    }
	}

	return true;
    }

    /**
     * Get the Compound security mechanism list from the given IOR.
     * @param the IOR.
     * @return the array of compound security mechanisms.
     */
    public CompoundSecMech[] getSecurityMechanisms(IOR ior) {
	IIOPProfile prof = ior.getProfile();
	IIOPProfileTemplate ptemp = (IIOPProfileTemplate)prof.
 			    getTaggedProfileTemplate();
	Iterator<TaggedComponent> itr = ptemp.iteratorById(
	    TAG_CSI_SEC_MECH_LIST.value);

	if(!itr.hasNext()) {
            if(_logger.isLoggable(Level.FINE)){
                String msg = "IIOP:TAG_CSI_SEC_MECH_LIST tagged component not found";
                _logger.log(Level.FINE, msg);
	    }
	    return null;
	}

	TaggedComponent tcomp = itr.next();
	if(_logger.isLoggable(Level.FINE)){
	    _logger.log(Level.FINE,"Component:" + tcomp);
	}

	if (itr.hasNext()) {
	    String msg = "More than one TAG_CSI_SEC_MECH_LIST tagged " + 
			 "component found ";
            _logger.log(Level.SEVERE,"iiop.many_tagged_component");
	    throw new RuntimeException(msg);
	}

	org.omg.IOP.TaggedComponent comp = tcomp.getIOPComponent(orb);
	byte[] b = comp.component_data;
	CDRInputObject in = (CDRInputObject) new EncapsInputStream(orb, b, b.length);
	in.consumeEndian();
	CompoundSecMechList l = CompoundSecMechListHelper.read(in);
	CompoundSecMech[] list = l.mechanism_list;

	return list;
    }

    /**
     * Retrieve the SSL tagged component from the compound security
     * mechanism.
     */
    public TLS_SEC_TRANS getSSLInformation(CompoundSecMech mech){
	org.omg.IOP.TaggedComponent pcomp = mech.transport_mech; 
	TLS_SEC_TRANS ssl = getSSLComponent(pcomp);
	return ssl;
    }
	
    private TLS_SEC_TRANS getSSLComponent(org.omg.IOP.TaggedComponent comp) {

	TLS_SEC_TRANS ssl = null;        
	
        // a TAG_NULL_TAG implies that SSL is not required
        if (comp.tag == TAG_NULL_TAG.value){
            ssl = null;
        } else {
            byte[] b = comp.component_data;
            CDRInputObject in = (CDRInputObject)  new EncapsInputStream(orb, b, b.length);
            in.consumeEndian();
            ssl = TLS_SEC_TRANSHelper.read(in);
        }

	return ssl;
    }
}

Other Glassfish examples (source code examples)

Here is a short list of links related to this Glassfish CSIV2TaggedComponentInfo.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.