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);
-      }
-    }
   }