jdk/test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation3Test.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/remote/mandatory/subjectDelegation/SubjectDelegation3Test.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6261831
+ * @summary Tests the use of the subject delegation feature on the authenticated
+ *          principals within the RMI connector server's creator codebase with
+ *          subject delegation.
+ * @author Luis-Miguel Alventosa
+ * @run clean SubjectDelegation3Test SimpleStandard SimpleStandardMBean
+ * @run build SubjectDelegation3Test SimpleStandard SimpleStandardMBean
+ * @run main SubjectDelegation3Test policy31 ok
+ * @run main SubjectDelegation3Test policy32 ko
+ * @run main SubjectDelegation3Test policy33 ko
+ * @run main SubjectDelegation3Test policy34 ok
+ * @run main SubjectDelegation3Test policy35 ko
+ */
+
+import com.sun.jmx.remote.security.JMXPluggableAuthenticator;
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Properties;
+import javax.management.Attribute;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerConnection;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXPrincipal;
+import javax.management.remote.JMXServiceURL;
+import javax.security.auth.Subject;
+
+public class SubjectDelegation3Test {
+
+    public static void main(String[] args) throws Exception {
+        // Check for supported operating systems: Solaris
+        //
+        // This test runs only on Solaris due to CR 6285916
+        //
+        String osName = System.getProperty("os.name");
+        System.out.println("os.name = " + osName);
+        if (!osName.equals("SunOS")) {
+            System.out.println("This test runs on Solaris only.");
+            System.out.println("Bye! Bye!");
+            return;
+        }
+        String policyFile = args[0];
+        String testResult = args[1];
+        System.out.println("Policy file = " + policyFile);
+        System.out.println("Expected test result = " + testResult);
+        JMXConnectorServer jmxcs = null;
+        JMXConnector jmxc = null;
+        try {
+            // Create an RMI registry
+            //
+            System.out.println("Start RMI registry...");
+            Registry reg = null;
+            int port = 5800;
+            while (port++ < 6000) {
+                try {
+                    reg = LocateRegistry.createRegistry(port);
+                    System.out.println("RMI registry running on port " + port);
+                    break;
+                } catch (RemoteException e) {
+                    // Failed to create RMI registry...
+                    System.out.println("Failed to create RMI registry " +
+                                       "on port " + port);
+                }
+            }
+            if (reg == null) {
+                System.exit(1);
+            }
+            // Set the default password file
+            //
+            final String passwordFile = System.getProperty("test.src") +
+                File.separator + "jmxremote.password";
+            System.out.println("Password file = " + passwordFile);
+            // Set policy file
+            //
+            final String policy = System.getProperty("test.src") +
+                File.separator + policyFile;
+            System.out.println("PolicyFile = " + policy);
+            System.setProperty("java.security.policy", policy);
+            // Instantiate the MBean server
+            //
+            System.out.println("Create the MBean server");
+            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            // Register the SimpleStandardMBean
+            //
+            System.out.println("Create SimpleStandard MBean");
+            SimpleStandard s = new SimpleStandard("delegate");
+            mbs.registerMBean(s, new ObjectName("MBeans:type=SimpleStandard"));
+            // Set Security Manager
+            //
+            System.setSecurityManager(new SecurityManager());
+            // Create Properties containing the username/password entries
+            //
+            Properties props = new Properties();
+            props.setProperty("jmx.remote.x.password.file", passwordFile);
+            // Initialize environment map to be passed to the connector server
+            //
+            System.out.println("Initialize environment map");
+            HashMap env = new HashMap();
+            env.put("jmx.remote.authenticator",
+                    new JMXPluggableAuthenticator(props));
+            // Create an RMI connector server
+            //
+            System.out.println("Create an RMI connector server");
+            JMXServiceURL url =
+                new JMXServiceURL("rmi", null, 0,
+                                  "/jndi/rmi://:" + port + "/server" + port);
+            jmxcs =
+                JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
+            jmxcs.start();
+            // Create an RMI connector client
+            //
+            System.out.println("Create an RMI connector client");
+            HashMap cli_env = new HashMap();
+            // These credentials must match those in the default password file
+            //
+            String[] credentials = new String[] { "monitorRole" , "QED" };
+            cli_env.put("jmx.remote.credentials", credentials);
+            jmxc = JMXConnectorFactory.connect(url, cli_env);
+            Subject delegationSubject =
+                new Subject(true,
+                            Collections.singleton(new JMXPrincipal("delegate")),
+                            Collections.EMPTY_SET,
+                            Collections.EMPTY_SET);
+            MBeanServerConnection mbsc =
+                jmxc.getMBeanServerConnection(delegationSubject);
+            // Get domains from MBeanServer
+            //
+            System.out.println("Domains:");
+            String domains[] = mbsc.getDomains();
+            for (int i = 0; i < domains.length; i++) {
+                System.out.println("\tDomain[" + i + "] = " + domains[i]);
+            }
+            // Get MBean count
+            //
+            System.out.println("MBean count = " + mbsc.getMBeanCount());
+            // Get State attribute
+            //
+            String oldState =
+                (String) mbsc.getAttribute(
+                              new ObjectName("MBeans:type=SimpleStandard"),
+                              "State");
+            System.out.println("Old State = \"" + oldState + "\"");
+            // Set State attribute
+            //
+            System.out.println("Set State to \"changed state\"");
+            mbsc.setAttribute(new ObjectName("MBeans:type=SimpleStandard"),
+                              new Attribute("State", "changed state"));
+            // Get State attribute
+            //
+            String newState =
+                (String) mbsc.getAttribute(
+                              new ObjectName("MBeans:type=SimpleStandard"),
+                              "State");
+            System.out.println("New State = \"" + newState + "\"");
+            if (!newState.equals("changed state")) {
+                System.out.println("Invalid State = \"" + newState + "\"");
+                System.exit(1);
+            }
+            // Add notification listener on SimpleStandard MBean
+            //
+            System.out.println("Add notification listener...");
+            mbsc.addNotificationListener(
+                 new ObjectName("MBeans:type=SimpleStandard"),
+                 new NotificationListener() {
+                     public void handleNotification(Notification notification,
+                                                    Object handback) {
+                         System.out.println("Received notification: " +
+                                            notification);
+                     }
+                 },
+                 null,
+                 null);
+            // Unregister SimpleStandard MBean
+            //
+            System.out.println("Unregister SimpleStandard MBean...");
+            mbsc.unregisterMBean(new ObjectName("MBeans:type=SimpleStandard"));
+        } catch (SecurityException e) {
+            if (testResult.equals("ko")) {
+                System.out.println("Got expected security exception = " + e);
+            } else {
+                System.out.println("Got unexpected security exception = " + e);
+                e.printStackTrace();
+                throw e;
+            }
+        } catch (Exception e) {
+            System.out.println("Unexpected exception caught = " + e);
+            e.printStackTrace();
+            throw e;
+        } finally {
+            // Close connector client
+            //
+            if (jmxc != null)
+                jmxc.close();
+            // Stop connector server
+            //
+            if (jmxcs != null)
+                jmxcs.stop();
+            // Say goodbye
+            //
+            System.out.println("Bye! Bye!");
+        }
+    }
+}