From 1b09095425a7c067c097eb91bed5b4a4a33f0dc8 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 28 Feb 2020 10:24:36 +0100 Subject: [PATCH] Continue refactoring of home. --- .../cms/internal/kernel/CmsFsProvider.java | 5 ++- .../argeo/cms/internal/kernel/DataModels.java | 15 ++++++-- .../cms/internal/kernel/HomeRepository.java | 38 ++++++++++--------- .../org/argeo/cms/security/JcrKeyring.java | 3 +- org.argeo.node.api/bnd.bnd | 2 +- .../src/org/argeo/node/NodeConstants.java | 2 +- .../src/org/argeo/node/NodeUtils.java | 2 +- 7 files changed, 40 insertions(+), 27 deletions(-) diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java index 7b3b8d978..cf6249398 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java @@ -102,8 +102,9 @@ public class CmsFsProvider extends AbstractJackrabbitFsProvider { } public boolean skipNode(Node node) throws RepositoryException { - if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME) - || node.isNodeType(NodeTypes.NODE_GROUP_HOME)) +// if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME) +// || node.isNodeType(NodeTypes.NODE_GROUP_HOME)) + if (node.isNodeType(NodeType.NT_HIERARCHY_NODE)) return false; return true; } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java index 48b6b7fc7..19117a892 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java @@ -27,7 +27,7 @@ class DataModels implements BundleListener { public DataModels(BundleContext bc) { for (Bundle bundle : bc.getBundles()) - processBundle(bundle); + processBundle(bundle, null); bc.addBundleListener(this); } @@ -45,7 +45,7 @@ class DataModels implements BundleListener { @Override public void bundleChanged(BundleEvent event) { if (event.getType() == Bundle.RESOLVED) { - processBundle(event.getBundle()); + processBundle(event.getBundle(), null); } else if (event.getType() == Bundle.UNINSTALLED) { BundleWiring wiring = event.getBundle().adapt(BundleWiring.class); List providedDataModels = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); @@ -58,7 +58,9 @@ class DataModels implements BundleListener { } - protected void processBundle(Bundle bundle) { + protected void processBundle(Bundle bundle, List scannedBundles) { + if (scannedBundles != null && scannedBundles.contains(bundle)) + throw new IllegalStateException("Cycle in CMS data model requirements for " + bundle); BundleWiring wiring = bundle.adapt(BundleWiring.class); if (wiring == null) { int bundleState = bundle.getState(); @@ -77,7 +79,12 @@ class DataModels implements BundleListener { List requiredDataModels = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); // process requirements first for (BundleWire bundleWire : requiredDataModels) { - processBundle(bundleWire.getProvider().getBundle()); + List nextScannedBundles = new ArrayList<>(); + if (scannedBundles != null) + nextScannedBundles.addAll(scannedBundles); + nextScannedBundles.add(bundle); + Bundle providerBundle = bundleWire.getProvider().getBundle(); + processBundle(providerBundle, nextScannedBundles); } for (BundleCapability bundleCapability : providedDataModels) { String name = (String) bundleCapability.getAttributes().get(DataModelNamespace.NAME); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java index cc7005be3..4b46b2cee 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java @@ -21,7 +21,6 @@ import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import org.argeo.cms.CmsException; -import org.argeo.jackrabbit.security.JackrabbitSecurityUtils; import org.argeo.jcr.JcrRepositoryWrapper; import org.argeo.jcr.JcrUtils; import org.argeo.node.NodeConstants; @@ -42,8 +41,8 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { private SimpleDateFormat usersDatePath = new SimpleDateFormat("YYYY/MM"); private String defaultHomeWorkspace = NodeConstants.HOME; - private String defaultGroupsWorkspace = NodeConstants.GROUPS; - private String defaultGuestsWorkspace = NodeConstants.GUESTS; + private String defaultGroupsWorkspace = NodeConstants.SRV; +// private String defaultGuestsWorkspace = NodeConstants.GUESTS; private final boolean remote; public HomeRepository(Repository repository, boolean remote) { @@ -85,15 +84,15 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { } } - @Override - public Session login(Credentials credentials, String workspaceName) - throws LoginException, NoSuchWorkspaceException, RepositoryException { - if (workspaceName == null) { - return super.login(credentials, getUserHomeWorkspace()); - } else { - return super.login(credentials, workspaceName); - } - } +// @Override +// public Session login(Credentials credentials, String workspaceName) +// throws LoginException, NoSuchWorkspaceException, RepositoryException { +// if (workspaceName == null) { +// return super.login(credentials, getUserHomeWorkspace()); +// } else { +// return super.login(credentials, workspaceName); +// } +// } protected String getUserHomeWorkspace() { // TODO base on JAAS Subject metadata @@ -105,10 +104,10 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { return defaultGroupsWorkspace; } - protected String getGuestsWorkspace() { - // TODO base on JAAS Subject metadata - return defaultGuestsWorkspace; - } +// protected String getGuestsWorkspace() { +// // TODO base on JAAS Subject metadata +// return defaultGuestsWorkspace; +// } @Override protected void processNewSession(Session session, String workspaceName) { @@ -119,7 +118,7 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { return; String userHomeWorkspace = getUserHomeWorkspace(); - if (workspaceName != null && !workspaceName.equals(userHomeWorkspace)) + if (workspaceName == null || !workspaceName.equals(userHomeWorkspace)) return; if (checkedUsers.contains(username)) @@ -173,7 +172,10 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { userHome = adminSession.getRootNode().addNode(userId); // userHome.addMixin(NodeTypes.NODE_USER_HOME); userHome.addMixin(NodeType.MIX_CREATED); + userHome.addMixin(NodeType.MIX_TITLE); userHome.setProperty(Property.JCR_ID, username); + // TODO use display name + userHome.setProperty(Property.JCR_TITLE, userId); // userHome.setProperty(NodeNames.LDAP_UID, username); adminSession.save(); @@ -242,7 +244,9 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { // newWorkgroup = JcrUtils.mkdirs(adminSession.getNode(groupsBasePath), relPath, NodeType.NT_UNSTRUCTURED); // newWorkgroup.addMixin(NodeTypes.NODE_GROUP_HOME); newWorkgroup.addMixin(NodeType.MIX_CREATED); + newWorkgroup.addMixin(NodeType.MIX_TITLE); newWorkgroup.setProperty(Property.JCR_ID, dn.toString()); + newWorkgroup.setProperty(Property.JCR_TITLE, cn); // newWorkgroup.setProperty(NodeNames.LDAP_CN, cn); adminSession.save(); JcrUtils.addPrivilege(adminSession, newWorkgroup.getPath(), dn.toString(), Privilege.JCR_ALL); diff --git a/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java b/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java index 9aeb7602d..c75d38fc8 100644 --- a/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java +++ b/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java @@ -46,6 +46,7 @@ import org.argeo.cms.ArgeoTypes; import org.argeo.cms.CmsException; import org.argeo.jcr.ArgeoJcrException; import org.argeo.jcr.JcrUtils; +import org.argeo.node.NodeConstants; import org.argeo.node.NodeUtils; import org.argeo.node.security.PBEKeySpecCallback; @@ -108,7 +109,7 @@ public class JcrKeyring extends AbstractKeyring implements ArgeoNames { private Session login() { try { - return repository.login(); + return repository.login(NodeConstants.HOME); } catch (RepositoryException e) { throw new CmsException("Cannot login key ring session", e); } diff --git a/org.argeo.node.api/bnd.bnd b/org.argeo.node.api/bnd.bnd index 5b235f666..f0bd0ceaa 100644 --- a/org.argeo.node.api/bnd.bnd +++ b/org.argeo.node.api/bnd.bnd @@ -1 +1 @@ -Provide-Capability: cms.datamodel;name=node;cnd=/org/argeo/node/ldap.cnd;abstract=true +Provide-Capability: cms.datamodel;name=ldap;cnd=/org/argeo/node/ldap.cnd;abstract=true diff --git a/org.argeo.node.api/src/org/argeo/node/NodeConstants.java b/org.argeo.node.api/src/org/argeo/node/NodeConstants.java index 067d8c317..50647de50 100644 --- a/org.argeo.node.api/src/org/argeo/node/NodeConstants.java +++ b/org.argeo.node.api/src/org/argeo/node/NodeConstants.java @@ -24,7 +24,7 @@ public interface NodeConstants { */ String NODE = "node"; String HOME = "home"; - String GROUPS = "groups"; + String SRV = "groups"; String GUESTS = "guests"; String PUBLIC = "public"; diff --git a/org.argeo.node.api/src/org/argeo/node/NodeUtils.java b/org.argeo.node.api/src/org/argeo/node/NodeUtils.java index 378ec3322..a735e181f 100644 --- a/org.argeo.node.api/src/org/argeo/node/NodeUtils.java +++ b/org.argeo.node.api/src/org/argeo/node/NodeUtils.java @@ -182,7 +182,7 @@ public class NodeUtils { private static void checkGroupWorkspace(Session session, String groupname) { String workspaceName = session.getWorkspace().getName(); - if (!NodeConstants.GROUPS.equals(workspaceName)) + if (!NodeConstants.SRV.equals(workspaceName)) throw new IllegalArgumentException(workspaceName + " is not the group workspace for group " + groupname); } -- 2.30.2