/**
   * Create an SSL server socket at the specified InetSocketAddress. If the type is SSL_MUTUALAUTH
   * then SSL client authentication is requested.
   */
  private ServerSocket createSSLServerSocket(String type, InetSocketAddress inetSocketAddress)
      throws IOException {

    if (inetSocketAddress == null) {
      throw new IOException(getFormatMessage("iiop.invalid_sslserverport", new Object[] {null}));
    }
    int port = inetSocketAddress.getPort();
    Integer iport = new Integer(port);
    SSLInfo sslInfo = (SSLInfo) portToSSLInfo.get(iport);
    if (sslInfo == null) {
      throw new IOException(getFormatMessage("iiop.invalid_sslserverport", new Object[] {iport}));
    }
    SSLServerSocketFactory ssf = sslInfo.getContext().getServerSocketFactory();
    String[] ssl3TlsCiphers = sslInfo.getSsl3TlsCiphers();
    String[] ssl2Ciphers = sslInfo.getSsl2Ciphers();
    String[] ciphers = null;
    if (ssl3TlsCiphers != null || ssl2Ciphers != null) {
      String[] socketCiphers = ssf.getDefaultCipherSuites();
      ciphers = mergeCiphers(socketCiphers, ssl3TlsCiphers, ssl2Ciphers);
    }

    String cs[] = null;

    if (_logger.isLoggable(Level.FINE)) {
      cs = ssf.getSupportedCipherSuites();
      for (int i = 0; i < cs.length; ++i) {
        _logger.log(Level.FINE, "Cipher Suite: " + cs[i]);
      }
    }
    ServerSocket ss = null;
    try {
      // bugfix for 6349541
      // specify the ip address to bind to, 50 is the default used
      // by the ssf implementation when only the port is specified
      ss = ssf.createServerSocket(port, BACKLOG, inetSocketAddress.getAddress());
      if (ciphers != null) {
        ((SSLServerSocket) ss).setEnabledCipherSuites(ciphers);
      }
    } catch (IOException e) {
      _logger.log(
          Level.SEVERE, "iiop.createsocket_exception", new Object[] {type, String.valueOf(port)});
      _logger.log(Level.SEVERE, "", e);
      throw e;
    }

    try {
      if (type.equals(SSL_MUTUALAUTH)) {
        _logger.log(Level.FINE, "Setting Mutual auth");
        ((SSLServerSocket) ss).setNeedClientAuth(true);
      }
    } catch (Exception e) {
      _logger.log(Level.SEVERE, "iiop.cipher_exception", e);
      throw new IOException(e.getMessage());
    }
    if (_logger.isLoggable(Level.FINE)) {
      _logger.log(Level.FINE, "Created server socket:" + ss);
    }
    return ss;
  }
 public boolean authorize(
     SSLInfo info, Ice.StringHolder reason, java.util.Map<String, String> __ctx)
     throws IceInternal.LocalExceptionWrapper {
   IceInternal.Outgoing __og =
       __handler.getOutgoing("authorize", Ice.OperationMode.Nonmutating, __ctx);
   try {
     try {
       IceInternal.BasicStream __os = __og.os();
       info.__write(__os);
     } catch (Ice.LocalException __ex) {
       __og.abort(__ex);
     }
     boolean __ok = __og.invoke();
     try {
       if (!__ok) {
         try {
           __og.throwUserException();
         } catch (Ice.UserException __ex) {
           throw new Ice.UnknownUserException(__ex.ice_name());
         }
       }
       IceInternal.BasicStream __is = __og.is();
       __is.startReadEncaps();
       reason.value = __is.readString();
       boolean __ret;
       __ret = __is.readBool();
       __is.endReadEncaps();
       return __ret;
     } catch (Ice.LocalException __ex) {
       throw new IceInternal.LocalExceptionWrapper(__ex, false);
     }
   } finally {
     __handler.reclaimOutgoing(__og);
   }
 }
  /**
   * Create an SSL socket at the specified host and port.
   *
   * @param the host
   * @param the port
   * @return the socket.
   */
  private Socket createSSLSocket(String host, int port) throws IOException {

    SSLSocket socket = null;
    SSLSocketFactory factory = null;
    try {
      // get socketfactory+sanity check
      // clientSslInfo is never null
      factory = clientSslInfo.getContext().getSocketFactory();

      if (_logger.isLoggable(Level.FINE)) {
        _logger.log(Level.FINE, "Creating SSL Socket for host:" + host + " port:" + port);
      }
      String[] ssl3TlsCiphers = clientSslInfo.getSsl3TlsCiphers();
      String[] ssl2Ciphers = clientSslInfo.getSsl2Ciphers();
      String[] clientCiphers = null;
      if (ssl3TlsCiphers != null || ssl2Ciphers != null) {
        String[] socketCiphers = factory.getDefaultCipherSuites();
        clientCiphers = mergeCiphers(socketCiphers, ssl3TlsCiphers, ssl2Ciphers);
      }

      socket = (SSLSocket) factory.createSocket(host, port);
      if (clientCiphers != null) {
        socket.setEnabledCipherSuites(clientCiphers);
      }
    } catch (Exception e) {
      if (_logger.isLoggable(Level.FINE)) {
        _logger.log(
            Level.FINE, "iiop.createsocket_exception", new Object[] {host, String.valueOf(port)});
        _logger.log(Level.FINE, "", e);
      }
      IOException e2 =
          new IOException("Error opening SSL socket to host=" + host + " port=" + port);
      e2.initCause(e);
      throw e2;
    }
    return socket;
  }