X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fdirectory%2Fldap%2FAbstractLdapDirectory.java;h=39355c3c415248b16076547092cf2cad98a6729a;hb=40f2d6712d120dd62a42b7db3a6f074ce49c83d4;hp=06c33b01129107d2b7d724f59a9646a1a1b4fa18;hpb=54df376a9c2dd458a82eaa09bfbb718fe699dd0d;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java b/org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java index 06c33b011..39355c3c4 100644 --- a/org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java +++ b/org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java @@ -1,6 +1,6 @@ package org.argeo.cms.directory.ldap; -import static org.argeo.cms.directory.ldap.LdapNameUtils.toLdapName; +import static org.argeo.api.acr.ldap.LdapNameUtils.toLdapName; import java.io.File; import java.net.URI; @@ -26,9 +26,10 @@ import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; import javax.transaction.xa.XAResource; -import org.argeo.api.acr.ldap.LdapAttrs; -import org.argeo.api.acr.ldap.LdapObjs; -import org.argeo.api.cms.directory.Directory; +import org.argeo.api.acr.ldap.LdapAttr; +import org.argeo.api.acr.ldap.LdapNameUtils; +import org.argeo.api.acr.ldap.LdapObj; +import org.argeo.api.cms.directory.CmsDirectory; import org.argeo.api.cms.directory.HierarchyUnit; import org.argeo.api.cms.transaction.WorkControl; import org.argeo.api.cms.transaction.WorkingCopyXaResource; @@ -36,8 +37,8 @@ import org.argeo.api.cms.transaction.XAResourceProvider; import org.argeo.cms.osgi.useradmin.OsUserDirectory; import org.argeo.cms.runtime.DirectoryConf; -/** A {@link Directory} based either on LDAP or LDIF. */ -public abstract class AbstractLdapDirectory implements Directory, XAResourceProvider { +/** A {@link CmsDirectory} based either on LDAP or LDIF. */ +public abstract class AbstractLdapDirectory implements CmsDirectory, XAResourceProvider { protected static final String SHARED_STATE_USERNAME = "javax.security.auth.login.name"; protected static final String SHARED_STATE_PASSWORD = "javax.security.auth.login.password"; @@ -56,7 +57,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv private final boolean scoped; private List credentialAttributeIds = Arrays - .asList(new String[] { LdapAttrs.userPassword.name(), LdapAttrs.authPassword.name() }); + .asList(new String[] { LdapAttr.userPassword.name(), LdapAttr.authPassword.name() }); private WorkControl transactionControl; private WorkingCopyXaResource xaResource; @@ -249,7 +250,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv protected void collectGroups(LdapEntry user, List allRoles) { Attributes attrs = user.getAttributes(); // TODO centralize attribute name - Attribute memberOf = attrs.get(LdapAttrs.memberOf.name()); + Attribute memberOf = attrs.get(LdapAttr.memberOf.name()); // if user belongs to this directory, we only check memberOf if (memberOf != null && user.getDn().startsWith(getBaseDn())) { try { @@ -299,6 +300,17 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv return directoryDao.doGetDirectHierarchyUnits(baseDn, functionalOnly); } + @Override + public HierarchyUnit getDirectChild(Type type) { + // TODO factorise with hierarchy unit? + return switch (type) { + case ROLES -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getSystemRoleBaseRdn())); + case PEOPLE -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getUserBaseRdn())); + case GROUPS -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getGroupBaseRdn())); + case FUNCTIONAL -> throw new IllegalArgumentException("Type must be a technical type"); + }; + } + @Override public String getHierarchyUnitName() { return getName(); @@ -320,12 +332,12 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv } @Override - public boolean isFunctional() { - return true; + public boolean isType(Type type) { + return Type.FUNCTIONAL.equals(type); } @Override - public Directory getDirectory() { + public CmsDirectory getDirectory() { return this; } @@ -338,7 +350,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv || wc.getNewData().containsKey(dn)) throw new IllegalArgumentException("Already a hierarchy unit " + path); BasicAttributes attrs = new BasicAttributes(true); - attrs.put(LdapAttrs.objectClass.name(), LdapObjs.organizationalUnit.name()); + attrs.put(LdapAttr.objectClass.name(), LdapObj.organizationalUnit.name()); Rdn nameRdn = dn.getRdn(dn.size() - 1); // TODO deal with multiple attr RDN attrs.put(nameRdn.getType(), nameRdn.getValue()); @@ -385,15 +397,14 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv for (int i = 0; i < segments.length; i++) { String segment = segments[i]; // TODO make attr names configurable ? - String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttrs.cn.name() - : LdapAttrs.ou.name(); + String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttr.cn.name() : LdapAttr.ou.name(); if (parentRdn != null) { if (getUserBaseRdn().equals(parentRdn)) - attr = LdapAttrs.uid.name(); + attr = LdapAttr.uid.name(); else if (getGroupBaseRdn().equals(parentRdn)) - attr = LdapAttrs.cn.name(); + attr = LdapAttr.cn.name(); else if (getSystemRoleBaseRdn().equals(parentRdn)) - attr = LdapAttrs.cn.name(); + attr = LdapAttr.cn.name(); } Rdn rdn = new Rdn(attr, segment); name.add(rdn); @@ -413,13 +424,13 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv return !name.startsWith(baseDn); } - protected static boolean hasObjectClass(Attributes attrs, LdapObjs objectClass) { + protected static boolean hasObjectClass(Attributes attrs, LdapObj objectClass) { return hasObjectClass(attrs, objectClass.name()); } protected static boolean hasObjectClass(Attributes attrs, String objectClass) { try { - Attribute attr = attrs.get(LdapAttrs.objectClass.name()); + Attribute attr = attrs.get(LdapAttr.objectClass.name()); NamingEnumeration en = attr.getAll(); while (en.hasMore()) { String v = en.next().toString();