X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fauth%2FCmsUserManagerImpl.java;h=135bf50c8ebac917827a31c8405d719dccc4e71d;hb=4c7e1885b8bf3c93fa0919ace122e3f289a925ea;hp=5753decf9ed2c565d5f011795371e99620b9154d;hpb=5986e55820cba0821f0c16627c4ab144863c82ab;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java index 5753decf9..135bf50c8 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsUserManagerImpl.java @@ -1,8 +1,8 @@ package org.argeo.cms.internal.auth; -import static org.argeo.naming.LdapAttrs.cn; -import static org.argeo.naming.LdapAttrs.description; -import static org.argeo.naming.LdapAttrs.owner; +import static org.argeo.util.naming.LdapAttrs.cn; +import static org.argeo.util.naming.LdapAttrs.description; +import static org.argeo.util.naming.LdapAttrs.owner; import java.time.ZoneOffset; import java.time.ZonedDateTime; @@ -16,26 +16,28 @@ import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.NavigableMap; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.UUID; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; import javax.security.auth.Subject; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.api.NodeConstants; +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsLog; import org.argeo.cms.CmsUserManager; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.auth.UserAdminUtils; -import org.argeo.naming.LdapAttrs; -import org.argeo.naming.NamingUtils; -import org.argeo.naming.SharedSecret; import org.argeo.osgi.transaction.WorkTransaction; import org.argeo.osgi.useradmin.TokenUtils; import org.argeo.osgi.useradmin.UserAdminConf; import org.argeo.osgi.useradmin.UserDirectory; +import org.argeo.util.naming.LdapAttrs; +import org.argeo.util.naming.NamingUtils; +import org.argeo.util.naming.SharedSecret; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.useradmin.Authorization; import org.osgi.service.useradmin.Group; @@ -56,13 +58,13 @@ import org.osgi.service.useradmin.UserAdmin; * */ public class CmsUserManagerImpl implements CmsUserManager { - private final static Log log = LogFactory.getLog(CmsUserManagerImpl.class); + private final static CmsLog log = CmsLog.getLog(CmsUserManagerImpl.class); private UserAdmin userAdmin; // private Map serviceProperties; private WorkTransaction userTransaction; - private Map> userDirectories = Collections + private Map> userDirectories = Collections .synchronizedMap(new LinkedHashMap<>()); @Override @@ -152,7 +154,7 @@ public class CmsUserManagerImpl implements CmsUserManager { List 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(NodeConstants.ROLES_BASEDN))) { + && (includeSystemRoles || !role.getName().toLowerCase().endsWith(CmsConstants.ROLES_BASEDN))) { if (match(role, filter)) users.add((User) role); } @@ -230,13 +232,13 @@ public class CmsUserManagerImpl implements CmsUserManager { Map dns = new HashMap(); for (UserDirectory userDirectory : userDirectories.keySet()) { Boolean readOnly = userDirectory.isReadOnly(); - String baseDn = userDirectory.getBaseDn().toString(); + String baseDn = userDirectory.getBasePath(); if (onlyWritable && readOnly) continue; - if (baseDn.equalsIgnoreCase(NodeConstants.ROLES_BASEDN)) + if (baseDn.equalsIgnoreCase(CmsConstants.ROLES_BASEDN)) continue; - if (baseDn.equalsIgnoreCase(NodeConstants.TOKENS_BASEDN)) + if (baseDn.equalsIgnoreCase(CmsConstants.TOKENS_BASEDN)) continue; dns.put(baseDn, UserAdminConf.propertiesAsUri(userDirectories.get(userDirectory)).toString()); @@ -244,6 +246,12 @@ public class CmsUserManagerImpl implements CmsUserManager { return dns; } + public Set getUserDirectories() { + TreeSet res = new TreeSet<>((o1, o2) -> o1.getBasePath().compareTo(o2.getBasePath())); + res.addAll(userDirectories.keySet()); + return res; + } + public String buildDistinguishedName(String localId, String baseDn, int type) { Map dns = getKnownBaseDns(true); Dictionary props = UserAdminConf.uriAsProperties(dns.get(baseDn)); @@ -364,7 +372,7 @@ public class CmsUserManagerImpl implements CmsUserManager { public void expireAuthToken(String token) { try { userTransaction.begin(); - String dn = cn + "=" + token + "," + NodeConstants.TOKENS_BASEDN; + String dn = cn + "=" + token + "," + CmsConstants.TOKENS_BASEDN; Group tokenGroup = (Group) userAdmin.getRole(dn); String ldapDate = NamingUtils.instantToLdapDate(ZonedDateTime.now(ZoneOffset.UTC)); tokenGroup.getProperties().put(description.name(), ldapDate); @@ -385,7 +393,7 @@ public class CmsUserManagerImpl implements CmsUserManager { @Override public void expireAuthTokens(Subject subject) { - Set tokens = TokenUtils.tokensUsed(subject, NodeConstants.TOKENS_BASEDN); + Set tokens = TokenUtils.tokensUsed(subject, CmsConstants.TOKENS_BASEDN); for (String token : tokens) expireAuthToken(token); } @@ -400,7 +408,7 @@ public class CmsUserManagerImpl implements CmsUserManager { try { userTransaction.begin(); User user = (User) userAdmin.getRole(userDn); - String tokenDn = cn + "=" + token + "," + NodeConstants.TOKENS_BASEDN; + String tokenDn = cn + "=" + token + "," + CmsConstants.TOKENS_BASEDN; Group tokenGroup = (Group) userAdmin.createRole(tokenDn, Role.GROUP); if (roles != null) for (String role : roles) { @@ -408,7 +416,7 @@ public class CmsUserManagerImpl implements CmsUserManager { if (r != null) tokenGroup.addMember(r); else { - if (!role.equals(NodeConstants.ROLE_USER)) { + if (!role.equals(CmsConstants.ROLE_USER)) { throw new IllegalStateException( "Cannot add role " + role + " to token " + token + " for " + userDn); } @@ -432,6 +440,20 @@ public class CmsUserManagerImpl implements CmsUserManager { } } + @Override + public UserDirectory getUserDirectory(User user) { + String name = user.getName(); + NavigableMap possible = new TreeMap<>(); + for (UserDirectory userDirectory : userDirectories.keySet()) { + if (name.endsWith(userDirectory.getBasePath())) { + possible.put(userDirectory.getBasePath(), userDirectory); + } + } + if (possible.size() == 0) + throw new IllegalStateException("No user directory found for user " + name); + return possible.lastEntry().getValue(); + } + // public User createUserFromPerson(Node person) { // String email = JcrUtils.get(person, LdapAttrs.mail.property()); // String dn = buildDefaultDN(email, Role.USER); @@ -481,11 +503,11 @@ public class CmsUserManagerImpl implements CmsUserManager { this.userTransaction = userTransaction; } - public void addUserDirectory(UserDirectory userDirectory, Map properties) { + public void addUserDirectory(UserDirectory userDirectory, Map properties) { userDirectories.put(userDirectory, new Hashtable<>(properties)); } - public void removeUserDirectory(UserDirectory userDirectory, Map properties) { + public void removeUserDirectory(UserDirectory userDirectory, Map properties) { userDirectories.remove(userDirectory); }