X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.core%2Fsrc%2Forg%2Fargeo%2Fosgi%2Fuseradmin%2FLdifUserAdmin.java;h=acbf1112f1e24d92b35926420aabc538406ecf5c;hb=b4c3087d7a41cde4a9e92736882b450e51742bf7;hp=e2cf903fca2c17a959c3e065c9927d097e684fdf;hpb=93a457cf047cebb0170abd0f37a9b4291a2ae3e9;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java index e2cf903fc..acbf1112f 100644 --- a/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java +++ b/org.argeo.security.core/src/org/argeo/osgi/useradmin/LdifUserAdmin.java @@ -3,6 +3,12 @@ package org.argeo.osgi.useradmin; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Dictionary; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; @@ -25,6 +31,10 @@ public class LdifUserAdmin implements UserAdmin { private final boolean isReadOnly; private final URI uri; + private List indexedUserProperties = Arrays.asList(new String[] { + "uid", "mail", "cn" }); + private Map> userIndexes = new LinkedHashMap>(); + public LdifUserAdmin(String uri) { this(uri, true); } @@ -75,8 +85,27 @@ public class LdifUserAdmin implements UserAdmin { } // optimise - for (LdifGroup group : groups.values()) { + for (LdifGroup group : groups.values()) group.loadMembers(this); + + // indexes + for (String attr : indexedUserProperties) + userIndexes.put(attr, new TreeMap()); + + for (LdifUser user : users.values()) { + Dictionary properties = user.getProperties(); + for (String attr : indexedUserProperties) { + Object value = properties.get(attr); + if (value != null) { + LdifUser otherUser = userIndexes.get(attr).put( + value.toString(), user); + if (otherUser != null) + throw new ArgeoUserAdminException("User " + user + + " and user " + otherUser + + " both habe property " + attr + + " set to " + value); + } + } } } catch (Exception e) { throw new ArgeoUserAdminException( @@ -126,12 +155,46 @@ public class LdifUserAdmin implements UserAdmin { @Override public Role[] getRoles(String filter) throws InvalidSyntaxException { + if (filter == null) { + ArrayList res = new ArrayList(); + res.addAll(users.values()); + res.addAll(groups.values()); + return res.toArray(new Role[res.size()]); + } throw new UnsupportedOperationException(); } @Override public User getUser(String key, String value) { - throw new UnsupportedOperationException(); + // TODO check value null or empty + if (key != null) { + if (!userIndexes.containsKey(key)) + return null; + return userIndexes.get(key).get(value); + } + + // Try all indexes + List collectedUsers = new ArrayList( + indexedUserProperties.size()); + // try dn + LdifUser user = null; + try { + user = (LdifUser) getRole(value); + if (user != null) + collectedUsers.add(user); + } catch (Exception e) { + // silent + } + for (String attr : userIndexes.keySet()) { + user = userIndexes.get(attr).get(value); + if (user != null) + collectedUsers.add(user); + } + + if (collectedUsers.size() == 1) + return collectedUsers.get(0); + return null; + // throw new UnsupportedOperationException(); } public boolean getIsReadOnly() {