Index: lucene/common-build.xml =================================================================== --- lucene/common-build.xml (revision 1378491) +++ lucene/common-build.xml (working copy) @@ -796,6 +796,11 @@ + + + + + Index: lucene/tools/junit4/tests.policy =================================================================== --- lucene/tools/junit4/tests.policy (revision 0) +++ lucene/tools/junit4/tests.policy (working copy) @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Policy file to prevent tests from writing outside the test sandbox directory +// (must be given as a sysprop: tests.sandbox.dir) +// This policy also disallows stuff like listening on network ports of interfaces +// different than 127.0.0.1. + +// PLEASE NOTE: You may need to enable other permissions when new tests are added, +// everything not allowed here is forbidden! + +grant { + permission java.io.FilePermission "<>", "read,execute"; + permission java.io.FilePermission "${tests.sandbox.dir}${/}-", "read,execute,write,delete"; + permission java.net.SocketPermission "127.0.0.1:1024-", "accept,listen"; + permission java.net.SocketPermission "*", "connect,resolve"; + permission java.util.PropertyPermission "*", "read,write"; + permission java.lang.reflect.ReflectPermission "*"; + permission java.lang.RuntimePermission "*"; + + // Solr needs those: + permission java.net.NetPermission "*"; + permission java.util.logging.LoggingPermission "control"; + permission java.lang.management.ManagementPermission "monitor"; + permission javax.management.MBeanPermission "*", "*"; + permission javax.management.MBeanServerPermission "*"; + permission javax.management.MBeanTrustPermission "*"; + + // TIKA uses BouncyCastle and that registers new provider for PDF parsing + MSOffice parsing. Maybe report as bug! + permission java.security.SecurityPermission "putProviderProperty.BC"; + permission java.security.SecurityPermission "insertProvider.BC"; +}; Index: lucene/tools/junit4/tests.policy =================================================================== --- lucene/tools/junit4/tests.policy (revision 0) +++ lucene/tools/junit4/tests.policy (working copy) Property changes on: lucene/tools/junit4/tests.policy ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java =================================================================== --- solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java (revision 1378491) +++ solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java (working copy) @@ -61,6 +61,13 @@ public JmxMonitoredMap(String coreName, String coreHashCode, final JmxConfiguration jmxConfig) { + this(coreName, coreHashCode, jmxConfig, null); + } + + // TODO: Make public? Move Map env to environment? + // Currently the map is needed to bind to localhost + JmxMonitoredMap(String coreName, String coreHashCode, + final JmxConfiguration jmxConfig, Map env) { this.coreHashCode = coreHashCode; jmxRootName = (null != jmxConfig.rootName ? jmxConfig.rootName @@ -94,7 +101,7 @@ server = MBeanServerFactory.newMBeanServer(); JMXConnectorServer connector = JMXConnectorServerFactory .newJMXConnectorServer(new JMXServiceURL(jmxConfig.serviceUrl), - null, server); + env, server); connector.start(); LOG.info("JMX monitoring is enabled at " + jmxConfig.serviceUrl); } catch (Exception e) { Index: solr/core/src/test/org/apache/solr/core/TestJmxMonitoredMap.java =================================================================== --- solr/core/src/test/org/apache/solr/core/TestJmxMonitoredMap.java (revision 1378491) +++ solr/core/src/test/org/apache/solr/core/TestJmxMonitoredMap.java (working copy) @@ -30,10 +30,15 @@ import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; +import javax.management.remote.rmi.RMIConnectorServer; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; import java.net.ServerSocket; import java.net.URL; -import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; +import java.rmi.server.RMIServerSocketFactory; +import java.util.Collections; import java.util.Set; import static org.hamcrest.CoreMatchers.allOf; @@ -61,33 +66,38 @@ public void setUp() throws Exception { super.setUp(); - - int retries = 5; - for (int i = 0; i < retries; i++) { - try { - ServerSocket server = new ServerSocket(0); - try { - port = server.getLocalPort(); - } finally { - server.close(); + String oldHost = System.getProperty("java.rmi.server.hostname"); + try { + // this stupid sysprop thing is needed, because remote stubs use the + // hostname to connect, which does not work with server bound to 127.0.0.1 + // See: http://weblogs.java.net/blog/emcmanus/archive/2006/12/multihomed_comp.html + System.setProperty("java.rmi.server.hostname", "127.0.0.1"); + class LocalhostRMIServerSocketFactory implements RMIServerSocketFactory { + ServerSocket socket; + + @Override + public ServerSocket createServerSocket(int port) throws IOException { + socket = new ServerSocket(); + socket.bind(new InetSocketAddress("127.0.0.1", port)); + return socket; } - // System.out.println("Using port: " + port); - try { - LocateRegistry.createRegistry(port); - } catch (RemoteException e) { - throw e; - } - String url = "service:jmx:rmi:///jndi/rmi://:" + port + "/solrjmx"; - JmxConfiguration config = new JmxConfiguration(true, null, url, null); - monitoredMap = new JmxMonitoredMap("", "", config); - JMXServiceURL u = new JMXServiceURL(url); - connector = JMXConnectorFactory.connect(u); - mbeanServer = connector.getMBeanServerConnection(); - break; - } catch (Exception e) { - if(retries == (i + 1)) { - throw e; - } + }; + LocalhostRMIServerSocketFactory factory = new LocalhostRMIServerSocketFactory(); + LocateRegistry.createRegistry(0, null, factory); + port = factory.socket.getLocalPort(); + //System.out.println("Using port: " + port); + String url = "service:jmx:rmi://127.0.0.1:"+port+"/jndi/rmi://127.0.0.1:"+port+"/solrjmx"; + JmxConfiguration config = new JmxConfiguration(true, null, url, null); + monitoredMap = new JmxMonitoredMap("", "", config, + Collections.singletonMap(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, factory)); + JMXServiceURL u = new JMXServiceURL(url); + connector = JMXConnectorFactory.connect(u); + mbeanServer = connector.getMBeanServerConnection(); + } finally { + if (oldHost == null) { + System.clearProperty("java.rmi.server.hostname"); + } else { + System.setProperty("java.rmi.server.hostname", oldHost); } } }