Introduce CMS-specific user APIs, based at this stage on OSGi UserAdmin
authorMathieu <mbaudier@argeo.org>
Sat, 12 Nov 2022 06:52:01 +0000 (07:52 +0100)
committerMathieu <mbaudier@argeo.org>
Sat, 12 Nov 2022 06:52:01 +0000 (07:52 +0100)
API

24 files changed:
org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsAuthorization.java [new file with mode: 0644]
org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsDirectory.java [new file with mode: 0644]
org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsGroup.java [new file with mode: 0644]
org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUser.java [new file with mode: 0644]
org.argeo.api.cms/src/org/argeo/api/cms/directory/Directory.java [deleted file]
org.argeo.api.cms/src/org/argeo/api/cms/directory/HierarchyUnit.java
org.argeo.api.cms/src/org/argeo/api/cms/directory/UserDirectory.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/CmsUserManager.java
org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java
org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContent.java
org.argeo.cms/src/org/argeo/cms/acr/directory/DirectoryContentProvider.java
org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java
org.argeo.cms/src/org/argeo/cms/acr/directory/RoleContent.java
org.argeo.cms/src/org/argeo/cms/directory/ldap/AbstractLdapDirectory.java
org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java
org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserAdmin.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/AggregatingAuthorization.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/AggregatingUserAdmin.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryGroup.java [deleted file]
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryUser.java [deleted file]
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryUserAdmin.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifGroup.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/LdifUser.java
org.argeo.cms/src/org/argeo/cms/osgi/useradmin/UserDirectory.java [deleted file]

diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsAuthorization.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsAuthorization.java
new file mode 100644 (file)
index 0000000..5d3a695
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.api.cms.directory;
+
+import org.osgi.service.useradmin.Authorization;
+
+/** An authorisation to a CMS system. */
+public interface CmsAuthorization extends Authorization {
+       /** The role which did imply this role, <code>null</code> if a direct role. */
+       default String getImplyingRole(String role) {
+               return null;
+       }
+}
diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsDirectory.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsDirectory.java
new file mode 100644 (file)
index 0000000..f5b78ac
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.api.cms.directory;
+
+import java.util.Optional;
+
+import org.argeo.api.cms.transaction.WorkControl;
+
+/** An information directory (typically LDAP). */
+public interface CmsDirectory extends HierarchyUnit {
+       String getName();
+
+       /** Whether this directory is read only. */
+       boolean isReadOnly();
+
+       /** Whether this directory is disabled. */
+       boolean isDisabled();
+
+       /** The realm (typically Kerberos) of this directory. */
+       Optional<String> getRealm();
+
+       /** Sets the transaction control used by this directory when editing. */
+       void setTransactionControl(WorkControl transactionControl);
+
+       /*
+        * HIERARCHY
+        */
+
+       /** The hierarchy unit at this path. */
+       HierarchyUnit getHierarchyUnit(String path);
+
+       /** Create a new hierarchy unit. */
+       HierarchyUnit createHierarchyUnit(String path);
+}
diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsGroup.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsGroup.java
new file mode 100644 (file)
index 0000000..410d391
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.api.cms.directory;
+
+import org.osgi.service.useradmin.Group;
+
+/** A group in a user directroy. */
+public interface CmsGroup extends Group, CmsUser {
+//     List<LdapName> getMemberNames();
+}
diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUser.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/CmsUser.java
new file mode 100644 (file)
index 0000000..f8f40a1
--- /dev/null
@@ -0,0 +1,10 @@
+package org.argeo.api.cms.directory;
+
+import org.osgi.service.useradmin.User;
+
+/**
+ * An entity with credentials which can log in to a system. Can be a real person
+ * or not.
+ */
+public interface CmsUser extends User {
+}
diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/Directory.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/Directory.java
deleted file mode 100644 (file)
index 7ed61eb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.argeo.api.cms.directory;
-
-import java.util.Optional;
-
-import org.argeo.api.cms.transaction.WorkControl;
-
-/** An information directory (typicylly LDAP). */
-public interface Directory extends HierarchyUnit {
-       String getName();
-
-       /** Whether this directory is read only. */
-       boolean isReadOnly();
-
-       /** Whether this directory is disabled. */
-       boolean isDisabled();
-
-       /** The realm (typically Kerberos) of this directory. */
-       Optional<String> getRealm();
-
-       /** Sets the transaction control used by this directory when editing. */
-       void setTransactionControl(WorkControl transactionControl);
-
-       /*
-        * HIERARCHY
-        */
-
-       /** The hierarchy unit at this path. */
-       HierarchyUnit getHierarchyUnit(String path);
-
-       /** Create a new hierarchy unit. */
-       HierarchyUnit createHierarchyUnit(String path);
-}
index f04dc4648637f9ca3c3197f584f7e70b41411998..6c67736eb89c3599e0786adccf41a394aca349e6 100644 (file)
@@ -13,7 +13,7 @@ public interface HierarchyUnit {
 
        /**
         * The parent {@link HierarchyUnit}, or <code>null</code> if a
-        * {@link Directory}.
+        * {@link CmsDirectory}.
         */
        HierarchyUnit getParent();
 
@@ -38,8 +38,8 @@ public interface HierarchyUnit {
         */
        String getBase();
 
-       /** The related {@link Directory}. */
-       Directory getDirectory();
+       /** The related {@link CmsDirectory}. */
+       CmsDirectory getDirectory();
 
        /** Its metadata (typically LDAP attributes). */
        Dictionary<String, Object> getProperties();
diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/directory/UserDirectory.java b/org.argeo.api.cms/src/org/argeo/api/cms/directory/UserDirectory.java
new file mode 100644 (file)
index 0000000..1f0ecdf
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.api.cms.directory;
+
+import org.osgi.service.useradmin.Role;
+
+/** Information about a user directory. */
+public interface UserDirectory extends CmsDirectory {
+
+       HierarchyUnit getHierarchyUnit(Role role);
+
+       Iterable<? extends Role> getHierarchyUnitRoles(HierarchyUnit hierarchyUnit, String filter, boolean deep);
+
+       String getRolePath(Role role);
+
+       String getRoleSimpleName(Role role);
+
+       Role getRoleByPath(String path);
+}
index 3e7d31e3e3e3dc291030a2e06e91743b80eb9c7c..2d64d9db02e2a6d4fdc06adc132894d2964098b2 100644 (file)
@@ -7,11 +7,12 @@ import java.util.Set;
 
 import javax.security.auth.Subject;
 
+import org.argeo.api.cms.directory.CmsGroup;
+import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.auth.SystemRole;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
 import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 
@@ -30,7 +31,7 @@ public interface CmsUserManager {
 
        // Other users
        /** Returns a {@link User} given a username */
-       User getUser(String username);
+       CmsUser getUser(String username);
 
        /** Can be a group or a user */
        String getUserDisplayName(String dn);
@@ -49,10 +50,10 @@ public interface CmsUserManager {
        Role[] getRoles(String filter) throws InvalidSyntaxException;
 
        /** Recursively lists users in a given group. */
-       Set<User> listUsersInGroup(String groupDn, String filter);
+       Set<CmsUser> listUsersInGroup(String groupDn, String filter);
 
        /** Search among groups including system roles and users if needed */
-       List<User> listGroups(String filter, boolean includeUsers, boolean includeSystemRoles);
+       List<CmsUser> listGroups(String filter, boolean includeUsers, boolean includeSystemRoles);
 
 //     /**
 //      * Lists functional accounts, that is users with regular access to the system
@@ -65,13 +66,13 @@ public interface CmsUserManager {
         * EDITION
         */
        /** Creates a new user. */
-       User createUser(String username, Map<String, Object> properties, Map<String, Object> credentials);
+       CmsUser createUser(String username, Map<String, Object> properties, Map<String, Object> credentials);
 
        /** Creates a group. */
-       Group getOrCreateGroup(HierarchyUnit groups, String commonName);
+       CmsGroup getOrCreateGroup(HierarchyUnit groups, String commonName);
 
        /** Creates a new system role. */
-       Group getOrCreateSystemRole(HierarchyUnit roles, SystemRole systemRole);
+       CmsGroup getOrCreateSystemRole(HierarchyUnit roles, SystemRole systemRole);
 
        /** Add additional object classes to this role. */
        void addObjectClasses(Role role, Set<String> objectClasses, Map<String, Object> additionalProperties);
@@ -81,8 +82,8 @@ public interface CmsUserManager {
                        Map<String, Object> additionalProperties);
 
        /** Add a member to this group. */
-       void addMember(Group group, Role role);
-       
+       void addMember(CmsGroup group, Role role);
+
        void edit(Runnable action);
 
        /* MISCELLANEOUS */
@@ -97,7 +98,7 @@ public interface CmsUserManager {
         * to localId within the various user repositories defined in the current
         * context.
         */
-       User getUserFromLocalId(String localId);
+       CmsUser getUserFromLocalId(String localId);
 
        void changeOwnPassword(char[] oldPassword, char[] newPassword);
 
index a6acb8a34bc9505e2c44badbbfe65b94941c2d5e..ed27ce8e8366a24c5fcd2ce0e285026c3ff1afa9 100644 (file)
@@ -15,10 +15,10 @@ import org.argeo.api.acr.ContentRepository;
 import org.argeo.api.acr.ContentSession;
 import org.argeo.api.acr.DName;
 import org.argeo.api.cms.CmsAuth;
-import org.argeo.api.cms.directory.Directory;
+import org.argeo.api.cms.directory.CmsDirectory;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
 import org.argeo.cms.util.CurrentSubject;
 import org.osgi.service.useradmin.Role;
 
@@ -135,7 +135,7 @@ public class ContentUtils {
        }
 
        public static Content hierarchyUnitToContent(ContentSession contentSession, HierarchyUnit hierarchyUnit) {
-               Directory directory = hierarchyUnit.getDirectory();
+               CmsDirectory directory = hierarchyUnit.getDirectory();
                StringJoiner relativePath = new StringJoiner(SLASH_STRING);
                buildHierarchyUnitPath(hierarchyUnit, relativePath);
                String path = directoryPath(directory) + relativePath.toString();
@@ -143,8 +143,8 @@ public class ContentUtils {
                return content;
        }
 
-       /** The path to this {@link Directory}. Ends with a /. */
-       private static String directoryPath(Directory directory) {
+       /** The path to this {@link CmsDirectory}. Ends with a /. */
+       private static String directoryPath(CmsDirectory directory) {
                return CmsContentRepository.DIRECTORY_BASE + SLASH + directory.getName() + SLASH;
        }
 
index 992f0b41b2eedd87b06baf5ef6fac20c22ce83e2..50eea156d52442e6e406341d5aeaf105783c7d14 100644 (file)
@@ -10,13 +10,13 @@ import javax.xml.namespace.QName;
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.spi.ProvidedSession;
-import org.argeo.api.cms.directory.Directory;
+import org.argeo.api.cms.directory.CmsDirectory;
 import org.argeo.api.cms.directory.HierarchyUnit;
 
 class DirectoryContent extends AbstractDirectoryContent {
-       private Directory directory;
+       private CmsDirectory directory;
 
-       public DirectoryContent(ProvidedSession session, DirectoryContentProvider provider, Directory directory) {
+       public DirectoryContent(ProvidedSession session, DirectoryContentProvider provider, CmsDirectory directory) {
                super(session, provider);
                this.directory = directory;
        }
index 08171435cbb8ade0442f534f9206c0dcbd11edc2..9af83a33072bf2fc56695beae5e992942b15fff4 100644 (file)
@@ -15,10 +15,10 @@ import org.argeo.api.acr.spi.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.acr.AbstractContent;
 import org.argeo.cms.acr.ContentUtils;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
 import org.osgi.service.useradmin.User;
 
 public class DirectoryContentProvider implements ContentProvider {
index feae4b5176dcbe318b1e28def01928c81a5b026e..5acf8ab63fc07711f1956ed4fa3380c952f294a5 100644 (file)
@@ -13,9 +13,9 @@ import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.DName;
 import org.argeo.api.acr.spi.ProvidedSession;
-import org.argeo.api.cms.directory.Directory;
+import org.argeo.api.cms.directory.CmsDirectory;
 import org.argeo.api.cms.directory.HierarchyUnit;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.osgi.service.useradmin.Role;
 
 class HierarchyUnitContent extends AbstractDirectoryContent {
@@ -46,7 +46,7 @@ class HierarchyUnitContent extends AbstractDirectoryContent {
        @Override
        public Content getParent() {
                HierarchyUnit parentHu = hierarchyUnit.getParent();
-               if (parentHu instanceof Directory) {
+               if (parentHu instanceof CmsDirectory) {
                        return new DirectoryContent(getSession(), provider, hierarchyUnit.getDirectory());
                }
                return new HierarchyUnitContent(getSession(), provider, parentHu);
index 3b1ae46b29b5dfd31fe3cbc89f00c72bcffa2b0d..356e272c90adeae7db1d120f238be7f83d239f06 100644 (file)
@@ -7,7 +7,7 @@ import javax.xml.namespace.QName;
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.spi.ProvidedSession;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
index 9bc13ef00a9cb90a5077b0e904229fdf0b4c8b00..9c7b047dcbcedaedfcade31a5b361393f255e3ae 100644 (file)
@@ -28,7 +28,7 @@ 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.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 +36,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";
 
@@ -325,7 +325,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
        }
 
        @Override
-       public Directory getDirectory() {
+       public CmsDirectory getDirectory() {
                return this;
        }
 
index a4c482663e73c86d19f236825317b379fee2e05c..b5ee9b306d1b65f9ec5738f8f2467a5ba33380eb 100644 (file)
@@ -29,7 +29,10 @@ import org.argeo.api.acr.ldap.LdapAttrs;
 import org.argeo.api.acr.ldap.NamingUtils;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.directory.CmsGroup;
+import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.api.cms.transaction.WorkTransaction;
 import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.auth.CurrentUser;
@@ -39,7 +42,6 @@ import org.argeo.cms.directory.ldap.LdapEntry;
 import org.argeo.cms.directory.ldap.SharedSecret;
 import org.argeo.cms.osgi.useradmin.AggregatingUserAdmin;
 import org.argeo.cms.osgi.useradmin.TokenUtils;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
 import org.argeo.cms.runtime.DirectoryConf;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Authorization;
@@ -96,8 +98,8 @@ public class CmsUserManagerImpl implements CmsUserManager {
        // ALL USER: WARNING access to this will be later reduced
 
        /** Retrieve a user given his dn, or <code>null</code> if it doesn't exist. */
-       public User getUser(String dn) {
-               return (User) getUserAdmin().getRole(dn);
+       public CmsUser getUser(String dn) {
+               return (CmsUser) getUserAdmin().getRole(dn);
        }
 
        /** Can be a group or a user */
@@ -132,11 +134,11 @@ public class CmsUserManagerImpl implements CmsUserManager {
                return false;
        }
 
-       public Set<User> listUsersInGroup(String groupDn, String filter) {
+       public Set<CmsUser> listUsersInGroup(String groupDn, String filter) {
                Group group = (Group) userAdmin.getRole(groupDn);
                if (group == null)
                        throw new IllegalArgumentException("Group " + groupDn + " not found");
-               Set<User> users = new HashSet<User>();
+               Set<CmsUser> users = new HashSet<>();
                addUsers(users, group, filter);
                return users;
        }
@@ -158,21 +160,21 @@ public class CmsUserManagerImpl implements CmsUserManager {
 //     }
 
        /** Recursively add users to list */
-       private void addUsers(Set<User> users, Group group, String filter) {
+       private void addUsers(Set<CmsUser> users, Group group, String filter) {
                Role[] roles = group.getMembers();
                for (Role role : roles) {
                        if (role.getType() == Role.GROUP) {
-                               addUsers(users, (Group) role, filter);
+                               addUsers(users, (CmsGroup) role, filter);
                        } else if (role.getType() == Role.USER) {
                                if (match(role, filter))
-                                       users.add((User) role);
+                                       users.add((CmsUser) role);
                        } else {
                                // ignore
                        }
                }
        }
 
-       public List<User> listGroups(String filter, boolean includeUsers, boolean includeSystemRoles) {
+       public List<CmsUser> listGroups(String filter, boolean includeUsers, boolean includeSystemRoles) {
                Role[] roles = null;
                try {
                        roles = getUserAdmin().getRoles(filter);
@@ -180,13 +182,13 @@ public class CmsUserManagerImpl implements CmsUserManager {
                        throw new IllegalArgumentException("Unable to get roles with filter: " + filter, e);
                }
 
-               List<User> users = new ArrayList<User>();
+               List<CmsUser> users = new ArrayList<>();
                for (Role role : roles) {
                        if ((includeUsers && role.getType() == Role.USER || role.getType() == Role.GROUP) && !users.contains(role)
                                        && (includeSystemRoles
                                                        || !role.getName().toLowerCase().endsWith(CmsConstants.SYSTEM_ROLES_BASEDN))) {
                                if (match(role, filter))
-                                       users.add((User) role);
+                                       users.add((CmsUser) role);
                        }
                }
                return users;
@@ -215,10 +217,10 @@ public class CmsUserManagerImpl implements CmsUserManager {
        }
 
        @Override
-       public User getUserFromLocalId(String localId) {
-               User user = getUserAdmin().getUser(LdapAttrs.uid.name(), localId);
+       public CmsUser getUserFromLocalId(String localId) {
+               CmsUser user = (CmsUser) getUserAdmin().getUser(LdapAttrs.uid.name(), localId);
                if (user == null)
-                       user = getUserAdmin().getUser(LdapAttrs.cn.name(), localId);
+                       user = (CmsUser) getUserAdmin().getUser(LdapAttrs.cn.name(), localId);
                return user;
        }
 
@@ -231,10 +233,10 @@ public class CmsUserManagerImpl implements CmsUserManager {
         * EDITION
         */
        @Override
-       public User createUser(String username, Map<String, Object> properties, Map<String, Object> credentials) {
+       public CmsUser createUser(String username, Map<String, Object> properties, Map<String, Object> credentials) {
                try {
                        userTransaction.begin();
-                       User user = (User) userAdmin.createRole(username, Role.USER);
+                       CmsUser user = (CmsUser) userAdmin.createRole(username, Role.USER);
                        if (properties != null) {
                                for (String key : properties.keySet())
                                        user.getProperties().put(key, properties.get(key));
@@ -259,14 +261,14 @@ public class CmsUserManagerImpl implements CmsUserManager {
        }
 
        @Override
-       public Group getOrCreateGroup(HierarchyUnit groups, String commonName) {
+       public CmsGroup getOrCreateGroup(HierarchyUnit groups, String commonName) {
                try {
                        String dn = LdapAttrs.cn.name() + "=" + commonName + "," + groups.getBase();
-                       Group group = (Group) getUserAdmin().getRole(dn);
+                       CmsGroup group = (CmsGroup) getUserAdmin().getRole(dn);
                        if (group != null)
                                return group;
                        userTransaction.begin();
-                       group = (Group) userAdmin.createRole(dn, Role.GROUP);
+                       group = (CmsGroup) userAdmin.createRole(dn, Role.GROUP);
                        userTransaction.commit();
                        return group;
                } catch (Exception e) {
@@ -283,15 +285,15 @@ public class CmsUserManagerImpl implements CmsUserManager {
        }
 
        @Override
-       public Group getOrCreateSystemRole(HierarchyUnit roles, SystemRole systemRole) {
+       public CmsGroup getOrCreateSystemRole(HierarchyUnit roles, SystemRole systemRole) {
                try {
                        String dn = LdapAttrs.cn.name() + "=" + NamespaceUtils.toPrefixedName(systemRole.getName()) + ","
                                        + roles.getBase();
-                       Group group = (Group) getUserAdmin().getRole(dn);
+                       CmsGroup group = (CmsGroup) getUserAdmin().getRole(dn);
                        if (group != null)
                                return group;
                        userTransaction.begin();
-                       group = (Group) userAdmin.createRole(dn, Role.GROUP);
+                       group = (CmsGroup) userAdmin.createRole(dn, Role.GROUP);
                        userTransaction.commit();
                        return group;
                } catch (Exception e) {
@@ -392,7 +394,7 @@ public class CmsUserManagerImpl implements CmsUserManager {
        }
 
        @Override
-       public void addMember(Group group, Role role) {
+       public void addMember(CmsGroup group, Role role) {
                try {
                        userTransaction.begin();
                        group.addMember(role);
index 6aa490a69ae144f9ec697a0e6c2f39b0ce482762..e6f903d393179003f2862331a9ab131f0133de11 100644 (file)
@@ -29,13 +29,13 @@ import org.argeo.api.cms.CmsAuth;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.CmsState;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.api.cms.transaction.WorkControl;
 import org.argeo.api.cms.transaction.WorkTransaction;
 import org.argeo.cms.CmsDeployProperty;
 import org.argeo.cms.dns.DnsBrowser;
 import org.argeo.cms.osgi.useradmin.AggregatingUserAdmin;
 import org.argeo.cms.osgi.useradmin.DirectoryUserAdmin;
-import org.argeo.cms.osgi.useradmin.UserDirectory;
 import org.argeo.cms.runtime.DirectoryConf;
 import org.ietf.jgss.GSSCredential;
 import org.ietf.jgss.GSSException;
index 50131758d6af6592da7c229a22da514171ebb151..72c4336e31abd40c098a2e476ad719755ad0edfc 100644 (file)
@@ -8,10 +8,11 @@ import java.util.Set;
 
 import javax.security.auth.x500.X500Principal;
 
+import org.argeo.api.cms.directory.CmsAuthorization;
 import org.osgi.service.useradmin.Authorization;
 
 /** An {@link Authorization} which combines roles form various auth sources. */
-class AggregatingAuthorization implements Authorization {
+class AggregatingAuthorization implements CmsAuthorization {
        private final String name;
        private final String displayName;
        private final Set<String> systemRoles;
index 2d438cbf02c3e4cf23973e07f42c21953f8d7198..8ebb98e3ad1cc6a1943839b7c6b1d59a834b80f5 100644 (file)
@@ -16,6 +16,8 @@ import java.util.TreeSet;
 import javax.naming.InvalidNameException;
 import javax.naming.ldap.LdapName;
 
+import org.argeo.api.cms.directory.CmsUser;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.runtime.DirectoryConf;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Authorization;
@@ -165,7 +167,7 @@ public class AggregatingUserAdmin implements UserAdmin {
        private DirectoryUserAdmin userAdminToUse(User user, DirectoryUserAdmin userAdmin) {
                if (userAdmin.isAuthenticated())
                        return userAdmin;
-               if (user instanceof DirectoryUser) {
+               if (user instanceof CmsUser) {
                        return userAdmin;
                } else if (user instanceof AuthenticatingUser) {
                        return userAdmin.scope(user).orElse(null);
diff --git a/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryGroup.java b/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryGroup.java
deleted file mode 100644 (file)
index d372c05..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.argeo.cms.osgi.useradmin;
-
-import org.osgi.service.useradmin.Group;
-
-/** A group in a user directroy. */
-interface DirectoryGroup extends Group, DirectoryUser {
-//     List<LdapName> getMemberNames();
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryUser.java b/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/DirectoryUser.java
deleted file mode 100644 (file)
index 8fe0af6..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.argeo.cms.osgi.useradmin;
-
-import org.osgi.service.useradmin.User;
-
-/** A user in a user directory. */
-interface DirectoryUser extends User {
-}
index 59fb05dc3b6e2e3e2160188cce194e1588b17e83..0115d57ca48aa0a87ce71cd8df71ac9c5cbda2e1 100644 (file)
@@ -26,7 +26,9 @@ import javax.security.auth.Subject;
 import javax.security.auth.kerberos.KerberosTicket;
 
 import org.argeo.api.cms.directory.DirectoryDigestUtils;
+import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
 import org.argeo.cms.directory.ldap.AbstractLdapDirectory;
 import org.argeo.cms.directory.ldap.LdapDao;
 import org.argeo.cms.directory.ldap.LdapEntry;
@@ -146,7 +148,7 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
                }
        }
 
-       protected List<Role> getAllRoles(DirectoryUser user) {
+       protected List<Role> getAllRoles(CmsUser user) {
                List<Role> allRoles = new ArrayList<Role>();
                if (user != null) {
                        collectRoles((LdapEntry) user, allRoles);
@@ -182,23 +184,23 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
                return res.toArray(new Role[res.size()]);
        }
 
-       List<DirectoryUser> getRoles(LdapName searchBase, String filter, boolean deep) throws InvalidSyntaxException {
+       List<CmsUser> getRoles(LdapName searchBase, String filter, boolean deep) throws InvalidSyntaxException {
                LdapEntryWorkingCopy wc = getWorkingCopy();
 //             Filter f = filter != null ? FrameworkUtil.createFilter(filter) : null;
                List<LdapEntry> searchRes = getDirectoryDao().doGetEntries(searchBase, filter, deep);
-               List<DirectoryUser> res = new ArrayList<>();
+               List<CmsUser> res = new ArrayList<>();
                for (LdapEntry entry : searchRes)
-                       res.add((DirectoryUser) entry);
+                       res.add((CmsUser) entry);
                if (wc != null) {
-                       for (Iterator<DirectoryUser> it = res.iterator(); it.hasNext();) {
-                               DirectoryUser user = (DirectoryUser) it.next();
+                       for (Iterator<CmsUser> it = res.iterator(); it.hasNext();) {
+                               CmsUser user = (CmsUser) it.next();
                                LdapName dn = LdapNameUtils.toLdapName(user.getName());
                                if (wc.getDeletedData().containsKey(dn))
                                        it.remove();
                        }
                        Filter f = filter != null ? FrameworkUtil.createFilter(filter) : null;
                        for (LdapEntry ldapEntry : wc.getNewData().values()) {
-                               DirectoryUser user = (DirectoryUser) ldapEntry;
+                               CmsUser user = (CmsUser) ldapEntry;
                                if (f == null || f.match(user.getProperties()))
                                        res.add(user);
                        }
@@ -211,7 +213,7 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
        @Override
        public User getUser(String key, String value) {
                // TODO check value null or empty
-               List<DirectoryUser> collectedUsers = new ArrayList<DirectoryUser>();
+               List<CmsUser> collectedUsers = new ArrayList<CmsUser>();
                if (key != null) {
                        doGetUser(key, value, collectedUsers);
                } else {
@@ -227,11 +229,11 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
                return null;
        }
 
-       protected void doGetUser(String key, String value, List<DirectoryUser> collectedUsers) {
+       protected void doGetUser(String key, String value, List<CmsUser> collectedUsers) {
                String f = "(" + key + "=" + value + ")";
                List<LdapEntry> users = getDirectoryDao().doGetEntries(getBaseDn(), f, true);
                for (LdapEntry entry : users)
-                       collectedUsers.add((DirectoryUser) entry);
+                       collectedUsers.add((CmsUser) entry);
        }
 
        @Override
@@ -261,8 +263,8 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
                                return getAuthorizationFromScoped(scopedUserAdmin, user);
                        }
 
-                       if (user instanceof DirectoryUser) {
-                               return new LdifAuthorization(user, getAllRoles((DirectoryUser) user));
+                       if (user instanceof CmsUser) {
+                               return new LdifAuthorization(user, getAllRoles((CmsUser) user));
                        } else {
                                // bind with authenticating user
                                DirectoryUserAdmin scopedUserAdmin = scope(user).orElseThrow();
@@ -273,7 +275,7 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
 
        private Authorization getAuthorizationFromScoped(DirectoryUserAdmin scopedUserAdmin, User user) {
                try {
-                       DirectoryUser directoryUser = (DirectoryUser) scopedUserAdmin.getRole(user.getName());
+                       CmsUser directoryUser = (CmsUser) scopedUserAdmin.getRole(user.getName());
                        if (directoryUser == null)
                                throw new IllegalStateException("No scoped user found for " + user);
                        LdifAuthorization authorization = new LdifAuthorization(directoryUser,
index 882f34a178e397c2905dc52a4d6a026bf0d40893..99aca1f2f4ea20d2d7460464068dc72d79f3f72f 100644 (file)
@@ -7,11 +7,12 @@ import javax.naming.InvalidNameException;
 import javax.naming.directory.Attribute;
 import javax.naming.ldap.LdapName;
 
+import org.argeo.api.cms.directory.CmsGroup;
 import org.argeo.cms.directory.ldap.AbstractLdapDirectory;
 import org.osgi.service.useradmin.Role;
 
 /** Directory group implementation */
-class LdifGroup extends LdifUser implements DirectoryGroup {
+class LdifGroup extends LdifUser implements CmsGroup {
        private final String memberAttributeId;
 
        LdifGroup(AbstractLdapDirectory userAdmin, LdapName dn) {
index 2341ec430c048460119d07a807aca9326af6a926..e48869a0113cc149f4bb59d48414457f5fa9bbc6 100644 (file)
@@ -2,11 +2,12 @@ package org.argeo.cms.osgi.useradmin;
 
 import javax.naming.ldap.LdapName;
 
+import org.argeo.api.cms.directory.CmsUser;
 import org.argeo.cms.directory.ldap.AbstractLdapDirectory;
 import org.argeo.cms.directory.ldap.DefaultLdapEntry;
 
 /** Directory user implementation */
-class LdifUser extends DefaultLdapEntry implements DirectoryUser {
+class LdifUser extends DefaultLdapEntry implements CmsUser {
        LdifUser(AbstractLdapDirectory userAdmin, LdapName dn) {
                super(userAdmin, dn);
        }
diff --git a/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/UserDirectory.java b/org.argeo.cms/src/org/argeo/cms/osgi/useradmin/UserDirectory.java
deleted file mode 100644 (file)
index 463316b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.argeo.cms.osgi.useradmin;
-
-import org.argeo.api.cms.directory.Directory;
-import org.argeo.api.cms.directory.HierarchyUnit;
-import org.osgi.service.useradmin.Role;
-
-/** Information about a user directory. */
-public interface UserDirectory extends Directory {
-
-       HierarchyUnit getHierarchyUnit(Role role);
-
-       Iterable<? extends Role> getHierarchyUnitRoles(HierarchyUnit hierarchyUnit, String filter, boolean deep);
-
-       String getRolePath(Role role);
-
-       String getRoleSimpleName(Role role);
-
-       Role getRoleByPath(String path);
-}