This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch camel-2.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-2.x by this push: new d523a9f CAMEL-13747: Added basic auth support to camel-solr d523a9f is described below commit d523a9fca3613054f9585a19bac6d5f194566ad7 Author: Soner Koksal <soner.kok...@arvato.com> AuthorDate: Thu Jul 11 16:14:20 2019 +0300 CAMEL-13747: Added basic auth support to camel-solr --- .../camel-solr/src/main/docs/solr-component.adoc | 4 +- .../apache/camel/component/solr/SolrEndpoint.java | 26 ++++++++++++ .../apache/camel/component/solr/SolrProducer.java | 47 +++++++++++++++++----- .../camel/component/solr/InitSolrEndpointTest.java | 3 +- .../component/solr/SolrComponentTestSupport.java | 5 ++- .../apache/camel/component/solr/SolrFixtures.java | 26 +++++++----- .../src/test/resources/solr/security.json | 13 ++++++ 7 files changed, 99 insertions(+), 25 deletions(-) diff --git a/components/camel-solr/src/main/docs/solr-component.adoc b/components/camel-solr/src/main/docs/solr-component.adoc index 453836e..4e67e14 100644 --- a/components/camel-solr/src/main/docs/solr-component.adoc +++ b/components/camel-solr/src/main/docs/solr-component.adoc @@ -59,7 +59,7 @@ with the following path and query parameters: |=== -==== Query Parameters (13 parameters): +==== Query Parameters (15 parameters): [width="100%",cols="2,5,^1,2",options="header"] @@ -76,6 +76,8 @@ with the following path and query parameters: | *streamingQueueSize* (producer) | Set the queue size for the StreamingUpdateSolrServer | 10 | int | *streamingThreadCount* (producer) | Set the number of threads for the StreamingUpdateSolrServer | 2 | int | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean +| *password* (security) | Sets password for basic auth plugin enabled servers | | String +| *username* (security) | Sets username for basic auth plugin enabled servers | | String | *collection* (solrCloud) | Set the collection name which the solrCloud server could use | | String | *zkHost* (solrCloud) | Set the ZooKeeper host information which the solrCloud could use, such as zkhost=localhost:8123. | | String |=== diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java index 57cbeb2..4abc62d 100644 --- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java +++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java @@ -67,6 +67,10 @@ public class SolrEndpoint extends DefaultEndpoint { private String collection; @UriParam private String requestHandler; + @UriParam(label = "security", secret = true) + private String username; + @UriParam(label = "security", secret = true) + private String password; public SolrEndpoint(String endpointUri, SolrComponent component, String address) throws Exception { super(endpointUri, component); @@ -278,4 +282,26 @@ public class SolrEndpoint extends DefaultEndpoint { this.allowCompression = allowCompression; } + public String getUsername() { + return username; + } + + /** + * Sets username for basic auth plugin enabled servers + */ + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + /** + * Sets password for basic auth plugin enabled servers + */ + public void setPassword(String password) { + this.password = password; + } + } diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java index 2a662d6..97c24d9 100644 --- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java +++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java @@ -20,7 +20,7 @@ import java.io.File; import java.util.Collection; import java.util.List; import java.util.Map; - +import java.util.stream.Collectors; import javax.activation.MimetypesFileTypeMap; import org.apache.camel.Exchange; @@ -28,6 +28,7 @@ import org.apache.camel.WrappedFile; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.ObjectHelper; import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION; import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest; import org.apache.solr.client.solrj.request.DirectXmlRequest; import org.apache.solr.client.solrj.request.UpdateRequest; @@ -76,19 +77,34 @@ public class SolrProducer extends DefaultProducer { } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_INSERT_STREAMING)) { insert(exchange, serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_ID)) { - serverToUse.deleteById(exchange.getIn().getBody(String.class)); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.deleteById(exchange.getIn().getBody(String.class)); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_QUERY)) { - serverToUse.deleteByQuery(exchange.getIn().getBody(String.class)); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.deleteByQuery(exchange.getIn().getBody(String.class)); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEAN)) { - serverToUse.addBean(exchange.getIn().getBody()); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.add(serverToUse.getBinder().toSolrInputDocument(exchange.getIn().getBody())); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEANS)) { - serverToUse.addBeans(exchange.getIn().getBody(Collection.class)); + UpdateRequest updateRequest = createUpdateRequest(); + Collection<Object> body = exchange.getIn().getBody(Collection.class); + updateRequest.add(body.stream().map(serverToUse.getBinder()::toSolrInputDocument).collect(Collectors.toList())); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_COMMIT)) { - serverToUse.commit(); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.setAction(ACTION.COMMIT, true, true); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ROLLBACK)) { - serverToUse.rollback(); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.rollback(); + updateRequest.process(serverToUse); } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_OPTIMIZE)) { - serverToUse.optimize(); + UpdateRequest updateRequest = createUpdateRequest(); + updateRequest.setAction(ACTION.OPTIMIZE, true, true, 1); + updateRequest.process(serverToUse); } else { throw new IllegalArgumentException( SolrConstants.OPERATION + " header value '" + operation + "' is not supported"); @@ -105,6 +121,7 @@ public class SolrProducer extends DefaultProducer { if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class))) { String mimeType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler()); + updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword()); updateRequest.addFile((File) body, mimeType); for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -121,6 +138,7 @@ public class SolrProducer extends DefaultProducer { MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap(); String mimeType = mimeTypesMap.getContentType((File) body); ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler()); + updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword()); updateRequest.addFile((File) body, mimeType); for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -134,7 +152,7 @@ public class SolrProducer extends DefaultProducer { } else if (body instanceof SolrInputDocument) { - UpdateRequest updateRequest = new UpdateRequest(getRequestHandler()); + UpdateRequest updateRequest = createUpdateRequest(); updateRequest.add((SolrInputDocument) body); for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -150,7 +168,7 @@ public class SolrProducer extends DefaultProducer { List<?> list = (List<?>) body; if (list.size() > 0 && list.get(0) instanceof SolrInputDocument) { - UpdateRequest updateRequest = new UpdateRequest(getRequestHandler()); + UpdateRequest updateRequest = createUpdateRequest(); updateRequest.add((List<SolrInputDocument>) list); for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -177,7 +195,7 @@ public class SolrProducer extends DefaultProducer { if (hasSolrHeaders) { - UpdateRequest updateRequest = new UpdateRequest(getRequestHandler()); + UpdateRequest updateRequest = createUpdateRequest(); SolrInputDocument doc = new SolrInputDocument(); for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) { @@ -198,6 +216,7 @@ public class SolrProducer extends DefaultProducer { } DirectXmlRequest xmlRequest = new DirectXmlRequest(getRequestHandler(), bodyAsString); + xmlRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword()); solrServer.request(xmlRequest); } else { @@ -217,6 +236,12 @@ public class SolrProducer extends DefaultProducer { return (requestHandler == null) ? "/update" : requestHandler; } + private UpdateRequest createUpdateRequest() { + UpdateRequest updateRequest = new UpdateRequest(getRequestHandler()); + updateRequest.setBasicAuthCredentials(getEndpoint().getUsername(), getEndpoint().getPassword()); + return updateRequest; + } + @Override public SolrEndpoint getEndpoint() { return (SolrEndpoint) super.getEndpoint(); diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java index b00de3c..28aa221 100644 --- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java +++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java @@ -49,6 +49,7 @@ public class InitSolrEndpointTest extends SolrTestSupport { + "&maxRetries=1&soTimeout=100&connectionTimeout=100" + "&defaultMaxConnectionsPerHost=100&maxTotalConnections=100" + "&followRedirects=false&allowCompression=true" - + "&requestHandler=/update"; + + "&requestHandler=/update" + + "&username=solr&password=SolrRocks"; } } diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java index ece404e..fe3658e 100644 --- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java +++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java @@ -26,6 +26,7 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.request.QueryRequest; import org.apache.solr.client.solrj.response.QueryResponse; import org.junit.AfterClass; import org.junit.Before; @@ -71,8 +72,10 @@ public abstract class SolrComponentTestSupport extends SolrTestSupport { protected QueryResponse executeSolrQuery(String query) throws SolrServerException, IOException { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(query); + QueryRequest queryRequest = new QueryRequest(solrQuery); + queryRequest.setBasicAuthCredentials("solr", "SolrRocks"); SolrClient solrServer = solrFixtures.getServer(); - return solrServer.query("collection1", solrQuery); + return queryRequest.process(solrServer, "collection1"); } @BeforeClass diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java index b9cdcf9..2de4b66 100644 --- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java +++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java @@ -23,8 +23,9 @@ import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.embedded.JettySolrRunner; import org.apache.solr.client.solrj.impl.HttpSolrClient; - - +import org.apache.solr.client.solrj.request.AbstractUpdateRequest; +import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION; +import org.apache.solr.client.solrj.request.UpdateRequest; public class SolrFixtures { static Logger log = Logger.getLogger(SolrFixtures.class); @@ -50,13 +51,15 @@ public class SolrFixtures { String solrRouteUri() { if (serverType == TestServerType.USE_HTTPS) { - return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1"; + return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1" + + "?username=solr&password=SolrRocks"; } else if (serverType == TestServerType.USE_CLOUD) { String zkAddrStr = cloudFixture.miniCluster.getZkServer().getZkAddress(); return "solrCloud://localhost:" + httpsPort + "/solr?zkHost=" + zkAddrStr - + "&collection=collection1"; + + "&collection=collection1&username=solr&password=SolrRocks"; } else { - return "solr://localhost:" + port + "/solr/collection1"; + return "solr://localhost:" + port + "/solr/collection1" + + "?username=solr&password=SolrRocks"; } } @@ -99,18 +102,19 @@ public class SolrFixtures { } public static void clearIndex() throws SolrServerException, IOException { + UpdateRequest updateRequest = new UpdateRequest(); + updateRequest.setBasicAuthCredentials("solr", "SolrRocks"); + updateRequest.deleteByQuery("*:*"); + updateRequest.setAction(ACTION.COMMIT, true, true); if (solrServer != null) { // Clear the Solr index. - solrServer.deleteByQuery("collection1", "*:*"); - solrServer.commit("collection1"); + updateRequest.process(solrServer, "collection1"); } if (solrHttpsServer != null) { - solrHttpsServer.deleteByQuery("collection1", "*:*"); - solrHttpsServer.commit("collection1"); + updateRequest.process(solrHttpsServer, "collection1"); } if (cloudFixture != null) { - cloudFixture.solrClient.deleteByQuery("*:*"); - cloudFixture.solrClient.commit(); + updateRequest.process(cloudFixture.solrClient); } } } diff --git a/components/camel-solr/src/test/resources/solr/security.json b/components/camel-solr/src/test/resources/solr/security.json new file mode 100644 index 0000000..bfaa8e1 --- /dev/null +++ b/components/camel-solr/src/test/resources/solr/security.json @@ -0,0 +1,13 @@ +{ + "authentication":{ + "blockUnknown": false, + "class":"solr.BasicAuthPlugin", + "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, + "realm":"My Solr users" + }, + "authorization":{ + "class":"solr.RuleBasedAuthorizationPlugin", + "permissions":[{"name":"security-edit", + "role":"admin"}], + "user-role":{"solr":"admin"} + }} \ No newline at end of file