X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=inline;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FNodeUserAdmin.java;h=bd48bc38501f40aa21c99497a8482839946c99f8;hb=bedec814b105c1cc53f2beadfe36d76e42c9a02e;hp=9dd516137ebe72e268689df709c625132e290e22;hpb=25071ab6bcb2df1fa4057c2c04137f2d606772e7;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java index 9dd516137..bd48bc385 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java @@ -1,22 +1,32 @@ package org.argeo.cms.internal.kernel; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Dictionary; import java.util.HashMap; import java.util.HashSet; +import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Set; import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; -import javax.transaction.Transaction; import javax.transaction.TransactionManager; -import javax.transaction.TransactionSynchronizationRegistry; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.cms.CmsException; import org.argeo.cms.KernelHeader; -import org.argeo.osgi.useradmin.AbstractUserDirectory; -import org.argeo.osgi.useradmin.UserAdminAggregator; +import org.argeo.osgi.useradmin.UserDirectory; +import org.argeo.osgi.useradmin.UserAdminConf; +import org.argeo.osgi.useradmin.LdapUserAdmin; +import org.argeo.osgi.useradmin.LdifUserAdmin; import org.argeo.osgi.useradmin.UserDirectoryException; import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.useradmin.Authorization; @@ -24,7 +34,8 @@ import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; -public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { +public class NodeUserAdmin implements UserAdmin { + private final static Log log = LogFactory.getLog(NodeUserAdmin.class); final static LdapName ROLES_BASE; static { try { @@ -38,8 +49,124 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { private UserAdmin nodeRoles = null; private Map userAdmins = new HashMap(); - private TransactionSynchronizationRegistry syncRegistry; - private TransactionManager transactionManager; + public NodeUserAdmin() { + File osgiInstanceDir = KernelUtils.getOsgiInstanceDir(); + File nodeBaseDir = new File(osgiInstanceDir, "node"); + nodeBaseDir.mkdirs(); + + String userAdminUri = KernelUtils + .getFrameworkProp(KernelConstants.USERADMIN_URIS); + if (userAdminUri == null) { + String demoBaseDn = "dc=example,dc=com"; + File businessRolesFile = new File(nodeBaseDir, demoBaseDn + ".ldif"); + if (!businessRolesFile.exists()) + try { + FileUtils.copyInputStreamToFile(getClass() + .getResourceAsStream(demoBaseDn + ".ldif"), + businessRolesFile); + } catch (IOException e) { + throw new CmsException("Cannot copy demo resource", e); + } + userAdminUri = businessRolesFile.toURI().toString(); + } + + String[] uris = userAdminUri.split(" "); + for (String uri : uris) { + URI u; + try { + u = new URI(uri); + if (u.getScheme() == null) { + if (uri.startsWith("/")) + u = new File(uri).getAbsoluteFile().toURI(); + else if (!uri.contains("/")) + u = new File(nodeBaseDir, uri).getAbsoluteFile() + .toURI(); + else + throw new CmsException("Cannot interpret " + uri + + " as an uri"); + } + } catch (URISyntaxException e) { + throw new CmsException( + "Cannot interpret " + uri + " as an uri", e); + } + Dictionary properties = UserAdminConf.uriAsProperties(u + .toString()); + UserDirectory businessRoles; + if (u.getScheme().startsWith("ldap")) { + businessRoles = new LdapUserAdmin(properties); + } else { + businessRoles = new LdifUserAdmin(properties); + } + businessRoles.init(); + addUserAdmin(businessRoles.getBaseDn(), (UserAdmin) businessRoles); + if (log.isDebugEnabled()) + log.debug("User directory " + businessRoles.getBaseDn() + " [" + + u.getScheme() + "] enabled."); + } + + // NOde roles + String nodeRolesUri = KernelUtils + .getFrameworkProp(KernelConstants.ROLES_URI); + String baseNodeRoleDn = KernelHeader.ROLES_BASEDN; + if (nodeRolesUri == null) { + File nodeRolesFile = new File(nodeBaseDir, baseNodeRoleDn + ".ldif"); + if (!nodeRolesFile.exists()) + try { + FileUtils.copyInputStreamToFile(getClass() + .getResourceAsStream("demo.ldif"), nodeRolesFile); + } catch (IOException e) { + throw new CmsException("Cannot copy demo resource", e); + } + nodeRolesUri = nodeRolesFile.toURI().toString(); + } + + Dictionary nodeRolesProperties = UserAdminConf + .uriAsProperties(nodeRolesUri); + if (!nodeRolesProperties.get(UserAdminConf.baseDn.property()).equals( + baseNodeRoleDn)) { + throw new CmsException("Invalid base dn for node roles"); + // TODO deal with "mounted" roles with a different baseDN + } + UserDirectory nodeRoles; + if (nodeRolesUri.startsWith("ldap")) { + nodeRoles = new LdapUserAdmin(nodeRolesProperties); + } else { + nodeRoles = new LdifUserAdmin(nodeRolesProperties); + } + nodeRoles.setExternalRoles(this); + nodeRoles.init(); + addUserAdmin(baseNodeRoleDn, (UserAdmin) nodeRoles); + if (log.isTraceEnabled()) + log.trace("Node roles enabled."); + } + + Dictionary currentState() { + Dictionary res = new Hashtable(); + for (LdapName name : userAdmins.keySet()) { + StringBuilder buf = new StringBuilder(); + if (userAdmins.get(name) instanceof UserDirectory) { + UserDirectory userDirectory = (UserDirectory) userAdmins + .get(name); + String uri = UserAdminConf.propertiesAsUri( + userDirectory.getProperties()).toString(); + res.put(uri, ""); + } else { + buf.append('/').append(name.toString()) + .append("?readOnly=true"); + } + } + return res; + } + + public void destroy() { + for (LdapName name : userAdmins.keySet()) { + if (userAdmins.get(name) instanceof UserDirectory) { + UserDirectory userDirectory = (UserDirectory) userAdmins + .get(name); + userDirectory.destroy(); + } + } + } @Override public Role createRole(String name, int type) { @@ -48,7 +175,9 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { @Override public boolean removeRole(String name) { - return findUserAdmin(name).removeRole(name); + boolean actuallyDeleted = findUserAdmin(name).removeRole(name); + nodeRoles.removeRole(name); + return actuallyDeleted; } @Override @@ -80,6 +209,9 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { @Override public Authorization getAuthorization(User user) { + if (user == null) { + return nodeRoles.getAuthorization(null); + } UserAdmin userAdmin = findUserAdmin(user.getName()); Authorization rawAuthorization = userAdmin.getAuthorization(user); // gather system roles @@ -97,11 +229,7 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { // // USER ADMIN AGGREGATOR // - @Override public synchronized void addUserAdmin(String baseDn, UserAdmin userAdmin) { - if (userAdmin instanceof AbstractUserDirectory) - ((AbstractUserDirectory) userAdmin).setSyncRegistry(syncRegistry); - if (baseDn.equals(KernelHeader.ROLES_BASEDN)) { nodeRoles = userAdmin; return; @@ -118,7 +246,6 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { } } - @Override public synchronized void removeUserAdmin(String baseDn) { if (baseDn.equals(KernelHeader.ROLES_BASEDN)) throw new UserDirectoryException("Node roles cannot be removed."); @@ -132,9 +259,7 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { if (!userAdmins.containsKey(base)) throw new UserDirectoryException("There is no user admin for " + base); - UserAdmin userAdmin = userAdmins.remove(base); - if (userAdmin instanceof AbstractUserDirectory) - ((AbstractUserDirectory) userAdmin).setSyncRegistry(null); + userAdmins.remove(base); } private UserAdmin findUserAdmin(String name) { @@ -163,26 +288,13 @@ public class NodeUserAdmin implements UserAdmin, UserAdminAggregator { } public void setTransactionManager(TransactionManager transactionManager) { - this.transactionManager = transactionManager; - if (nodeRoles instanceof AbstractUserDirectory) - ((AbstractUserDirectory) nodeRoles) + if (nodeRoles instanceof UserDirectory) + ((UserDirectory) nodeRoles) .setTransactionManager(transactionManager); for (UserAdmin userAdmin : userAdmins.values()) { - if (userAdmin instanceof AbstractUserDirectory) - ((AbstractUserDirectory) userAdmin) + if (userAdmin instanceof UserDirectory) + ((UserDirectory) userAdmin) .setTransactionManager(transactionManager); } } - - public void setSyncRegistry(TransactionSynchronizationRegistry syncRegistry) { - this.syncRegistry = syncRegistry; - if (nodeRoles instanceof AbstractUserDirectory) - ((AbstractUserDirectory) nodeRoles).setSyncRegistry(syncRegistry); - for (UserAdmin userAdmin : userAdmins.values()) { - if (userAdmin instanceof AbstractUserDirectory) - ((AbstractUserDirectory) userAdmin) - .setSyncRegistry(syncRegistry); - } - } - }