From 8b0548aacc6b871ef799aa81632aa37bd351b4ec Mon Sep 17 00:00:00 2001
From: Kevin Risden <risdenk@users.noreply.github.com>
Date: Wed, 11 Jan 2017 09:09:48 -0600
Subject: [PATCH] [solr,solr6] Add support for Kerberized Solr (#887)

---
 solr/pom.xml                                             | 6 ++++++
 .../src/main/java/com/yahoo/ycsb/db/solr/SolrClient.java | 9 +++++++++
 solr6/pom.xml                                            | 6 ++++++
 .../main/java/com/yahoo/ycsb/db/solr6/SolrClient.java    | 8 ++++++++
 4 files changed, 29 insertions(+)

diff --git a/solr/pom.xml b/solr/pom.xml
index a97baeb2..a8d18bed 100644
--- a/solr/pom.xml
+++ b/solr/pom.xml
@@ -48,6 +48,12 @@ LICENSE file.
       <artifactId>solr-solrj</artifactId>
       <version>${solr.version}</version>
     </dependency>
+    <!-- commons-codec required for Solr Kerberos support -->
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.10</version>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
diff --git a/solr/src/main/java/com/yahoo/ycsb/db/solr/SolrClient.java b/solr/src/main/java/com/yahoo/ycsb/db/solr/SolrClient.java
index f6a78e91..4232221b 100644
--- a/solr/src/main/java/com/yahoo/ycsb/db/solr/SolrClient.java
+++ b/solr/src/main/java/com/yahoo/ycsb/db/solr/SolrClient.java
@@ -25,7 +25,9 @@ import com.yahoo.ycsb.StringByteIterator;
 
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -71,6 +73,13 @@ public class SolrClient extends DB {
         .parseInt(props.getProperty("solr.commit.within.time", DEFAULT_COMMIT_WITHIN_TIME));
     batchMode = Boolean.parseBoolean(props.getProperty("solr.batch.mode", DEFAULT_BATCH_MODE));
 
+
+    String jaasConfPath = props.getProperty("solr.jaas.conf.path");
+    if(jaasConfPath != null) {
+      System.setProperty("java.security.auth.login.config", jaasConfPath);
+      HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());
+    }
+
     // Check if Solr cluster is running in SolrCloud or Stand-alone mode
     Boolean cloudMode = Boolean.parseBoolean(props.getProperty("solr.cloud", DEFAULT_CLOUD_MODE));
     System.err.println("Solr Cloud Mode = " + cloudMode);
diff --git a/solr6/pom.xml b/solr6/pom.xml
index d4f947d1..42cd4e5a 100644
--- a/solr6/pom.xml
+++ b/solr6/pom.xml
@@ -48,6 +48,12 @@ LICENSE file.
       <artifactId>solr-solrj</artifactId>
       <version>${solr6.version}</version>
     </dependency>
+    <!-- commons-codec required for Solr Kerberos support -->
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.10</version>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
diff --git a/solr6/src/main/java/com/yahoo/ycsb/db/solr6/SolrClient.java b/solr6/src/main/java/com/yahoo/ycsb/db/solr6/SolrClient.java
index 0f18fa21..50346b78 100644
--- a/solr6/src/main/java/com/yahoo/ycsb/db/solr6/SolrClient.java
+++ b/solr6/src/main/java/com/yahoo/ycsb/db/solr6/SolrClient.java
@@ -25,7 +25,9 @@ import com.yahoo.ycsb.StringByteIterator;
 
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -71,6 +73,12 @@ public class SolrClient extends DB {
         .parseInt(props.getProperty("solr.commit.within.time", DEFAULT_COMMIT_WITHIN_TIME));
     batchMode = Boolean.parseBoolean(props.getProperty("solr.batch.mode", DEFAULT_BATCH_MODE));
 
+    String jaasConfPath = props.getProperty("solr.jaas.conf.path");
+    if(jaasConfPath != null) {
+      System.setProperty("java.security.auth.login.config", jaasConfPath);
+      HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());
+    }
+
     // Check if Solr cluster is running in SolrCloud or Stand-alone mode
     Boolean cloudMode = Boolean.parseBoolean(props.getProperty("solr.cloud", DEFAULT_CLOUD_MODE));
     System.err.println("Solr Cloud Mode = " + cloudMode);
-- 
GitLab