]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifWriter.java
Fix glitches while testing the Security Perspective with LDAP backend
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / LdifWriter.java
index 001d78d8b13a97e2f86a905dac9828a1fcc67679..ba393cad13ba1992bde1dba35a35c682ded31563 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.osgi.useradmin;
 
+import static org.argeo.osgi.useradmin.LdifName.dn;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -10,6 +12,7 @@ import javax.naming.NamingException;
 import javax.naming.directory.Attribute;
 import javax.naming.directory.Attributes;
 import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
 
 import org.apache.commons.codec.binary.Base64;
 
@@ -17,21 +20,28 @@ import org.apache.commons.codec.binary.Base64;
 class LdifWriter {
        private final Writer writer;
 
-       public LdifWriter(OutputStream out) {
+       LdifWriter(OutputStream out) {
                this.writer = new OutputStreamWriter(out);
        }
 
        void writeEntry(LdapName name, Attributes attributes) throws IOException {
                try {
-                       // TODO check consistency of DN with attributes
-                       writer.append("dn:").append(name.toString()).append('\n');
+                       // check consistency
+                       Rdn nameRdn = name.getRdn(name.size() - 1);
+                       Attribute nameAttr = attributes.get(nameRdn.getType());
+                       if (!nameAttr.get().equals(nameRdn.getValue()))
+                               throw new UserDirectoryException("Attribute "
+                                               + nameAttr.getID() + "=" + nameAttr.get()
+                                               + " not consistent with DN " + name);
+
+                       writer.append(dn.name() + ":").append(name.toString()).append('\n');
                        Attribute objectClassAttr = attributes.get("objectClass");
                        if (objectClassAttr != null)
                                writeAttribute(objectClassAttr);
                        for (NamingEnumeration<? extends Attribute> attrs = attributes
                                        .getAll(); attrs.hasMore();) {
                                Attribute attribute = attrs.next();
-                               if (attribute.getID().equals("dn")
+                               if (attribute.getID().equals(dn.name())
                                                || attribute.getID().equals("objectClass"))
                                        continue;// skip DN attribute
                                writeAttribute(attribute);