This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 8f7cfa4b5423 CAMEL-26199: camel-spring-ldap - a body that is not a
Map, or no body, fails with an InvalidPayloadException naming the Map (#29022)
8f7cfa4b5423 is described below
commit 8f7cfa4b5423cbf035d33933fba67f3e7f747b7f
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Nov 3 11:44:02 2026 +0100
CAMEL-26199: camel-spring-ldap - a body that is not a Map, or no body,
fails with an InvalidPayloadException naming the Map (#29022)
…, fails with an InvalidPayloadException naming the Map
The producer read the body with the non-mandatory getBody(Map.class), so a
String body or no body failed with a bare NullPointerException on
body.get("dn").
It now uses getMandatoryBody(Map.class), read after the operation check, so
the
error names the expected Map. A function_driven body without a 'function'
entry
also failed with a NullPointerException; it now fails with a message naming
the
missing entry.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Claus Ibsen <[email protected]>
---
.../camel/catalog/docs/spring-ldap-component.adoc | 3 +-
.../src/main/docs/spring-ldap-component.adoc | 3 +-
.../component/springldap/SpringLdapProducer.java | 10 ++++--
.../springldap/SpringLdapProducerTest.java | 41 ++++++++++++++++++++++
4 files changed, 52 insertions(+), 5 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spring-ldap-component.adoc
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spring-ldap-component.adoc
index f312ebf4d1c9..826bea007443 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spring-ldap-component.adoc
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spring-ldap-component.adoc
@@ -53,7 +53,8 @@ include::partial$component-endpoint-headers.adoc[]
The component supports producer endpoint only. An attempt to create a
consumer endpoint will result in an `UnsupportedOperationException`. +
- The body of the message must be a map (an instance of `java.util.Map`).
+ The body of the message must be a map (an instance of `java.util.Map`);
another body, or no body,
+fails with an `InvalidPayloadException`.
Unless a base DN is specified by in the configuration of your ContextSource,
this map must contain at least an entry with the key *`dn`* (not needed for
function_driven operation) that
specifies the root node for the LDAP operation to be performed. Other
diff --git
a/components/camel-spring-parent/camel-spring-ldap/src/main/docs/spring-ldap-component.adoc
b/components/camel-spring-parent/camel-spring-ldap/src/main/docs/spring-ldap-component.adoc
index f312ebf4d1c9..826bea007443 100644
---
a/components/camel-spring-parent/camel-spring-ldap/src/main/docs/spring-ldap-component.adoc
+++
b/components/camel-spring-parent/camel-spring-ldap/src/main/docs/spring-ldap-component.adoc
@@ -53,7 +53,8 @@ include::partial$component-endpoint-headers.adoc[]
The component supports producer endpoint only. An attempt to create a
consumer endpoint will result in an `UnsupportedOperationException`. +
- The body of the message must be a map (an instance of `java.util.Map`).
+ The body of the message must be a map (an instance of `java.util.Map`);
another body, or no body,
+fails with an `InvalidPayloadException`.
Unless a base DN is specified by in the configuration of your ContextSource,
this map must contain at least an entry with the key *`dn`* (not needed for
function_driven operation) that
specifies the root node for the LDAP operation to be performed. Other
diff --git
a/components/camel-spring-parent/camel-spring-ldap/src/main/java/org/apache/camel/component/springldap/SpringLdapProducer.java
b/components/camel-spring-parent/camel-spring-ldap/src/main/java/org/apache/camel/component/springldap/SpringLdapProducer.java
index bf11a2f4b67b..650aad2df94a 100644
---
a/components/camel-spring-parent/camel-spring-ldap/src/main/java/org/apache/camel/component/springldap/SpringLdapProducer.java
+++
b/components/camel-spring-parent/camel-spring-ldap/src/main/java/org/apache/camel/component/springldap/SpringLdapProducer.java
@@ -82,14 +82,14 @@ public class SpringLdapProducer extends DefaultProducer {
*/
@Override
public void process(Exchange exchange) throws Exception {
- @SuppressWarnings("unchecked")
- Map<String, Object> body = exchange.getIn().getBody(Map.class);
-
LdapOperation operation = endpoint.getOperation();
if (null == operation) {
throw new UnsupportedOperationException("LDAP operation must not
be empty, but you provided an empty operation");
}
+ @SuppressWarnings("unchecked")
+ Map<String, Object> body =
exchange.getIn().getMandatoryBody(Map.class);
+
LdapTemplate ldapTemplate = endpoint.getLdapTemplate();
String dn = (String) body.get(DN);
@@ -128,6 +128,10 @@ public class SpringLdapProducer extends DefaultProducer {
case FUNCTION_DRIVEN:
BiFunction<LdapOperations, Object, ?> ldapOperationFunction
= (BiFunction<LdapOperations, Object, ?>)
body.get(FUNCTION);
+ if (ldapOperationFunction == null) {
+ throw new UnsupportedOperationException(
+ "The function_driven operation needs a BiFunction
in the '" + FUNCTION + "' entry of the body");
+ }
Object ldapOperationRequest = body.get(REQUEST);
exchange.getIn().setBody(ldapOperationFunction.apply(ldapTemplate,
ldapOperationRequest));
break;
diff --git
a/components/camel-spring-parent/camel-spring-ldap/src/test/java/org/apache/camel/component/springldap/SpringLdapProducerTest.java
b/components/camel-spring-parent/camel-spring-ldap/src/test/java/org/apache/camel/component/springldap/SpringLdapProducerTest.java
index dbb1bdfd22e8..6a7af2e28344 100644
---
a/components/camel-spring-parent/camel-spring-ldap/src/test/java/org/apache/camel/component/springldap/SpringLdapProducerTest.java
+++
b/components/camel-spring-parent/camel-spring-ldap/src/test/java/org/apache/camel/component/springldap/SpringLdapProducerTest.java
@@ -27,6 +27,7 @@ import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
import org.apache.camel.Message;
import org.apache.camel.support.DefaultExchange;
import org.apache.camel.support.DefaultMessage;
@@ -41,7 +42,9 @@ import org.springframework.ldap.core.LdapOperations;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.query.LdapQuery;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
@@ -83,6 +86,44 @@ class SpringLdapProducerTest extends CamelTestSupport {
() -> ldapProducer.process(exchange));
}
+ @Test
+ void testStringBodyNamesTheExpectedMap() {
+ Exchange exchange = new DefaultExchange(context);
+ exchange.getIn().setBody("cn=Alice,ou=people,dc=example,dc=org");
+
+ when(ldapEndpoint.getOperation()).thenReturn(LdapOperation.SEARCH);
+
+ InvalidPayloadException e = assertThrows(InvalidPayloadException.class,
+ () -> ldapProducer.process(exchange));
+ assertEquals(Map.class, e.getType());
+ }
+
+ @Test
+ void testNoBodyNamesTheExpectedMap() {
+ Exchange exchange = new DefaultExchange(context);
+
+ when(ldapEndpoint.getOperation()).thenReturn(LdapOperation.UNBIND);
+
+ InvalidPayloadException e = assertThrows(InvalidPayloadException.class,
+ () -> ldapProducer.process(exchange));
+ assertEquals(Map.class, e.getType());
+ }
+
+ @Test
+ void testFunctionDrivenWithoutFunction() {
+ Exchange exchange = new DefaultExchange(context);
+ Message in = new DefaultMessage(context);
+
+ Map<String, Object> body = new HashMap<>();
+ body.put(SpringLdapProducer.REQUEST, "cn=dn");
+
+
when(ldapEndpoint.getOperation()).thenReturn(LdapOperation.FUNCTION_DRIVEN);
+
+ UnsupportedOperationException e =
assertThrows(UnsupportedOperationException.class,
+ () -> processBody(exchange, in, body));
+ assertTrue(e.getMessage().contains("'function'"), e.getMessage());
+ }
+
@Test
public void testNoDN() throws Exception {
Exchange exchange = new DefaultExchange(context);