You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2013/09/26 16:05:00 UTC
svn commit: r1526501 - in /lucene/dev/branches/branch_4x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/client/solrj/embedded/
solr/test-framework/ solr/test-framework/src/java/org/apache/solr/
Author: markrmiller
Date: Thu Sep 26 14:04:59 2013
New Revision: 1526501
URL: http://svn.apache.org/r1526501
Log:
SOLR-5274: Allow JettySolrRunner SSL config to be specified via a constructor.
Updating org.apache.httpcomponents above 4.2.2 causes tests using SSL to fail.
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/solr/ (props changed)
lucene/dev/branches/branch_4x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_4x/solr/core/ (props changed)
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
lucene/dev/branches/branch_4x/solr/test-framework/ (props changed)
lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1526501&r1=1526500&r2=1526501&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Thu Sep 26 14:04:59 2013
@@ -41,6 +41,9 @@ New Features
* SOLR-5246: Shard splitting now supports collections configured with router.field.
(shalin)
+
+* SOLR-5274: Allow JettySolrRunner SSL config to be specified via a constructor.
+ (Mark Miller)
Security
----------------------
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java?rev=1526501&r1=1526500&r2=1526501&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java Thu Sep 26 14:04:59 2013
@@ -42,24 +42,21 @@ import javax.servlet.http.HttpServletRes
import org.apache.solr.servlet.SolrDispatchFilter;
import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.GzipHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
+import org.eclipse.jetty.server.session.HashSessionIdManager;
import org.eclipse.jetty.server.ssl.SslConnector;
-import org.eclipse.jetty.server.ssl.SslSocketConnector;
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
-import org.eclipse.jetty.server.handler.GzipHandler;
-import org.eclipse.jetty.server.session.HashSessionIdManager;
+import org.eclipse.jetty.server.ssl.SslSocketConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.eclipse.jetty.util.thread.ThreadPool;
import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
/**
* Run solr using jetty
@@ -97,6 +94,8 @@ public class JettySolrRunner {
/** Maps servlet holders (i.e. factories: class + init params) to path specs */
private SortedMap<ServletHolder,String> extraServlets = new TreeMap<ServletHolder,String>();
+ private SSLConfig sslConfig;
+
public static class DebugFilter implements Filter {
public int requestsToKeep = 10;
private AtomicLong nRequests = new AtomicLong();
@@ -173,6 +172,25 @@ public class JettySolrRunner {
this.solrConfigFilename = solrConfigFilename;
this.schemaFilename = schemaFileName;
}
+
+ public JettySolrRunner(String solrHome, String context, int port,
+ String solrConfigFilename, String schemaFileName, boolean stopAtShutdown,
+ SortedMap<ServletHolder,String> extraServlets, SSLConfig sslConfig) {
+ if (null != extraServlets) { this.extraServlets.putAll(extraServlets); }
+ this.init(solrHome, context, port, stopAtShutdown);
+ this.solrConfigFilename = solrConfigFilename;
+ this.schemaFilename = schemaFileName;
+ this.sslConfig = sslConfig;
+ }
+
+ public static class SSLConfig {
+ public boolean useSsl;
+ public boolean clientAuth;
+ public String keyStore;
+ public String keyStorePassword;
+ public String trustStore;
+ public String trustStorePassword;
+ }
private void init(String solrHome, String context, int port, boolean stopAtShutdown) {
this.context = context;
@@ -190,34 +208,16 @@ public class JettySolrRunner {
// if this property is true, then jetty will be configured to use SSL
// leveraging the same system properties as java to specify
- // the keystore/truststore if they are set
+ // the keystore/truststore if they are set unless specific config
+ // is passed via the constructor.
//
// This means we will use the same truststore, keystore (and keys) for
// the server as well as any client actions taken by this JVM in
// talking to that server, but for the purposes of testing that should
// be good enough
- final boolean useSsl = Boolean.getBoolean("tests.jettySsl");
+ final boolean useSsl = sslConfig == null ? false : sslConfig.useSsl;
final SslContextFactory sslcontext = new SslContextFactory(false);
-
- if (useSsl) {
- if (null != System.getProperty("javax.net.ssl.keyStore")) {
- sslcontext.setKeyStorePath
- (System.getProperty("javax.net.ssl.keyStore"));
- }
- if (null != System.getProperty("javax.net.ssl.keyStorePassword")) {
- sslcontext.setKeyStorePassword
- (System.getProperty("javax.net.ssl.keyStorePassword"));
- }
- if (null != System.getProperty("javax.net.ssl.trustStore")) {
- sslcontext.setTrustStore
- (System.getProperty("javax.net.ssl.trustStore"));
- }
- if (null != System.getProperty("javax.net.ssl.trustStorePassword")) {
- sslcontext.setTrustStorePassword
- (System.getProperty("javax.net.ssl.trustStorePassword"));
- }
- sslcontext.setNeedClientAuth(Boolean.getBoolean("tests.jettySsl.clientAuth"));
- }
+ sslInit(useSsl, sslcontext);
final Connector connector;
final QueuedThreadPool threadPool;
@@ -328,6 +328,48 @@ public class JettySolrRunner {
}
+ private void sslInit(final boolean useSsl, final SslContextFactory sslcontext) {
+ if (useSsl && sslConfig != null) {
+ if (null != sslConfig.keyStore) {
+ sslcontext.setKeyStorePath(sslConfig.keyStore);
+ }
+ if (null != sslConfig.keyStorePassword) {
+ sslcontext.setKeyStorePassword(System
+ .getProperty("solr.javax.net.ssl.keyStorePassword"));
+ }
+ if (null != sslConfig.trustStore) {
+ sslcontext.setTrustStore(System
+ .getProperty("solr.javax.net.ssl.trustStore"));
+ }
+ if (null != sslConfig.trustStorePassword) {
+ sslcontext.setTrustStorePassword(sslConfig.trustStorePassword);
+ }
+ sslcontext.setNeedClientAuth(sslConfig.clientAuth);
+ } else {
+ boolean jettySsl = Boolean.getBoolean("tests.jettySsl");
+
+ if (jettySsl) {
+ if (null != System.getProperty("javax.net.ssl.keyStore")) {
+ sslcontext.setKeyStorePath
+ (System.getProperty("javax.net.ssl.keyStore"));
+ }
+ if (null != System.getProperty("javax.net.ssl.keyStorePassword")) {
+ sslcontext.setKeyStorePassword
+ (System.getProperty("javax.net.ssl.keyStorePassword"));
+ }
+ if (null != System.getProperty("javax.net.ssl.trustStore")) {
+ sslcontext.setTrustStore
+ (System.getProperty("javax.net.ssl.trustStore"));
+ }
+ if (null != System.getProperty("javax.net.ssl.trustStorePassword")) {
+ sslcontext.setTrustStorePassword
+ (System.getProperty("javax.net.ssl.trustStorePassword"));
+ }
+ sslcontext.setNeedClientAuth(Boolean.getBoolean("tests.jettySsl.clientAuth"));
+ }
+ }
+ }
+
public FilterHolder getDispatchFilter() {
return dispatchFilter;
}
Modified: lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java?rev=1526501&r1=1526500&r2=1526501&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java (original)
+++ lucene/dev/branches/branch_4x/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java Thu Sep 26 14:04:59 2013
@@ -18,14 +18,13 @@ package org.apache.solr;
*/
import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
import java.util.SortedMap;
import org.apache.commons.io.FileUtils;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner.SSLConfig;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.util.ExternalPaths;
import org.eclipse.jetty.servlet.ServletHolder;
@@ -44,20 +43,19 @@ abstract public class SolrJettyTestBase
// without breaking configs.
public String getSolrHome() { return ExternalPaths.EXAMPLE_HOME; }
- private static boolean manageSslProps = true;
private static File TEST_KEYSTORE;
- private static final Map<String,String> SSL_PROPS = new HashMap<String,String>();
static {
TEST_KEYSTORE = (null == ExternalPaths.SOURCE_HOME)
? null : new File(ExternalPaths.SOURCE_HOME, "example/etc/solrtest.keystore");
- String keystorePath = null == TEST_KEYSTORE ? null : TEST_KEYSTORE.getAbsolutePath();
+ }
- SSL_PROPS.put("tests.jettySsl","false");
- SSL_PROPS.put("tests.jettySsl.clientAuth","false");
- SSL_PROPS.put("javax.net.ssl.keyStore", keystorePath);
- SSL_PROPS.put("javax.net.ssl.keyStorePassword","secret");
- SSL_PROPS.put("javax.net.ssl.trustStore", keystorePath);
- SSL_PROPS.put("javax.net.ssl.trustStorePassword","secret");
+ private static void initSSLConfig(SSLConfig sslConfig, String keystorePath) {
+ sslConfig.useSsl = false;
+ sslConfig.clientAuth = false;
+ sslConfig.keyStore = keystorePath;
+ sslConfig.keyStorePassword = "secret";
+ sslConfig.trustStore = keystorePath;
+ sslConfig.trustStorePassword = "secret";
}
/**
@@ -74,46 +72,43 @@ abstract public class SolrJettyTestBase
@BeforeClass
public static void beforeSolrJettyTestBase() throws Exception {
- // consume the same amount of random no matter what
- final boolean trySsl = random().nextBoolean();
- final boolean trySslClientAuth = random().nextBoolean();
+
// only randomize SSL if we are a solr test with access to the example keystore
if (null == getExampleKeystoreFile()) {
log.info("Solr's example keystore not defined (not a solr test?) skipping SSL randomization");
- manageSslProps = false;
return;
}
assertTrue("test keystore does not exist, randomized ssl testing broken: " +
getExampleKeystoreFile().getAbsolutePath(),
getExampleKeystoreFile().exists() );
-
- // only randomize SSL if none of the SSL_PROPS are already set
- final Map<Object,Object> sysprops = System.getProperties();
- for (String prop : SSL_PROPS.keySet()) {
- if (sysprops.containsKey(prop)) {
- log.info("System property explicitly set, so skipping randomized ssl properties: " + prop);
- manageSslProps = false;
- return;
- }
- }
- if (manageSslProps) {
- log.info("Randomized ssl ({}) and clientAuth ({})", trySsl, trySslClientAuth);
- for (String prop : SSL_PROPS.keySet()) {
- System.setProperty(prop, SSL_PROPS.get(prop));
- }
- // now explicitly re-set the two random values
- System.setProperty("tests.jettySsl", String.valueOf(trySsl));
- System.setProperty("tests.jettySsl.clientAuth", String.valueOf(trySslClientAuth));
- }
}
public static JettySolrRunner jetty;
public static int port;
public static SolrServer server = null;
public static String context;
+
+ public static SSLConfig getSSLConfig() {
+ SSLConfig sslConfig = new SSLConfig();
+
+ final boolean trySsl = random().nextBoolean();
+ final boolean trySslClientAuth = random().nextBoolean();
+
+ log.info("Randomized ssl ({}) and clientAuth ({})", trySsl,
+ trySslClientAuth);
+ String keystorePath = null == TEST_KEYSTORE ? null : TEST_KEYSTORE
+ .getAbsolutePath();
+ initSSLConfig(sslConfig, keystorePath);
+
+ sslConfig.useSsl = trySsl;
+ sslConfig.clientAuth = trySslClientAuth;
+
+ initSSLConfig(sslConfig, keystorePath);
+ return sslConfig;
+ }
public static JettySolrRunner createJetty(String solrHome, String configFile, String schemaFile, String context,
boolean stopAtShutdown, SortedMap<ServletHolder,String> extraServlets)
@@ -128,7 +123,7 @@ abstract public class SolrJettyTestBase
context = context==null ? "/solr" : context;
SolrJettyTestBase.context = context;
- jetty = new JettySolrRunner(solrHome, context, 0, configFile, schemaFile, stopAtShutdown, extraServlets);
+ jetty = new JettySolrRunner(solrHome, context, 0, configFile, schemaFile, stopAtShutdown, extraServlets, getSSLConfig());
jetty.start();
port = jetty.getLocalPort();
@@ -148,11 +143,6 @@ abstract public class SolrJettyTestBase
jetty = null;
}
server = null;
- if (manageSslProps) {
- for (String prop : SSL_PROPS.keySet()) {
- System.clearProperty(prop);
- }
- }
}