From e5bf2a8578b2316d866a45f93b259570c687b10b Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Tue, 19 Sep 2006 06:58:32 +0000
Subject: [PATCH] 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.

---
 opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java                 |   50 ++++++++++++++++
 opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java |   90 ++++++++++++++++++++++++++++++
 2 files changed, 138 insertions(+), 2 deletions(-)

diff --git a/opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java b/opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java
new file mode 100644
index 0000000..84dd218
--- /dev/null
+++ b/opends/src/server/org/opends/server/protocols/jmx/OpendsRmiServerSocketFactory.java
@@ -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() ;
+  }
+}
diff --git a/opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java b/opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java
index 4e5c15e..4fe039a 100644
--- a/opends/src/server/org/opends/server/protocols/jmx/RmiConnector.java
+++ b/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);
+    }
+
   }
 }

--
Gitblit v1.10.0