CONNECTORS-1739: Reuse escaping facilities.
git-svn-id: https://svn.apache.org/repos/asf/manifoldcf/branches/CONNECTORS-1739@1905590 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java
new file mode 100644
index 0000000..beeb982
--- /dev/null
+++ b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java
@@ -0,0 +1,90 @@
+package org.apache.manifoldcf.connectorcommon.common;
+
+/**
+ * Helper class to encode LDAP names and filter values.
+ */
+public class LdapEscaper {
+
+ private LdapEscaper() {
+ // private
+ }
+
+ /**
+ * Escape data for use in a LDAP distinguished name (DN).
+ *
+ * @param name the data to escape for a DN.
+ *
+ * @return name escaped for use in a DN.
+ */
+ public static String escapeDN(String name) {
+ StringBuilder sb = new StringBuilder();
+ if ((name.length() > 0) && ((name.charAt(0) == ' ') || (name.charAt(0) == '#'))) {
+ sb.append('\\'); // add the leading backslash if needed
+ }
+ for (int i = 0; i < name.length(); i++) {
+ char curChar = name.charAt(i);
+ switch (curChar) {
+ case '\\':
+ sb.append("\\\\");
+ break;
+ case ',':
+ sb.append("\\,");
+ break;
+ case '+':
+ sb.append("\\+");
+ break;
+ case '"':
+ sb.append("\\\"");
+ break;
+ case '<':
+ sb.append("\\<");
+ break;
+ case '>':
+ sb.append("\\>");
+ break;
+ case ';':
+ sb.append("\\;");
+ break;
+ default:
+ sb.append(curChar);
+ }
+ }
+ if ((name.length() > 1) && (name.charAt(name.length() - 1) == ' ')) {
+ sb.insert(sb.length() - 1, '\\'); // add the trailing backslash if needed
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Escape data for use in a LDAP filter query.
+ *
+ * @param filter the data to escape for a filter query.
+ *
+ * @return name escaped for use in a filter query.
+ */
+ public static String escapeFilter(String filter) {
+ StringBuilder sb = new StringBuilder(); // If using JDK >= 1.5 consider using StringBuilder
+ for (int i = 0; i < filter.length(); i++) {
+ char curChar = filter.charAt(i);
+ switch (curChar) {
+ case '\\':
+ sb.append("\\5c");
+ break;
+ case '*':
+ sb.append("\\2a");
+ break;
+ case '(':
+ sb.append("\\28");
+ break;
+ case ')':
+ sb.append("\\29");
+ break;
+ case '\u0000':
+ sb.append("\\00");
+ break;
+ default:
+ sb.append(curChar);
+ }
+ }
+ return sb.toString();
+ }}