This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new ae87823057 fix of #7226: ldap config optimization + tests refactor
ae87823057 is described below
commit ae87823057738b523a3d58d9537e22d45f1b6e61
Author: Jiri Ondrusek <[email protected]>
AuthorDate: Fri Apr 4 13:44:08 2025 +0200
fix of #7226: ldap config optimization + tests refactor
---
.../ROOT/pages/reference/extensions/ldap.adoc | 96 ++++++++++++++++++
.../component/ldap/deployment/LdapProcessor.java | 16 +++
extensions/ldap/runtime/src/main/doc/usage.adoc | 36 +++++++
.../quarkus/component/ldap/CamelLdapConfig.java | 81 ++++++++++++++++
.../quarkus/component/ldap/CamelLdapRecorder.java | 50 ++++++++++
.../component/ldap/it/CustomSSLSocketFactory.java | 12 +--
.../quarkus/component/ldap/it/LdapProducer.java | 51 ++++++++++
.../quarkus/component/ldap/it/LdapResource.java | 70 ++------------
.../quarkus/component/ldap/it/LdapRoutes.java | 14 ++-
.../ldap/src/main/resources/application.properties | 30 ++++++
.../camel/quarkus/component/ldap/it/LdapTest.java | 107 ++-------------------
.../component/ldap/it/LdapTestResource.java | 101 +++++++++++++++++++
12 files changed, 491 insertions(+), 173 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/ldap.adoc
b/docs/modules/ROOT/pages/reference/extensions/ldap.adoc
index 8194a85386..c9eaef3000 100644
--- a/docs/modules/ROOT/pages/reference/extensions/ldap.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/ldap.adoc
@@ -46,6 +46,43 @@ endif::[]
[id="extensions-ldap-usage"]
== Usage
+[id="extensions-ldap-usage-configuration-via-properties"]
+=== Configuration via properties
+
+The LDAP component supports property-based configuration in addition to plain
Camel configuration.
+Configuration property should follow the pattern:
+
+[source,properties]
+----
+quarkus.camel.ldap.dir-contexts.<dirContextName>.<property>
+----
+
+For more details, refer to the dirContext
https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/directory/DirContext.html[Javadoc].
+The following options are available:
+
+* initial-context-factory
+* provider-url
+* security-authentication
+* security-protocol
+* socket-factory
+
+If you need to specify an option that is not listed above, use the following
property format:
+
+[source,properties]
+----
+quarkus.camel.ldap.dr-contexts."your_name".additional-options."not-listed_option_name"
+----
+
+Here is an example of configuration of a dirContext named `your_context` using
SSL.
+
+[source,properties]
+----
+quarkus.camel.ldap.dir-contexts."your_context".initial-context-factory=com.sun.jndi.ldap.LdapCtxFactory
+quarkus.camel.ldap.dir-contexts."your_context".provider-url=ldaps://${ldap.host}:${ldap.sslPort}
+quarkus.camel.ldap.dir-contexts."your_context".security-protocol=ssl
+quarkus.camel.ldap.dir-contexts."your_context".socket-factory=org.apache.camel.quarkus.component.ldap.it.CustomSSLSocketFactory
+----
+
[id="extensions-ldap-usage-using-ssl-in-native-mode"]
=== Using SSL in Native Mode
@@ -59,3 +96,62 @@ public class CustomSSLSocketFactory extends SSLSocketFactory
{
}
----
+
+[id="extensions-ldap-additional-camel-quarkus-configuration"]
+== Additional Camel Quarkus configuration
+
+[width="100%",cols="80,5,15",options="header"]
+|===
+| Configuration property | Type | Default
+
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-initial-context-factory]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-initial-context-factory[quarkus.camel.ldap.dir-contexts."dir-contexts".initial-context-factory]`
+
+The initial context factory to use. The value of the property should be the
fully qualified class name
+of the factory class that will create an initial context.
+| `string`
+|
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-provider-url]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-provider-url[quarkus.camel.ldap.dir-contexts."dir-contexts".provider-url]`
+
+The service provider
+to use. The value of the property should contain a URL string
+(e.g. "ldap://somehost:389").
+| `string`
+|
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-security-protocol]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-security-protocol[quarkus.camel.ldap.dir-contexts."dir-contexts".security-protocol]`
+
+The security protocol to use.
+Its value is a string determined by the service provider
+(e.g. "ssl").
+| `string`
+|
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-security-authentication]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-security-authentication[quarkus.camel.ldap.dir-contexts."dir-contexts".security-authentication]`
+
+The security level to use.
+Its value is one of the following strings:
+"none", "simple", "strong".
+If this property is unspecified,
+the behaviour is determined by the service provider.
+| `string`
+| `none`
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-socket-factory]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-socket-factory[quarkus.camel.ldap.dir-contexts."dir-contexts".socket-factory]`
+
+The custom socket factory to use. The value of the property should be the
fully qualified class name
+of the socket factory class.
+| `string`
+|
+
+a|
[[quarkus-camel-ldap-dir-contexts-dir-contexts-additional-options-additional-options]]`link:#quarkus-camel-ldap-dir-contexts-dir-contexts-additional-options-additional-options[quarkus.camel.ldap.dir-contexts."dir-contexts".additional-options."additional-options"]`
+
+Any other option which will be used during dirContext creation.
+| `Map<String,String>`
+|
+|===
+
+[.configuration-legend]
+{doc-link-icon-lock}[title=Fixed at build time] Configuration property fixed
at build time. All other configuration properties are overridable at runtime.
+
diff --git
a/extensions/ldap/deployment/src/main/java/org/apache/camel/quarkus/component/ldap/deployment/LdapProcessor.java
b/extensions/ldap/deployment/src/main/java/org/apache/camel/quarkus/component/ldap/deployment/LdapProcessor.java
index c5dd3ede23..8daa0d2249 100644
---
a/extensions/ldap/deployment/src/main/java/org/apache/camel/quarkus/component/ldap/deployment/LdapProcessor.java
+++
b/extensions/ldap/deployment/src/main/java/org/apache/camel/quarkus/component/ldap/deployment/LdapProcessor.java
@@ -18,9 +18,14 @@ package org.apache.camel.quarkus.component.ldap.deployment;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.AllowJNDIBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.ldap.CamelLdapConfig;
+import org.apache.camel.quarkus.component.ldap.CamelLdapRecorder;
+import org.apache.camel.quarkus.core.deployment.spi.CamelContextBuildItem;
class LdapProcessor {
@@ -43,4 +48,15 @@ class LdapProcessor {
"com.sun.jndi.rmi.registry.RegistryContextFactory")
.build());
}
+
+ @BuildStep
+ @Record(ExecutionTime.RUNTIME_INIT)
+ void createDirContexts(
+ CamelContextBuildItem context,
+ CamelLdapRecorder camelLdapRecorder,
+ CamelLdapConfig ldapConfig) {
+
+ camelLdapRecorder.createDirContexts(context.getCamelContext(),
ldapConfig);
+ }
+
}
diff --git a/extensions/ldap/runtime/src/main/doc/usage.adoc
b/extensions/ldap/runtime/src/main/doc/usage.adoc
index dbb52638a8..4a94ae4929 100644
--- a/extensions/ldap/runtime/src/main/doc/usage.adoc
+++ b/extensions/ldap/runtime/src/main/doc/usage.adoc
@@ -1,3 +1,39 @@
+=== Configuration via properties
+
+The LDAP component supports property-based configuration in addition to plain
Camel configuration.
+Configuration property should follow the pattern:
+
+[source,properties]
+----
+quarkus.camel.ldap.dir-contexts.<dirContextName>.<property>
+----
+
+For more details, refer to the dirContext
https://docs.oracle.com/en/java/javase/17/docs/api/java.naming/javax/naming/directory/DirContext.html[Javadoc].
+The following options are available:
+
+* initial-context-factory
+* provider-url
+* security-authentication
+* security-protocol
+* socket-factory
+
+If you need to specify an option that is not listed above, use the following
property format:
+
+[source,properties]
+----
+quarkus.camel.ldap.dr-contexts."your_name".additional-options."not-listed_option_name"
+----
+
+Here is an example of configuration of a dirContext named `your_context` using
SSL.
+
+[source,properties]
+----
+quarkus.camel.ldap.dir-contexts."your_context".initial-context-factory=com.sun.jndi.ldap.LdapCtxFactory
+quarkus.camel.ldap.dir-contexts."your_context".provider-url=ldaps://${ldap.host}:${ldap.sslPort}
+quarkus.camel.ldap.dir-contexts."your_context".security-protocol=ssl
+quarkus.camel.ldap.dir-contexts."your_context".socket-factory=org.apache.camel.quarkus.component.ldap.it.CustomSSLSocketFactory
+----
+
=== Using SSL in Native Mode
When using a custom `SSLSocketFactory` in native mode, such as the one in the
xref:{cq-camel-components}::ldap-component.adoc#_configuring_ssl[Configuring
SSL] section, you need to register the class for reflection otherwise the class
will not be made available on the classpath. Add the `@RegisterForReflection`
annotation above the class definition, as follows:
diff --git
a/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapConfig.java
b/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapConfig.java
new file mode 100644
index 0000000000..9036fbac4e
--- /dev/null
+++
b/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapConfig.java
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+package org.apache.camel.quarkus.component.ldap;
+
+import java.util.Map;
+import java.util.Optional;
+
+import io.quarkus.runtime.annotations.ConfigGroup;
+import io.quarkus.runtime.annotations.ConfigPhase;
+import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+@ConfigMapping(prefix = "quarkus.camel.ldap")
+public interface CamelLdapConfig {
+
+ /**
+ * Ldap dirContext configuration
+ */
+ Map<String, LdapDirContextConfig> dirContexts();
+
+ @ConfigGroup
+ interface LdapDirContextConfig {
+
+ /**
+ * The initial context factory to use. The value of the property
should be the fully qualified class name
+ * of the factory class that will create an initial context.
+ */
+ Optional<String> initialContextFactory();
+
+ /**
+ * The service provider
+ * to use. The value of the property should contain a URL string
+ * (e.g. "ldap://somehost:389").
+ */
+ Optional<String> providerUrl();
+
+ /**
+ * The security protocol to use.
+ * Its value is a string determined by the service provider
+ * (e.g. "ssl").
+ */
+ Optional<String> securityProtocol();
+
+ /**
+ * The security level to use.
+ * Its value is one of the following strings:
+ * "none", "simple", "strong".
+ * If this property is unspecified,
+ * the behaviour is determined by the service provider.
+ */
+ @WithDefault("none")
+ String securityAuthentication();
+
+ /**
+ * The custom socket factory to use. The value of the property should
be the fully qualified class name
+ * of the socket factory class.
+ */
+ Optional<String> socketFactory();
+
+ /**
+ * Any other option which will be used during dirContext creation.
+ */
+ Map<String, String> additionalOptions();
+ }
+}
diff --git
a/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapRecorder.java
b/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapRecorder.java
new file mode 100644
index 0000000000..9ee3f8dab8
--- /dev/null
+++
b/extensions/ldap/runtime/src/main/java/org/apache/camel/quarkus/component/ldap/CamelLdapRecorder.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+package org.apache.camel.quarkus.component.ldap;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.CamelContext;
+
+@Recorder
+public class CamelLdapRecorder {
+
+ public void createDirContexts(RuntimeValue<CamelContext>
contextRuntimeValue, final CamelLdapConfig config) {
+ CamelContext context = contextRuntimeValue.getValue();
+
+ config.dirContexts().keySet().forEach(contextName -> {
+
+ CamelLdapConfig.LdapDirContextConfig dirConfig =
config.dirContexts().get(contextName);
+
+ Hashtable<String, Object> env = new Hashtable<String, Object>();
+ dirConfig.initialContextFactory().ifPresent(v ->
env.put(Context.INITIAL_CONTEXT_FACTORY, v));
+ dirConfig.providerUrl().ifPresent(v ->
env.put(Context.PROVIDER_URL, v));
+ env.put(Context.SECURITY_AUTHENTICATION,
dirConfig.securityAuthentication());
+ dirConfig.securityProtocol().ifPresent(v ->
env.put(Context.SECURITY_PROTOCOL, v));
+ dirConfig.socketFactory().ifPresent(v ->
env.put("java.naming.ldap.factory.socket", v));
+
+ //additional options
+ dirConfig.additionalOptions().entrySet().forEach(e ->
env.put(e.getKey(), e.getValue()));
+
+ context.getRegistry().bind(contextName, env);
+ });
+ }
+}
diff --git
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/CustomSSLSocketFactory.java
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/CustomSSLSocketFactory.java
index 932401bc93..6719c1da6e 100644
---
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/CustomSSLSocketFactory.java
+++
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/CustomSSLSocketFactory.java
@@ -36,13 +36,10 @@ public class CustomSSLSocketFactory extends
SSLSocketFactory {
private final SSLSocketFactory delegate;
- private static String trustStoreFilename;
- private static String trustStorePassword;
-
public CustomSSLSocketFactory() throws Exception {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
- try (InputStream in = new FileInputStream(trustStoreFilename)) {
- trustStore.load(in, trustStorePassword.toCharArray());
+ try (InputStream in = new
FileInputStream("target/certs/ldap-truststore.p12")) {
+ trustStore.load(in, "changeit".toCharArray());
}
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
@@ -99,9 +96,4 @@ public class CustomSSLSocketFactory extends SSLSocketFactory {
throws IOException {
return delegate.createSocket(address, port, localAddress, localPort);
}
-
- public static void setTrustStore(String fileName, String password) {
- trustStoreFilename = fileName;
- trustStorePassword = password;
- }
}
diff --git
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapProducer.java
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapProducer.java
new file mode 100644
index 0000000000..091583a817
--- /dev/null
+++
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapProducer.java
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+package org.apache.camel.quarkus.component.ldap.it;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.Dependent;
+import jakarta.enterprise.inject.Produces;
+import jakarta.inject.Named;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+
+@ApplicationScoped
+public class LdapProducer {
+
+ @ConfigProperty(name = "ldap.port")
+ Integer ldapPort;
+
+ @ConfigProperty(name = "ldap.host")
+ String ldapHost;
+
+ @Produces
+ @Dependent
+ @Named("originalConfig")
+ public DirContext createLdapContext() throws Exception {
+
+ Hashtable<String, Object> env = new Hashtable<>();
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
+ env.put(Context.PROVIDER_URL, String.format("ldap://%s:%s", ldapHost,
ldapPort));
+ env.put(Context.SECURITY_AUTHENTICATION, "none");
+ return new InitialDirContext(env);
+ }
+}
diff --git
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapResource.java
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapResource.java
index 5b01ecbaef..03ae765b57 100644
---
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapResource.java
+++
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapResource.java
@@ -18,25 +18,18 @@ package org.apache.camel.quarkus.component.ldap.it;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Hashtable;
import java.util.List;
import java.util.Map;
-import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchResult;
import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
-import jakarta.inject.Named;
-import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
@@ -52,72 +45,29 @@ public class LdapResource {
@Inject
CamelContext camelContext;
- private String ldapHost;
- private String ldapPort;
- private boolean useSSL;
- private String trustStoreFilename;
- private String trustStorePassword;
-
- /**
- * Extracts the LDAP connection parameters passed from the test and
creates a
- * {@link javax.naming.directory.DirContext} from them.
- * The DirContext is then bound into the CamelContext for use in the LDAP
route.
- *
- * @param options
- * @throws Exception
- */
- @Path("/configure")
- @POST
- @Consumes(MediaType.APPLICATION_JSON)
- public void configure(Map<String, String> options) throws Exception {
- ldapHost = options.get("host");
- ldapPort = options.get("port");
- useSSL = Boolean.valueOf(options.get("ssl"));
- trustStoreFilename = options.get("trustStore");
- trustStorePassword = options.get("trustStorePassword");
- }
-
- @Path("/search")
+ @Path("/search/{direct}")
@GET
@Produces(MediaType.APPLICATION_JSON)
- public Response search(@QueryParam("ldapQuery") String ldapQuery) throws
Exception {
- return Response.ok(searchByUid(ldapQuery)).build();
+ public Response search(@PathParam("direct") String directName,
+ @QueryParam("ldapQuery") String ldapQuery) throws Exception {
+ return Response.ok(searchByUid(directName, ldapQuery)).build();
}
@Path("/safeSearch")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response safeSearch(@QueryParam("ldapQuery") String ldapQuery)
throws Exception {
- return
Response.ok(searchByUid(LdapHelper.escapeFilter(ldapQuery))).build();
+ return Response.ok(searchByUid("http",
LdapHelper.escapeFilter(ldapQuery))).build();
}
@SuppressWarnings("unchecked")
- private List<Map<String, String>> searchByUid(String uid) throws Exception
{
+ private List<Map<String, String>> searchByUid(String directName, String
uid) throws Exception {
String filter = String.format("(uid=%s)", uid);
ProducerTemplate producer = camelContext.createProducerTemplate();
- List<SearchResult> results = producer.requestBody("direct:start",
filter, List.class);
+ List<SearchResult> results = producer.requestBody("direct:" +
directName, filter, List.class);
return convertSearchResults(results);
}
- @Produces
- @Dependent
- @Named("ldapserver")
- public DirContext createLdapContext() throws Exception {
- String scheme = useSSL ? "ldaps" : "ldap";
- Hashtable<String, Object> env = new Hashtable<>();
- env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, String.format("%s://%s:%s", scheme,
ldapHost, ldapPort));
- env.put(Context.SECURITY_AUTHENTICATION, "none");
-
- if (useSSL) {
- CustomSSLSocketFactory.setTrustStore(trustStoreFilename,
trustStorePassword);
- env.put("java.naming.ldap.factory.socket",
CustomSSLSocketFactory.class.getName());
- env.put(Context.SECURITY_PROTOCOL, "ssl");
- }
-
- return new InitialDirContext(env);
- }
-
/**
* Converts the list of {@link javax.naming.directory.SearchResult}
objects into
* a structure that Jackson can
@@ -128,10 +78,10 @@ public class LdapResource {
* @throws Exception
*/
private List<Map<String, String>> convertSearchResults(List<SearchResult>
searchResults) throws Exception {
- List<Map<String, String>> results = new ArrayList<>();
+ List<Map<String, String>> results = new ArrayList<Map<String,
String>>();
for (SearchResult searchResult : searchResults) {
- Map<String, String> resultMap = new HashMap<>();
+ Map<String, String> resultMap = new HashMap<String, String>();
NamingEnumeration<? extends Attribute> attrs =
searchResult.getAttributes().getAll();
while (attrs.hasMore()) {
Attribute attr = attrs.next();
diff --git
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapRoutes.java
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapRoutes.java
index bfd07fa29c..c96d91466a 100644
---
a/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapRoutes.java
+++
b/integration-tests/ldap/src/main/java/org/apache/camel/quarkus/component/ldap/it/LdapRoutes.java
@@ -22,8 +22,18 @@ public class LdapRoutes extends RouteBuilder {
@Override
public void configure() throws Exception {
- from("direct:start")
- .to("ldap://ldapserver?base=ou=system");
+
+ from("direct:http")
+ .to("ldap://httpserver?base=ou=system");
+
+ from("direct:ssl")
+ .to("ldap://sslserver?base=ou=system");
+
+ from("direct:additionalOptions")
+ .to("ldap://additional?base=ou=system");
+
+ from("direct:originalConfig")
+ .to("ldap://additional?base=ou=system");
}
}
diff --git a/integration-tests/ldap/src/main/resources/application.properties
b/integration-tests/ldap/src/main/resources/application.properties
new file mode 100644
index 0000000000..64f2e94977
--- /dev/null
+++ b/integration-tests/ldap/src/main/resources/application.properties
@@ -0,0 +1,30 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+quarkus.camel.ldap.dir-contexts."httpserver".initial-context-factory=com.sun.jndi.ldap.LdapCtxFactory
+quarkus.camel.ldap.dir-contexts."httpserver".provider-url=ldap://${ldap.host}:${ldap.port}
+quarkus.camel.ldap.dir-contexts."httpserver".security-authentication=none
+
+quarkus.camel.ldap.dir-contexts."sslserver".initial-context-factory=com.sun.jndi.ldap.LdapCtxFactory
+quarkus.camel.ldap.dir-contexts."sslserver".provider-url=ldaps://${ldap.host}:${ldap.sslPort}
+quarkus.camel.ldap.dir-contexts."sslserver".security-protocol=ssl
+quarkus.camel.ldap.dir-contexts."sslserver".socket-factory=org.apache.camel.quarkus.component.ldap.it.CustomSSLSocketFactory
+
+#test of addition-options
+quarkus.camel.ldap.dir-contexts."additional".initial-context-factory=com.sun.jndi.ldap.LdapCtxFactory
+quarkus.camel.ldap.dir-contexts."additional".provider-url=ldaps://${ldap.host}:${ldap.sslPort}
+quarkus.camel.ldap.dir-contexts."additional".additional-options.security-protocol=ssl
+quarkus.camel.ldap.dir-contexts."additional".socket-factory=org.apache.camel.quarkus.component.ldap.it.CustomSSLSocketFactory
diff --git
a/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTest.java
b/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTest.java
index 706273d174..20ec562f0e 100644
---
a/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTest.java
+++
b/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTest.java
@@ -16,31 +16,17 @@
*/
package org.apache.camel.quarkus.component.ldap.it;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
-import com.unboundid.ldap.listener.InMemoryDirectoryServer;
-import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
-import com.unboundid.ldap.listener.InMemoryListenerConfig;
-import com.unboundid.ldif.LDIFReader;
-import com.unboundid.util.ssl.KeyStoreKeyManager;
-import com.unboundid.util.ssl.SSLUtil;
+import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
import io.smallrye.certs.Format;
import io.smallrye.certs.junit5.Certificate;
-import jakarta.ws.rs.core.MediaType;
import org.apache.camel.quarkus.test.support.certificate.TestCertificates;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@@ -51,74 +37,23 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
@Certificate(name = "ldap", formats = {
Format.PKCS12 }, password = "changeit") })
@QuarkusTest
+@QuarkusTestResource(LdapTestResource.class)
class LdapTest {
- private static InMemoryDirectoryServer ldapServer = null;
- private static final String truststoreFile =
"target/certs/ldap-truststore.p12";
-
- @BeforeAll
- public static void setUpLdapServer() throws Exception {
-
- // Create an LDAP server to handle unencrypted and TLS connections
- InMemoryDirectoryServerConfig dsConfig = new
InMemoryDirectoryServerConfig("ou=system");
- InMemoryListenerConfig listenerConfig =
InMemoryListenerConfig.createLDAPConfig("ldap",
- InetAddress.getLoopbackAddress(), 0, null);
-
- // The keystore is generated by the build process
- Path keystoreFile = Paths.get("target/certs/ldap-keystore.p12");
- if (!Files.isRegularFile(keystoreFile)) {
- /* The test is run from a test-jar within Quarkus Platform, where
the Ant script was not run
- * so let's copy the keystore from test-jar to the local folder */
- Files.createDirectories(keystoreFile.getParent());
- try (InputStream in =
LdapTest.class.getClassLoader().getResourceAsStream(keystoreFile.getFileName().toString()))
{
- Files.copy(in, keystoreFile);
- }
- Path truststorePath = Paths.get(truststoreFile);
- try (InputStream in = LdapTest.class.getClassLoader()
-
.getResourceAsStream(truststorePath.getFileName().toString())) {
- Files.copy(in, truststorePath);
- }
- }
-
- SSLUtil serverSSLUtil = new SSLUtil(new
KeyStoreKeyManager(keystoreFile.toFile(), "changeit".toCharArray()),
- null);
- InMemoryListenerConfig sslListenerConfig =
InMemoryListenerConfig.createLDAPSConfig("ldaps",
- InetAddress.getLoopbackAddress(), 0,
serverSSLUtil.createSSLServerSocketFactory(),
- null);
- dsConfig.setListenerConfigs(listenerConfig, sslListenerConfig);
- ldapServer = new InMemoryDirectoryServer(dsConfig);
-
- // Load the LDIF file from the Camel LDAP tests
- LDIFReader ldifReader = new LDIFReader(
-
LdapTest.class.getClassLoader().getResourceAsStream("LdapRouteTest.ldif"));
- ldapServer.importFromLDIF(true, ldifReader);
- ldapServer.startListening();
- }
-
- @AfterAll
- public static void tearDownLdapServer() {
- if (ldapServer != null) {
- ldapServer.close();
- }
- }
-
/**
* Calls a Camel route to search for LDAP entries where the uid is
"tcruise".
* The test is run in both SSL and non-SSL modes.
*
- * @param useSSL
* @throws Exception
*/
@ParameterizedTest
- @ValueSource(booleans = { false, true })
- public void ldapSearchTest(boolean useSSL) throws Exception {
- configureResource(useSSL);
-
+ @ValueSource(strings = { "http", "ssl", "originalConfig",
"additionalOptions" })
+ public void ldapSearchTest(String direct) throws Exception {
TypeRef<List<Map<String, Object>>> typeRef = new TypeRef<>() {
};
List<Map<String, Object>> results = RestAssured.given()
.queryParam("ldapQuery", "tcruise")
- .get("/ldap/search")
+ .get("/ldap/search/" + direct)
.then()
.statusCode(200)
.extract().as(typeRef);
@@ -135,15 +70,13 @@ class LdapTest {
*/
@Test
public void ldapHelperTest() throws Exception {
- configureResource(false);
-
TypeRef<List<Map<String, Object>>> typeRef = new TypeRef<>() {
};
// Verfiy that calling the unsafe endpoint with a wildcard returns
multiple results.
List<Map<String, Object>> results = RestAssured.given()
.queryParam("ldapQuery", "test*")
- .get("/ldap/search")
+ .get("/ldap/search/http")
.then()
.statusCode(200)
.extract().as(typeRef);
@@ -169,34 +102,6 @@ class LdapTest {
.extract().as(typeRef);
assertEquals(1, results.size());
assertEquals("test1", results.get(0).get("ou"));
-
}
- /**
- * Configures the
- * {@link org.apache.camel.quarkus.component.ldap.it.LdapResource} by
sending it
- * a Map of connection properties.
- *
- * @param useSSL
- * @throws Exception
- */
- private void configureResource(boolean useSSL) throws Exception {
- // Configure the LdapResource with the connection details for the LDAP
server
- String listenerName = useSSL ? "ldaps" : "ldap";
- Map<String, String> options = new HashMap<>();
- options.put("host",
ldapServer.getListenAddress(listenerName).getHostAddress());
- options.put("port",
String.valueOf(ldapServer.getListenPort(listenerName)));
- options.put("ssl", String.valueOf(useSSL));
- if (useSSL) {
- options.put("trustStore", truststoreFile);
- options.put("trustStorePassword", "changeit");
- }
-
- RestAssured.given()
- .body(options)
- .contentType(MediaType.APPLICATION_JSON)
- .post("/ldap/configure")
- .then()
- .statusCode(204);
- }
}
diff --git
a/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTestResource.java
b/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTestResource.java
new file mode 100644
index 0000000000..1e7684ae1c
--- /dev/null
+++
b/integration-tests/ldap/src/test/java/org/apache/camel/quarkus/component/ldap/it/LdapTestResource.java
@@ -0,0 +1,101 @@
+/*
+ * 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.
+ */
+package org.apache.camel.quarkus.component.ldap.it;
+
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+
+import com.unboundid.ldap.listener.InMemoryDirectoryServer;
+import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
+import com.unboundid.ldap.listener.InMemoryListenerConfig;
+import com.unboundid.ldif.LDIFReader;
+import com.unboundid.util.ssl.KeyStoreKeyManager;
+import com.unboundid.util.ssl.SSLUtil;
+import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
+
+public class LdapTestResource implements QuarkusTestResourceLifecycleManager {
+
+ InMemoryDirectoryServer ldapServer;
+
+ @Override
+ public Map<String, String> start() {
+
+ try {
+ // Create an LDAP server to handle unencrypted and TLS connections
+ InMemoryDirectoryServerConfig dsConfig = new
InMemoryDirectoryServerConfig("ou=system");
+ InMemoryListenerConfig listenerConfig =
InMemoryListenerConfig.createLDAPConfig("ldap",
+ InetAddress.getLoopbackAddress(), 0, null);
+
+ // The keystore is generated by the build process
+ Path keystoreFile = Paths.get("target/certs/ldap-keystore.p12");
+ if (!Files.isRegularFile(keystoreFile)) {
+ /* The test is run from a test-jar within Quarkus Platform,
where the Ant script was not run
+ * so let's copy the keystore from test-jar to the local
folder */
+ Files.createDirectories(keystoreFile.getParent());
+ try (InputStream in = LdapTest.class.getClassLoader()
+
.getResourceAsStream(keystoreFile.getFileName().toString())) {
+ Files.copy(in, keystoreFile);
+ }
+ Path truststorePath =
Paths.get("target/certs/ldap-truststore.p12");
+ try (InputStream in = LdapTest.class.getClassLoader()
+
.getResourceAsStream(truststorePath.getFileName().toString())) {
+ Files.copy(in, truststorePath);
+ }
+ }
+
+ SSLUtil serverSSLUtil = new SSLUtil(new
KeyStoreKeyManager(keystoreFile.toFile(), "changeit".toCharArray()),
+ null);
+ InMemoryListenerConfig sslListenerConfig =
InMemoryListenerConfig.createLDAPSConfig("ldaps",
+ InetAddress.getLoopbackAddress(), 0,
serverSSLUtil.createSSLServerSocketFactory(),
+ null);
+ dsConfig.setListenerConfigs(listenerConfig, sslListenerConfig);
+ ldapServer = new InMemoryDirectoryServer(dsConfig);
+
+ // Load the LDIF file from the Camel LDAP tests
+ LDIFReader ldifReader = new LDIFReader(
+
LdapTest.class.getClassLoader().getResourceAsStream("LdapRouteTest.ldif"));
+ ldapServer.importFromLDIF(true, ldifReader);
+ ldapServer.startListening();
+
+ String host = ldapServer.getListenAddress("ldap").getHostAddress();
+ int port = ldapServer.getListenPort("ldap");
+ int sslPort = ldapServer.getListenPort("ldaps");
+
+ return Map.of(
+ "ldap.host", host,
+ "ldap.port", port + "",
+ "ldap.sslPort", sslPort + "");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void stop() {
+ if (ldapServer != null) {
+ try {
+ ldapServer.close();
+ } catch (Exception e) {
+ // ignored
+ }
+ }
+ }
+}