From: Mathieu Baudier Date: Mon, 24 Aug 2015 15:29:13 +0000 (+0000) Subject: Fix: LDIF parser manages last entry properly. X-Git-Tag: argeo-commons-2.1.30~196 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=526ad82ec71f69802d53a68326b4892a8dc84db9;p=lgpl%2Fargeo-commons.git Fix: LDIF parser manages last entry properly. git-svn-id: https://svn.argeo.org/commons/trunk@8333 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/LdifParserTest.java b/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/LdifParserTest.java index dd32dca17..6a579668a 100644 --- a/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/LdifParserTest.java +++ b/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/LdifParserTest.java @@ -1,15 +1,19 @@ package org.argeo.osgi.useradmin; +import java.util.ArrayList; +import java.util.List; import java.util.SortedMap; +import javax.naming.NamingEnumeration; +import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.ldap.LdapName; +import junit.framework.TestCase; + import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; -import junit.framework.TestCase; - public class LdifParserTest extends TestCase { public void testSimpleLdif() throws Exception { LdifParser ldifParser = new LdifParser(); @@ -27,5 +31,19 @@ public class LdifParserTest extends TestCase { assertEquals("{SHA}" + Base64.encodeBase64String(hashedPassword), new String(rawPwEntry)); + LdapName adminDn = new LdapName( + "cn=admin,ou=Roles,dc=demo,dc=example,dc=org"); + Attributes adminAttributes = res.get(adminDn); + assertNotNull(adminAttributes); + Attribute memberAttribute = adminAttributes.get("member"); + assertNotNull(memberAttribute); + NamingEnumeration members = memberAttribute.getAll(); + List users = new ArrayList(); + while (members.hasMore()) { + Object value = members.next(); + users.add(value.toString()); + } + assertEquals(1, users.size()); + assertEquals(rootDn, new LdapName(users.get(0))); } } diff --git a/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/test.ldif b/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/test.ldif index 0d2e8ba8f..a5526a056 100644 --- a/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/test.ldif +++ b/org.argeo.security.core/ext/test/org/argeo/osgi/useradmin/test.ldif @@ -44,4 +44,4 @@ dn: cn=admin,ou=Roles,dc=demo,dc=example,dc=org objectClass: groupOfNames objectClass: top cn: admin -member: uid=root,ou=People,dc=demo,dc=example,dc=org +member: uid=root,ou=People,dc=demo,dc=example,dc=org \ No newline at end of file diff --git a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifParser.java b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifParser.java index 1e9390a5c..38c37312f 100644 --- a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifParser.java +++ b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifParser.java @@ -26,50 +26,62 @@ class LdifParser { SortedMap res = new TreeMap(); try { List lines = IOUtils.readLines(in); + // add an empty new line since the last line is not checked + if (!lines.get(lines.size() - 1).equals("")) + lines.add(""); LdapName currentDn = null; Attributes currentAttributes = null; StringBuilder currentEntry = new StringBuilder(); - readLines: for (String line : lines) { + readLines: for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { + String line = lines.get(lineNumber); + boolean isLastLine = false; + if (lineNumber == lines.size() - 1) + isLastLine = true; if (line.startsWith(" ")) { currentEntry.append(line.substring(1)); - continue readLines; - } else { - if (currentEntry.length() != 0) { - // read previous attribute - StringBuilder attrId = new StringBuilder(8); - boolean isBase64 = false; - readAttrId: for (int i = 0; i < currentEntry.length(); i++) { - char c = currentEntry.charAt(i); - if (c == ':') { - if (i + 1 < currentEntry.length() - && currentEntry.charAt(i + 1) == ':') - isBase64 = true; - currentEntry.delete(0, i + (isBase64 ? 2 : 1)); - break readAttrId; - } else { - attrId.append(c); - } + if (!isLastLine) + continue readLines; + } + + if (currentEntry.length() != 0 || isLastLine) { + // read previous attribute + StringBuilder attrId = new StringBuilder(8); + boolean isBase64 = false; + readAttrId: for (int i = 0; i < currentEntry.length(); i++) { + char c = currentEntry.charAt(i); + if (c == ':') { + if (i + 1 < currentEntry.length() + && currentEntry.charAt(i + 1) == ':') + isBase64 = true; + currentEntry.delete(0, i + (isBase64 ? 2 : 1)); + break readAttrId; + } else { + attrId.append(c); } + } - String attributeId = attrId.toString(); - String cleanValueStr = currentEntry.toString().trim(); - Object attributeValue = isBase64 ? Base64 - .decodeBase64(cleanValueStr) : cleanValueStr; + String attributeId = attrId.toString(); + String cleanValueStr = currentEntry.toString().trim(); + Object attributeValue = isBase64 ? Base64 + .decodeBase64(cleanValueStr) : cleanValueStr; - // manage DN attributes - if (attributeId.equals("dn")) { - if (currentDn != null) { - Attributes previous = res.put(currentDn, - currentAttributes); - if (previous != null) { - log.warn("There was already an entry with DN " - + currentDn - + ", which has been discarded by a subsequent one."); - } + // manage DN attributes + if (attributeId.equals("dn") || isLastLine) { + if (currentDn != null) { + Attributes previous = res.put(currentDn, + currentAttributes); + if (log.isDebugEnabled()) + log.debug("Added " + currentDn); + if (previous != null) { + log.warn("There was already an entry with DN " + + currentDn + + ", which has been discarded by a subsequent one."); } + } + if (attributeId.equals("dn")) try { currentDn = new LdapName( attributeValue.toString()); @@ -80,22 +92,21 @@ class LdifParser { currentDn = null; currentAttributes = null; } - } + } - // store attribute - if (currentAttributes != null) { - Attribute attribute = currentAttributes - .get(attributeId); - if (attribute == null) { - attribute = new BasicAttribute(attributeId); - currentAttributes.put(attribute); - } - attribute.add(attributeValue); + // store attribute + if (currentAttributes != null) { + Attribute attribute = currentAttributes + .get(attributeId); + if (attribute == null) { + attribute = new BasicAttribute(attributeId); + currentAttributes.put(attribute); } - currentEntry = new StringBuilder(); + attribute.add(attributeValue); } - currentEntry.append(line); + currentEntry = new StringBuilder(); } + currentEntry.append(line); } } finally { IOUtils.closeQuietly(in);