X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.util%2Fsrc%2Forg%2Fargeo%2Futil%2Fdirectory%2Fldap%2FLdifDao.java;h=c200faa27123e6a473beed244a2332dfc5589dab;hb=3c1cdc594d954520b14646102b366290bdad58c7;hp=7387d9e0f9cd52f735ec94625fa296380431d259;hpb=b9810eb23f4e2470952a04c07d15a523c3c61a0e;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java b/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java index 7387d9e0f..c200faa27 100644 --- a/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java +++ b/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java @@ -35,65 +35,21 @@ import org.osgi.service.useradmin.Role; /** A user admin based on a LDIF files. */ public class LdifDao extends AbstractLdapDirectoryDao { -// private NavigableMap users = new TreeMap<>(); -// private NavigableMap groups = new TreeMap<>(); private NavigableMap entries = new TreeMap<>(); - private NavigableMap hierarchy = new TreeMap<>(); -// private List rootHierarchyUnits = new ArrayList<>(); -// public LdifUserAdmin(String uri, String baseDn) { -// this(fromUri(uri, baseDn), false); -// } + private NavigableMap values = new TreeMap<>(); public LdifDao(AbstractLdapDirectory directory) { super(directory); } -// protected LdifUserAdmin(Hashtable properties, boolean scoped) { -// super( properties, scoped); -// } - -// public LdifUserAdmin(URI uri, Dictionary properties) { -// super(uri, properties, false); -// } - -// @Override -// protected AbstractUserDirectory scope(User user) { -// Dictionary credentials = user.getCredentials(); -// String username = (String) credentials.get(SHARED_STATE_USERNAME); -// if (username == null) -// username = user.getName(); -// Object pwdCred = credentials.get(SHARED_STATE_PASSWORD); -// byte[] pwd = (byte[]) pwdCred; -// if (pwd != null) { -// char[] password = DirectoryDigestUtils.bytesToChars(pwd); -// User directoryUser = (User) getRole(username); -// if (!directoryUser.hasCredential(null, password)) -// throw new IllegalStateException("Invalid credentials"); -// } else { -// throw new IllegalStateException("Password is required"); -// } -// Dictionary properties = cloneProperties(); -// properties.put(DirectoryConf.readOnly.name(), "true"); -// LdifUserAdmin scopedUserAdmin = new LdifUserAdmin(properties, true); -//// scopedUserAdmin.groups = Collections.unmodifiableNavigableMap(groups); -//// scopedUserAdmin.users = Collections.unmodifiableNavigableMap(users); -// scopedUserAdmin.entries = Collections.unmodifiableNavigableMap(entries); -// return scopedUserAdmin; -// } - -// private static Dictionary fromUri(String uri, String baseDn) { -// Hashtable res = new Hashtable(); -// res.put(DirectoryConf.uri.name(), uri); -// res.put(DirectoryConf.baseDn.name(), baseDn); -// return res; -// } - public void init() { - + String uri = getDirectory().getUri(); + if (uri == null) + return; try { - URI u = new URI(getDirectory().getUri()); + URI u = new URI(uri); if (u.getScheme().equals("file")) { File file = new File(u); if (!file.exists()) @@ -107,7 +63,7 @@ public class LdifDao extends AbstractLdapDirectoryDao { public void save() { if (getDirectory().getUri() == null) - throw new IllegalStateException("Cannot save LDIF user admin: no URI is set"); + return; // ignore if (getDirectory().isReadOnly()) throw new IllegalStateException( "Cannot save LDIF user admin: " + getDirectory().getUri() + " is read-only"); @@ -123,10 +79,6 @@ public class LdifDao extends AbstractLdapDirectoryDao { LdifWriter ldifWriter = new LdifWriter(out); for (LdapName name : hierarchy.keySet()) ldifWriter.writeEntry(name, hierarchy.get(name).getAttributes()); -// for (LdapName name : groups.keySet()) -// ldifWriter.writeEntry(name, groups.get(name).getAttributes()); -// for (LdapName name : users.keySet()) -// ldifWriter.writeEntry(name, users.get(name).getAttributes()); for (LdapName name : entries.keySet()) ldifWriter.writeEntry(name, entries.get(name).getAttributes()); } finally { @@ -136,8 +88,6 @@ public class LdifDao extends AbstractLdapDirectoryDao { public void load(InputStream in) { try { -// users.clear(); -// groups.clear(); entries.clear(); hierarchy.clear(); @@ -155,6 +105,8 @@ public class LdifDao extends AbstractLdapDirectoryDao { lowerCase.add(id); } + values.put(key, attributes); + // analyse object classes NamingEnumeration objectClasses = attributes.get(objectClass.name()).getAll(); // System.out.println(key); @@ -162,39 +114,19 @@ public class LdifDao extends AbstractLdapDirectoryDao { String objectClass = objectClasses.next().toString(); // System.out.println(" " + objectClass); if (objectClass.toLowerCase().equals(inetOrgPerson.name().toLowerCase())) { - entries.put(key, newUser(key, attributes)); + entries.put(key, newUser(key)); break objectClasses; } else if (objectClass.toLowerCase().equals(getDirectory().getGroupObjectClass().toLowerCase())) { - entries.put(key, newGroup(key, attributes)); + entries.put(key, newGroup(key)); break objectClasses; -// } else if (objectClass.equalsIgnoreCase(LdapObjs.organization.name())) { -// // we only consider organizations which are not groups -// hierarchy.put(key, new LdifHierarchyUnit(this, key, HierarchyUnit.ORGANIZATION, attributes)); -// break objectClasses; } else if (objectClass.equalsIgnoreCase(LdapObjs.organizationalUnit.name())) { -// String name = key.getRdn(key.size() - 1).toStrindirectoryDaog(); -// if (getUserBase().equalsIgnoreCase(name) || getGroupBase().equalsIgnoreCase(name)) -// break objectClasses; // skip // TODO skip if it does not contain groups or users - hierarchy.put(key, new LdapHierarchyUnit(getDirectory(), key, attributes)); + hierarchy.put(key, new LdapHierarchyUnit(getDirectory(), key)); break objectClasses; } } } - // link hierarchy -// hierachyUnits: for (LdapName dn : hierarchy.keySet()) { -// LdifHierarchyUnit unit = hierarchy.get(dn); -// LdapName parentDn = (LdapName) dn.getPrefix(dn.size() - 1); -// LdifHierarchyUnit parent = hierarchy.get(parentDn); -// if (parent == null) { -// rootHierarchyUnits.add(unit); -// unit.parent = null; -// continue hierachyUnits; -// } -// parent.children.add(unit); -// unit.parent = parent; -// } } catch (NamingException | IOException e) { throw new IllegalStateException("Cannot load user admin service from LDIF", e); } @@ -215,10 +147,6 @@ public class LdifDao extends AbstractLdapDirectoryDao { @Override public LdapEntry doGetEntry(LdapName key) throws NameNotFoundException { -// if (groups.containsKey(key)) -// return groups.get(key); -// if (users.containsKey(key)) -// return users.get(key); if (entries.containsKey(key)) return entries.get(key); throw new NameNotFoundException(key + " not persisted"); @@ -226,15 +154,18 @@ public class LdifDao extends AbstractLdapDirectoryDao { @Override public Attributes doGetAttributes(LdapName name) { - try { - return doGetEntry(name).getAttributes(); - } catch (NameNotFoundException e) { - throw new IllegalStateException(name + " doe not exist in " + getDirectory().getBaseDn(), e); - } + if (!values.containsKey(name)) + throw new IllegalStateException(name + " doe not exist in " + getDirectory().getBaseDn()); + return values.get(name); + } + + @Override + public boolean checkConnection() { + return true; } @Override - public Boolean entryExists(LdapName dn) { + public boolean entryExists(LdapName dn) { return entries.containsKey(dn);// || groups.containsKey(dn); } @@ -243,12 +174,8 @@ public class LdifDao extends AbstractLdapDirectoryDao { Objects.requireNonNull(searchBase); ArrayList res = new ArrayList<>(); if (f == null && deep && getDirectory().getBaseDn().equals(searchBase)) { -// res.addAll(users.values()); -// res.addAll(groups.values()); res.addAll(entries.values()); } else { -// filterRoles(users, searchBase, f, deep, res); -// filterRoles(groups, searchBase, f, deep, res); filterRoles(entries, searchBase, f, deep, res); } return res; @@ -309,26 +236,15 @@ public class LdifDao extends AbstractLdapDirectoryDao { for (LdapName dn : wc.getDeletedData().keySet()) { if (entries.containsKey(dn)) entries.remove(dn); -// if (users.containsKey(dn)) -// users.remove(dn); -// else if (groups.containsKey(dn)) -// groups.remove(dn); else throw new IllegalStateException("User to delete not found " + dn); } // add for (LdapName dn : wc.getNewData().keySet()) { LdapEntry user = (LdapEntry) wc.getNewData().get(dn); -// if (users.containsKey(dn) || groups.containsKey(dn)) if (entries.containsKey(dn)) throw new IllegalStateException("User to create found " + dn); entries.put(dn, user); -// else if (Role.USER == user.getType()) -// users.put(dn, user); -// else if (Role.GROUP == user.getType()) -// groups.put(dn, (DirectoryGroup) user); -// else -// throw new IllegalStateException("Unsupported role type " + user.getType() + " for new user " + dn); } // modify for (LdapName dn : wc.getModifiedData().keySet()) { @@ -358,16 +274,6 @@ public class LdifDao extends AbstractLdapDirectoryDao { /* * HIERARCHY */ - -// @Override -// public int getHierarchyChildCount() { -// return rootHierarchyUnits.size(); -// } -// -// @Override -// public HierarchyUnit getHierarchyChild(int i) { -// return rootHierarchyUnits.get(i); -// } @Override public HierarchyUnit doGetHierarchyUnit(LdapName dn) { if (getDirectory().getBaseDn().equals(dn)) @@ -397,20 +303,4 @@ public class LdifDao extends AbstractLdapDirectoryDao { public void scope(LdifDao scoped) { scoped.entries = Collections.unmodifiableNavigableMap(entries); } - -// @Override -// public Iterable getDirectHierarchyUnits(boolean functionalOnly) { -// if (functionalOnly) { -// List res = new ArrayList<>(); -// for (HierarchyUnit hu : rootHierarchyUnits) { -// if (hu.isFunctional()) -// res.add(hu); -// } -// return res; -// -// } else { -// return rootHierarchyUnits; -// } -// } - }