You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/11/08 10:49:46 UTC

[camel] 01/01: CAMEL-18696: camel-ldap - Make filter a bit easier to use

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch ldap
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 4450eb1a20b5e06cd457dec326865c9bb4edc6c9
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Nov 8 11:49:14 2022 +0100

    CAMEL-18696: camel-ldap - Make filter a bit easier to use
---
 .../apache/camel/component/ldap/LdapProducer.java  | 65 +++++++++++++++++++---
 1 file changed, 58 insertions(+), 7 deletions(-)

diff --git a/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java b/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
index 0079167f390..97a3e750fd9 100644
--- a/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
+++ b/components/camel-ldap/src/main/java/org/apache/camel/component/ldap/LdapProducer.java
@@ -43,10 +43,10 @@ public class LdapProducer extends DefaultProducer {
 
     private static final Logger LOG = LoggerFactory.getLogger(LdapProducer.class);
 
-    private String remaining;
-    private SearchControls searchControls;
-    private String searchBase;
-    private Integer pageSize;
+    private final String remaining;
+    private final SearchControls searchControls;
+    private final String searchBase;
+    private final Integer pageSize;
 
     public LdapProducer(LdapEndpoint endpoint, String remaining, String base, int scope, Integer pageSize,
                         String returnedAttributes) {
@@ -59,17 +59,21 @@ public class LdapProducer extends DefaultProducer {
         this.searchControls = new SearchControls();
         this.searchControls.setSearchScope(scope);
         if (returnedAttributes != null) {
-            String returnedAtts[] = returnedAttributes.split(",");
+            String[] atts = returnedAttributes.split(",");
             if (LOG.isDebugEnabled()) {
-                LOG.debug("Setting returning Attributes to searchControls: {}", Arrays.toString(returnedAtts));
+                LOG.debug("Setting returning Attributes to searchControls: {}", Arrays.toString(atts));
             }
-            searchControls.setReturningAttributes(returnedAtts);
+            searchControls.setReturningAttributes(atts);
         }
     }
 
     @Override
     public void process(Exchange exchange) throws Exception {
         String filter = exchange.getIn().getBody(String.class);
+        if (filter != null) {
+            // filter must be LDAP escaped
+            filter = escapeFilter(filter);
+        }
         DirContext dirContext = getDirContext();
 
         try {
@@ -170,4 +174,51 @@ public class LdapProducer extends DefaultProducer {
         }
     }
 
+    /**
+     * Given an LDAP search string, returns the string with certain characters
+     * escaped according to RFC 2254 guidelines.
+     *
+     * The character mapping is as follows:
+     *     char -&gt;  Replacement
+     *    ---------------------------
+     *     *  -&gt; \2a
+     *     (  -&gt; \28
+     *     )  -&gt; \29
+     *     \  -&gt; \5c
+     *     \0 -&gt; \00
+     *
+     * @param filter string to escape according to RFC 2254 guidelines
+     * @return String the escaped/encoded result
+     */
+    private String escapeFilter(String filter) {
+        if (filter == null) {
+            return null;
+        }
+        StringBuilder buf = new StringBuilder(filter.length());
+        for (int i = 0; i < filter.length(); i++) {
+            char c = filter.charAt(i);
+            switch (c) {
+                case '\\':
+                    buf.append("\\5c");
+                    break;
+                case '*':
+                    buf.append("\\2a");
+                    break;
+                case '(':
+                    buf.append("\\28");
+                    break;
+                case ')':
+                    buf.append("\\29");
+                    break;
+                case '\0':
+                    buf.append("\\00");
+                    break;
+                default:
+                    buf.append(c);
+                    break;
+            }
+        }
+        return buf.toString();
+    }
+
 }