Package com.sun.enterprise.iiop.security

Source Code of com.sun.enterprise.iiop.security.CSIV2TaggedComponentInfo$DescriptorMaker

/*
* 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) == || 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 = (CDRInputObjectnew EncapsInputStream(orb, b, b.length);
            in.consumeEndian();
            ssl = TLS_SEC_TRANSHelper.read(in);
        }

  return ssl;
    }
}
TOP

Related Classes of com.sun.enterprise.iiop.security.CSIV2TaggedComponentInfo$DescriptorMaker

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.