Improve directory edition
authorMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 09:08:48 +0000 (10:08 +0100)
committerMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 09:08:48 +0000 (10:08 +0100)
org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUserManager.java
org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java
org.argeo.cms/src/org/argeo/cms/SystemRole.java
org.argeo.cms/src/org/argeo/cms/acr/directory/AbstractDirectoryContent.java
org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java
org.argeo.cms/src/org/argeo/cms/auth/CmsRole.java
org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java
org.argeo.cms/src/org/argeo/cms/directory/ldap/LdapHierarchyUnit.java

index dc7d382fef774bf6a5f7d2521738e66782781fd8..7693f6710ae840be75e8eb85677d83f17b00c31e 100644 (file)
@@ -84,7 +84,7 @@ public interface CmsUserManager {
 
        /** Remove a member from this group. */
        void removeMember(CmsGroup group, Role role);
-
+       
        void edit(Runnable action);
 
        /* MISCELLANEOUS */
index 6c67736eb89c3599e0786adccf41a394aca349e6..52509e854dcd8d69a067e7c2a5f07214c3b1b92b 100644 (file)
@@ -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.
index 817bc1ac2bcf9fa551e03352d82ac77a64fd6901..95643998af357ddef16bf25057b895a4269743e8 100644 (file)
@@ -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);
        }
 
        /**
index f288420481a4c33329f5da830d7ee5522c4afd08..b737b50a1ea48ca63bb1eddcfd544d6c55d5778e 100644 (file)
@@ -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;
        }
 
index 68314b91210da4d4fc96cd4bbe345d720b627b1f..8b6eb6bbd4b2d8e73413dfa5aaae82383f44a472 100644 (file)
@@ -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);
        }
index 4c139135a11fdc90e5339c9e4108fb0a0474f60a..8834f3587bb2b55886c6b2920e38bb99ac712df1 100644 (file)
@@ -22,7 +22,7 @@ public enum CmsRole implements SystemRole {
        }
 
        @Override
-       public QName getName() {
+       public QName qName() {
                return name;
        }
 
index 1ec6c9de8eebb886c6edcddff4464c530cd4b0bd..5dffcb63aa61550cc7606e837c835c678a2ca5b7 100644 (file)
@@ -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();
index 0e005133a10aec011b39316ba21567c85475ec3f..b60ee0c68935cc3e08248f1a69902b8d6aebe393 100644 (file)
@@ -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);