Improve user management
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / util / directory / ldap / DefaultLdapEntry.java
index 8db662393e5ee1fb702664465a2692616ef17e68..c4d20feba922576dc181129ebcd75dae523fbde5 100644 (file)
@@ -32,18 +32,18 @@ public class DefaultLdapEntry implements LdapEntry {
 
        private final LdapName dn;
 
-       private Attributes publishedAttributes;
+//     private Attributes publishedAttributes;
 
        // Temporarily expose the fields
        protected AttributeDictionary properties;
        protected AttributeDictionary credentials;
 
-       protected DefaultLdapEntry(AbstractLdapDirectory directory, LdapName dn, Attributes attributes) {
+       protected DefaultLdapEntry(AbstractLdapDirectory directory, LdapName dn) {
                Objects.requireNonNull(directory);
                Objects.requireNonNull(dn);
                this.directory = directory;
                this.dn = dn;
-               this.publishedAttributes = attributes;
+//             this.publishedAttributes = attributes;
 //             properties = new AttributeDictionary(false);
 //             credentials = new AttributeDictionary(true);
        }
@@ -54,10 +54,10 @@ public class DefaultLdapEntry implements LdapEntry {
        }
 
        public synchronized Attributes getAttributes() {
-               // lazy loading
-               if (publishedAttributes == null)
-                       publishedAttributes = getDirectory().getDirectoryDao().doGetAttributes(dn);
-               return isEditing() ? getModifiedAttributes() : publishedAttributes;
+//             // lazy loading
+//             if (publishedAttributes == null)
+//                     publishedAttributes = getDirectory().getDirectoryDao().doGetAttributes(dn);
+               return isEditing() ? getModifiedAttributes() : getDirectory().getDirectoryDao().doGetAttributes(dn);
        }
 
        @Override
@@ -104,7 +104,7 @@ public class DefaultLdapEntry implements LdapEntry {
        }
 
        public synchronized void publishAttributes(Attributes modifiedAttributes) {
-               publishedAttributes = modifiedAttributes;
+//             publishedAttributes = modifiedAttributes;
        }
 
        /*
@@ -119,7 +119,7 @@ public class DefaultLdapEntry implements LdapEntry {
 
        public Dictionary<String, Object> getCredentials() {
                if (credentials == null)
-                       credentials = new AttributeDictionary(false);
+                       credentials = new AttributeDictionary(true);
                return credentials;
        }
 
@@ -164,7 +164,7 @@ public class DefaultLdapEntry implements LdapEntry {
                        return false;
                }
 
-               Object storedValue = credentials.get(key);
+               Object storedValue = getCredentials().get(key);
                if (storedValue == null || value == null)
                        return false;
                if (!(value instanceof String || value instanceof byte[]))
@@ -374,29 +374,47 @@ public class DefaultLdapEntry implements LdapEntry {
 
                @Override
                public Object put(String key, Object value) {
-                       if (key == null) {
-                               // TODO persist to other sources (like PKCS12)
-                               char[] password = DirectoryDigestUtils.bytesToChars(value);
-                               byte[] hashedPassword = sha1hash(password);
-                               return put(LdapAttrs.userPassword.name(), hashedPassword);
-                       }
-                       if (key.startsWith("X-")) {
-                               return put(LdapAttrs.authPassword.name(), value);
-                       }
+                       try {
+                               if (key == null) {
+                                       // FIXME remove this "feature", a key should be specified
+                                       // TODO persist to other sources (like PKCS12)
+                                       char[] password = DirectoryDigestUtils.bytesToChars(value);
+                                       byte[] hashedPassword = sha1hash(password);
+                                       return put(LdapAttrs.userPassword.name(), hashedPassword);
+                               }
+                               if (key.startsWith("X-")) {
+                                       return put(LdapAttrs.authPassword.name(), value);
+                               }
 
-                       getDirectory().checkEdit();
-                       if (!isEditing())
-                               startEditing();
+                               // start editing
+                               getDirectory().checkEdit();
+                               if (!isEditing())
+                                       startEditing();
+
+                               // object classes special case.
+                               if (key.equals(LdapAttrs.objectClasses.name())) {
+                                       Attribute attribute = new BasicAttribute(LdapAttrs.objectClass.name());
+                                       String[] objectClasses = value.toString().split("\n");
+                                       for (String objectClass : objectClasses) {
+                                               if (objectClass.trim().equals(""))
+                                                       continue;
+                                               attribute.add(objectClass);
+                                       }
+                                       Attribute previousAttribute = getModifiedAttributes().put(attribute);
+                                       if (previousAttribute != null)
+                                               return previousAttribute.get();
+                                       else
+                                               return null;
+                               }
 
-                       if (!(value instanceof String || value instanceof byte[]))
-                               throw new IllegalArgumentException("Value must be String or byte[]");
+                               if (!(value instanceof String || value instanceof byte[]))
+                                       throw new IllegalArgumentException("Value must be String or byte[]");
 
-                       if (includeFilter && !attrFilter.contains(key))
-                               throw new IllegalArgumentException("Key " + key + " not included");
-                       else if (!includeFilter && attrFilter.contains(key))
-                               throw new IllegalArgumentException("Key " + key + " excluded");
+                               if (includeFilter && !attrFilter.contains(key))
+                                       throw new IllegalArgumentException("Key " + key + " not included");
+                               else if (!includeFilter && attrFilter.contains(key))
+                                       throw new IllegalArgumentException("Key " + key + " excluded");
 
-                       try {
                                Attribute attribute = getModifiedAttributes().get(key.toString());
                                // if (attribute == null) // block unit tests
                                attribute = new BasicAttribute(key.toString());