/* * 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.guacamole.auth.ldap; /** * Service for escaping LDAP filters, distinguished names (DN's), etc. * * @author Michael Jumper */ public class EscapingService { /** * Escapes the given string for use within an LDAP search filter. This * implementation is provided courtesy of OWASP: * * https://www.owasp.org/index.php/Preventing_LDAP_Injection_in_Java * * @param filter * The string to escape such that it has no special meaning within an * LDAP search filter. * * @return * The escaped string, safe for use within an LDAP search filter. */ public String escapeLDAPSearchFilter(String filter) { StringBuilder sb = new 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(); } /** * Escapes the given string such that it is safe for use within an LDAP * distinguished name (DN). This implementation is provided courtesy of * OWASP: * * https://www.owasp.org/index.php/Preventing_LDAP_Injection_in_Java * * @param name * The string to escape such that it has no special meaning within an * LDAP DN. * * @return * The escaped string, safe for use within an LDAP DN. */ public 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(); } }