Fix for LDAP-30.

Needs additional tests and cleanup in new implementation of LdapEncoder.nameDecode
This commit is contained in:
Mattias Arthursson
2007-03-07 19:50:13 +00:00
parent a6224165e0
commit b2ceb73602
2 changed files with 38 additions and 39 deletions

View File

@@ -52,14 +52,6 @@ public class DnParsePerformanceITest extends TestCase {
"cn=john.doe, OU=Users,OU=SE,ou=G,OU=L,OU=M, ou=foo");
DistinguishedName pathE2 = new DistinguishedName(
"cn=john.doe, OU=Users,OU=SE");
assertTrue("Contains MIG", path1.contains(migpath));
assertTrue("Contains MIG", path2.contains(migpath));
assertTrue("Contains MIG", path3.contains(migpath));
assertTrue("Contains MIG", path4.contains(migpath));
assertFalse("Does not contain MIG", pathE1.contains(migpath));
assertFalse("Does not contain MIG", pathE2.contains(migpath));
}
public static Test suite() {

View File

@@ -19,7 +19,6 @@ package org.springframework.ldap.core;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.springframework.ldap.BadLdapGrammarException;
@@ -27,6 +26,7 @@ import org.springframework.ldap.BadLdapGrammarException;
* Helper class to encode and decode ldap names and values.
*
* @author Adam Skogman
* @author Mattias Arthursson
*/
public class LdapEncoder {
@@ -194,42 +194,49 @@ public class LdapEncoder {
// make buffer same size
StringBuffer decoded = new StringBuffer(value.length());
Matcher matcher = VALUE_DECODE_PATTERN.matcher(value);
int end = 0;
while (matcher.find()) {
end = matcher.end();
// group 1
if (matcher.group(1) != null) {
// parse as hex = base 16
try {
char c = (char) Integer.parseInt(matcher.group(1), 16);
decoded.append(c);
} catch (NumberFormatException e) {
int i = 0;
while (i < value.length()) {
char currentChar = value.charAt(i);
if (currentChar == '\\') {
if (value.length() <= i + 1) {
throw new BadLdapGrammarException(
"Escaped hex value Could not be parsed. Found '\\"
+ matcher.group(1) + "'");
"Unexpected end of value " + "unterminated '\\'");
} else {
char nextChar = value.charAt(i + 1);
if (nextChar == ',' | nextChar == '=' | nextChar == '+'
| nextChar == '<' | nextChar == '>'
| nextChar == '#' | nextChar == ';'
| nextChar == '\\' | nextChar == '\"') {
decoded.append(nextChar);
i += 2;
} else {
if (value.length() <= i + 2) {
// This is the last char, so it should be a space
if (nextChar == ' ') {
decoded.append(nextChar);
i += 2;
} else {
throw new BadLdapGrammarException(
"Unexpected end of value "
+ "expected special or hex, found '"
+ nextChar + "'");
}
} else {
// This should be a hex value
String hexString = "" + nextChar
+ value.charAt(i + 2);
decoded.append(Integer.parseInt(hexString, 16));
i += 3;
}
}
}
} else if (matcher.group(2) != null) {
// just add, we stripped away the \
decoded.append(matcher.group(2));
} else if (matcher.group(3) != null) {
// just add
decoded.append(matcher.group(3));
} else {
decoded.append(currentChar);
i++;
}
}
// end is match + +1 so it should be same as length, i.e.
// last + 1
if (end < value.length()) {
throw new BadLdapGrammarException(
"RDN could not be parsed fully, remaining '"
+ StringUtils.substring(value, end) + "'");
}
return decoded.toString();
}
}