mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

lutoff
19.58.2006 e5bf2a8578b2316d866a45f93b259570c687b10b
Pb description (issue #648):
The Jmx connector handler is starting a local RMI registry on port 1689 (actually the port specified in the config.ldif file). Even if you stop the DS server, but if the process is keeping alive, the RMI registry will remain active and will still listen on this port.

Fix:
Instead of using the default factory to get the RMI registry, we use our own socketFactory and keep a reference to the created socket. At server shutdown time, this socket is closed and the RMI registry Remote Object is 'unexported'

Modified Class
org.opends.server.protocols.jmx.RmiConnector

New Class
org.opends.server.protocols.jmx.OpendsRmiServerSocketFactory
1 files added
1 files modified
140 ■■■■■ changed files
opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java 90 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java 50 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java
New file
@@ -0,0 +1,90 @@
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006 Sun Microsystems, Inc.
 */
package org.opends.server.protocols.jmx;
import java.io.IOException;
import java.net.ServerSocket;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.RMISocketFactory;
/**
 * The RMI connector class starts and stops the JMX RMI connector server.
 * There are 2 different connector servers
 * <ul>
 * <li> the RMI Client connector server, supporting TLS-encrypted.
 * communication, server authentication by certificate and client
 * authentication by providing appropriate LDAP credentials through
 * SASL/PLAIN.
 * <li> the RMI client connector server, supporting TLS-encrypted
 * communication, server authentication by certificate, client
 * authentication by certificate and identity assertion through SASL/PLAIN.
 * </ul>
 * <p>
 * Each connector is registered into the JMX MBean server.
 */
/**
 * An implementation of the socketServer.
 */
public class OpendsRmiServerSocketFactory implements RMIServerSocketFactory
{
  /**
   * The Plaform RMISocketFactory.
   */
  private RMIServerSocketFactory ssf =
    RMISocketFactory.getDefaultSocketFactory() ;
  /*
   * The Created ServerSocket.
   */
  ServerSocket serverSocket ;
  /**
   *  Create a server socket on the specified port
   *  (port 0 indicates an anonymous port).
   *  @param port the port number
   *  @return the server socket on the specified port
   *  @throws IOException if an I/O error occurs during server socket creation
   */
  public ServerSocket  createServerSocket(int port)  throws IOException
  {
    serverSocket = ssf.createServerSocket(port) ;
    return serverSocket ;
  }
  /**
   * Close the underlying socket.
   *
   * @throws IOException If an I/O error occurs when closing the socket.
   */
  protected void close() throws IOException
  {
    serverSocket.close() ;
  }
}
opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java
@@ -26,9 +26,13 @@
 */
package org.opends.server.protocols.jmx;
import java.io.IOException;
import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMISocketFactory;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import javax.net.ssl.SSLSocketFactory;
@@ -116,6 +120,16 @@
   */
  private RmiAuthenticator rmiAuthenticator;
  /**
   * The reference to the created RMI registry.
   */
  private Registry registry = null;
  /**
   * The Underlying Socket factory.
   */
  OpendsRmiServerSocketFactory rmiSsf;
  // ===================================================================
  // CONSTRUCTOR
  // ===================================================================
@@ -210,8 +224,12 @@
    {
      //
      // TODO Not yet implemented: If the host has several interfaces
      LocateRegistry.createRegistry(registryPort);
      if (registry == null)
      {
        rmiSsf = new OpendsRmiServerSocketFactory();
        registry = LocateRegistry.createRegistry(registryPort,
            RMISocketFactory.getDefaultSocketFactory(), rmiSsf);
      }
    }
    catch (RemoteException re)
    {
@@ -232,6 +250,7 @@
        //
        // 'ping' the registry
        reg.list();
        registry = reg;
      }
      catch (Exception e)
      {
@@ -455,7 +474,34 @@
    }
    catch (Exception e)
    {
      // TODO Log an error message
      assert debugException(CLASS_NAME, "finalizeConnectionHandler", e);
    }
    //
    // Stop the RMI registry
    try
    {
      UnicastRemoteObject.unexportObject(registry, true);
    }
    catch (NoSuchObjectException e)
    {
      // TODO Log an error message
      assert debugException(CLASS_NAME, "finalizeConnectionHandler", e);
    }
    registry = null;
    //
    // Close the socket
    try
    {
      rmiSsf.close();
    }
    catch (IOException e)
    {
      // TODO Log an error message
      assert debugException(CLASS_NAME, "finalizeConnectionHandler", e);
    }
  }
}