]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java
Fix issue with propagating user removal.
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / LdifUserAdmin.java
index fa4526ac6a6084b20464964831bf8b8bdefaeee6..a03a25f09e5ce58fc21208f9817608d75df54fdb 100644 (file)
@@ -8,28 +8,26 @@ import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.Hashtable;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import javax.naming.InvalidNameException;
 import javax.naming.NamingEnumeration;
 import javax.naming.directory.Attributes;
 import javax.naming.ldap.LdapName;
+import javax.transaction.TransactionManager;
 
 import org.apache.commons.io.IOUtils;
 import org.osgi.framework.Filter;
 import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
 
-/** User admin implementation using LDIF file(s) as backend. */
+/**
+ * A user admin based on a LDIF files. Requires a {@link TransactionManager} and
+ * an open transaction for write access.
+ */
 public class LdifUserAdmin extends AbstractUserDirectory {
-       SortedMap<LdapName, DirectoryUser> users = new TreeMap<LdapName, DirectoryUser>();
-       SortedMap<LdapName, DirectoryGroup> groups = new TreeMap<LdapName, DirectoryGroup>();
-
-       private Map<String, Map<String, DirectoryUser>> userIndexes = new LinkedHashMap<String, Map<String, DirectoryUser>>();
+       private SortedMap<LdapName, DirectoryUser> users = new TreeMap<LdapName, DirectoryUser>();
+       private SortedMap<LdapName, DirectoryGroup> groups = new TreeMap<LdapName, DirectoryGroup>();
 
        public LdifUserAdmin(String uri, String baseDn) {
                this(fromUri(uri, baseDn));
@@ -48,8 +46,8 @@ public class LdifUserAdmin extends AbstractUserDirectory {
 
        private static Dictionary<String, Object> fromUri(String uri, String baseDn) {
                Hashtable<String, Object> res = new Hashtable<String, Object>();
-               res.put(UserAdminProps.uri.property(), uri);
-               res.put(UserAdminProps.baseDn.property(), baseDn);
+               res.put(UserAdminConf.uri.property(), uri);
+               res.put(UserAdminConf.baseDn.property(), baseDn);
                return res;
        }
 
@@ -89,7 +87,6 @@ public class LdifUserAdmin extends AbstractUserDirectory {
                }
        }
 
-       @SuppressWarnings("unchecked")
        protected void load(InputStream in) {
                try {
                        users.clear();
@@ -112,26 +109,6 @@ public class LdifUserAdmin extends AbstractUserDirectory {
                                        }
                                }
                        }
-
-                       // indexes
-                       for (String attr : getIndexedUserProperties())
-                               userIndexes.put(attr, new TreeMap<String, DirectoryUser>());
-
-                       for (DirectoryUser user : users.values()) {
-                               Dictionary<String, ?> properties = user.getProperties();
-                               for (String attr : getIndexedUserProperties()) {
-                                       Object value = properties.get(attr);
-                                       if (value != null) {
-                                               DirectoryUser otherUser = userIndexes.get(attr).put(
-                                                               value.toString(), user);
-                                               if (otherUser != null)
-                                                       throw new UserDirectoryException("User " + user
-                                                                       + " and user " + otherUser
-                                                                       + " both have property " + attr
-                                                                       + " set to " + value);
-                                       }
-                               }
-                       }
                } catch (Exception e) {
                        throw new UserDirectoryException(
                                        "Cannot load user admin service from LDIF", e);
@@ -175,32 +152,13 @@ public class LdifUserAdmin extends AbstractUserDirectory {
                return res;
        }
 
-       protected void doGetUser(String key, String value,
-                       List<DirectoryUser> collectedUsers) {
-               assert key != null;
-               DirectoryUser user = userIndexes.get(key).get(value);
-               if (user != null)
-                       collectedUsers.add(user);
-       }
-
        @Override
-       protected List<DirectoryGroup> getDirectGroups(User user) {
-               LdapName dn;
-               if (user instanceof LdifUser)
-                       dn = ((LdifUser) user).getDn();
-               else
-                       try {
-                               dn = new LdapName(user.getName());
-                       } catch (InvalidNameException e) {
-                               throw new UserDirectoryException("Badly formatted user name "
-                                               + user.getName(), e);
-                       }
-
-               List<DirectoryGroup> directGroups = new ArrayList<DirectoryGroup>();
+       protected List<LdapName> getDirectGroups(LdapName dn) {
+               List<LdapName> directGroups = new ArrayList<LdapName>();
                for (LdapName name : groups.keySet()) {
                        DirectoryGroup group = groups.get(name);
                        if (group.getMemberNames().contains(dn))
-                               directGroups.add(group);
+                               directGroups.add(group.getDn());
                }
                return directGroups;
        }