From d2fc7fa541b15f81c9372813f6ea5ba58c700271 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 14 Nov 2022 10:08:48 +0100 Subject: [PATCH] Improve directory edition --- .../argeo/api/cms/directory/CmsUserManager.java | 2 +- .../org/argeo/api/cms/directory/HierarchyUnit.java | 3 +++ org.argeo.cms/src/org/argeo/cms/SystemRole.java | 6 +++--- .../acr/directory/AbstractDirectoryContent.java | 3 +-- .../acr/directory/DirectoryContentProvider.java | 4 ++++ org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java | 2 +- .../cms/directory/ldap/AbstractLdapDirectory.java | 14 ++++++++++++-- .../cms/directory/ldap/LdapHierarchyUnit.java | 11 +++++++++++ 8 files changed, 36 insertions(+), 9 deletions(-) diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUserManager.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUserManager.java index dc7d382fe..7693f6710 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUserManager.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUserManager.java @@ -84,7 +84,7 @@ public interface CmsUserManager { /** Remove a member from this group. */ void removeMember(CmsGroup group, Role role); - + void edit(Runnable action); /* MISCELLANEOUS */ diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java index 6c67736eb..52509e854 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java @@ -32,6 +32,9 @@ public interface HierarchyUnit { boolean isType(Type type); + /** A technical direct child. */ + HierarchyUnit getDirectChild(Type type); + /** * The base of this organisational unit within the hierarchy. This would * typically be an LDAP base DN. diff --git a/org.argeo.cms/src/org/argeo/cms/SystemRole.java b/org.argeo.cms/src/org/argeo/cms/SystemRole.java index 817bc1ac2..95643998a 100644 --- a/org.argeo.cms/src/org/argeo/cms/SystemRole.java +++ b/org.argeo.cms/src/org/argeo/cms/SystemRole.java @@ -10,18 +10,18 @@ import org.argeo.cms.internal.auth.ImpliedByPrincipal; /** A programmatic role. */ public interface SystemRole { - QName getName(); + QName qName(); /** Whether this role is implied for this authenticated user. */ default boolean implied(Subject subject, String context) { - return implied(getName(), subject, context); + return implied(qName(), subject, context); } /** Whether this role is implied for this distinguished name. */ default boolean implied(String dn, String context) { String roleContext = RoleNameUtils.getContext(dn); QName roleName = RoleNameUtils.getLastRdnAsName(dn); - return roleContext.equalsIgnoreCase(context) && getName().equals(roleName); + return roleContext.equalsIgnoreCase(context) && qName().equals(roleName); } /** diff --git a/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java b/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java index f28842048..b737b50a1 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java @@ -81,8 +81,7 @@ abstract class AbstractDirectoryContent extends AbstractContent { @Override public Object put(QName key, Object value) { Object previous = get(key); - // TODO deal with typing - doGetProperties().put(key.getLocalPart(), value); + provider.getUserManager().edit(() -> doGetProperties().put(key.getLocalPart(), value)); return previous; } diff --git a/org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java b/org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java index 68314b912..8b6eb6bbd 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java @@ -108,6 +108,10 @@ public class DirectoryContentProvider implements ContentProvider { this.userManager = userManager; } + public CmsUserManager getUserManager() { + return userManager; + } + UserManagerContent getRootContent(ProvidedSession session) { return new UserManagerContent(session); } diff --git a/org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java b/org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java index 4c139135a..8834f3587 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java @@ -22,7 +22,7 @@ public enum CmsRole implements SystemRole { } @Override - public QName getName() { + public QName qName() { return name; } 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 1ec6c9de8..5dffcb63a 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 @@ -299,6 +299,17 @@ public abstract class AbstractLdapDirectory implements CmsDirectory, XAResourceP 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(); @@ -385,8 +396,7 @@ public abstract class AbstractLdapDirectory implements CmsDirectory, XAResourceP for (int i = 0; i < segments.length; i++) { String segment = segments[i]; // TODO make attr names configurable ? - String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttr.cn.name() - : LdapAttr.ou.name(); + String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttr.cn.name() : LdapAttr.ou.name(); if (parentRdn != null) { if (getUserBaseRdn().equals(parentRdn)) attr = LdapAttr.uid.name(); diff --git a/org.argeo.cms/src/org/argeo/cms/directory/ldap/LdapHierarchyUnit.java b/org.argeo.cms/src/org/argeo/cms/directory/ldap/LdapHierarchyUnit.java index 0e005133a..b60ee0c68 100644 --- a/org.argeo.cms/src/org/argeo/cms/directory/ldap/LdapHierarchyUnit.java +++ b/org.argeo.cms/src/org/argeo/cms/directory/ldap/LdapHierarchyUnit.java @@ -39,6 +39,17 @@ public class LdapHierarchyUnit extends DefaultLdapEntry implements HierarchyUnit return getDirectoryDao().doGetDirectHierarchyUnits(getDn(), functionalOnly); } + @Override + public HierarchyUnit getDirectChild(Type type) { + return switch (type) { + case ROLES -> + getDirectoryDao().doGetHierarchyUnit((LdapName) getDn().add(getDirectory().getSystemRoleBaseRdn())); + case PEOPLE -> getDirectoryDao().doGetHierarchyUnit((LdapName) getDn().add(getDirectory().getUserBaseRdn())); + case GROUPS -> getDirectoryDao().doGetHierarchyUnit((LdapName) getDn().add(getDirectory().getGroupBaseRdn())); + case FUNCTIONAL -> throw new IllegalArgumentException("Type must be a technical type"); + }; + } + @Override public boolean isType(Type type) { return this.type.equals(type); -- 2.30.2