From: Mathieu Baudier Date: Wed, 19 Feb 2020 11:31:01 +0000 (+0100) Subject: Introduce home workspace. X-Git-Tag: argeo-commons-2.1.86~7 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=48cae516376b12ea619a359450c62479d3e16584 Introduce home workspace. --- diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/jcr/JcrBrowserView.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/jcr/JcrBrowserView.java index f18f7fc87..5b5c3ff82 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/jcr/JcrBrowserView.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/jcr/JcrBrowserView.java @@ -43,6 +43,7 @@ import org.argeo.eclipse.ui.EclipseUiException; import org.argeo.eclipse.ui.TreeParent; import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer; +import org.argeo.jcr.JcrUtils; import org.argeo.node.security.CryptoKeyring; import org.argeo.node.security.Keyring; import org.eclipse.e4.core.contexts.IEclipseContext; @@ -153,6 +154,7 @@ public class JcrBrowserView { @PreDestroy public void dispose() { + JcrUtils.logoutQuietly(userSession); repositoryRegister.destroy(); } @@ -280,9 +282,8 @@ public class JcrBrowserView { /** * Resets the tree content provider * - * @param sortChildNodes - * if true the content provider will use a comparer to sort nodes - * that might slow down the display + * @param sortChildNodes if true the content provider will use a comparer to + * sort nodes that might slow down the display */ public void setSortChildNodes(boolean sortChildNodes) { this.sortChildNodes = sortChildNodes; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index fba39b6d4..7a6ae0646 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -55,10 +55,8 @@ import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.UserAdmin; import org.osgi.util.tracker.ServiceTracker; +/** Implementation of a CMS deployment. */ public class CmsDeployment implements NodeDeployment { - // private final static String LEGACY_JCR_REPOSITORY_ALIAS = - // "argeo.jcr.repository.alias"; - private final Log log = LogFactory.getLog(getClass()); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); @@ -286,11 +284,11 @@ public class CmsDeployment implements NodeDeployment { JcrUtils.logoutQuietly(adminSession); } - Hashtable regProps = new Hashtable(); + // Publish home with the highest service ranking + Hashtable regProps = new Hashtable<>(); regProps.put(NodeConstants.CN, NodeConstants.HOME); - // regProps.put(LEGACY_JCR_REPOSITORY_ALIAS, NodeConstants.HOME); + regProps.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); homeRepository = new HomeRepository(deployedRepository, false); - // register bc.registerService(Repository.class, homeRepository, regProps); // Keyring only if Argeo extensions are available @@ -408,10 +406,7 @@ public class CmsDeployment implements NodeDeployment { private void publishLocalRepo(String dataModelName, Repository repository) { Hashtable properties = new Hashtable<>(); - // properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name); properties.put(NodeConstants.CN, dataModelName); - if (dataModelName.equals(NodeConstants.NODE)) - properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); LocalRepository localRepository; String[] classes; if (repository instanceof RepositoryImpl) { 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 aa0f1fc3f..77d901d07 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 @@ -2,10 +2,12 @@ package org.argeo.cms.internal.kernel; import java.security.PrivilegedAction; import java.text.SimpleDateFormat; -import java.util.Date; import java.util.HashSet; import java.util.Set; +import javax.jcr.Credentials; +import javax.jcr.LoginException; +import javax.jcr.NoSuchWorkspaceException; import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; @@ -39,6 +41,7 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { private SimpleDateFormat usersDatePath = new SimpleDateFormat("YYYY/MM"); + private String defaultHomeWorkspace = NodeConstants.HOME; private final boolean remote; public HomeRepository(Repository repository, boolean remote) { @@ -57,11 +60,15 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { @Override public Void run() { + Session adminSession = null; try { - Session adminSession = getDefaultRepository().login(); + adminSession = JcrUtils.loginOrCreateWorkspace(getRepository(defaultHomeWorkspace), + defaultHomeWorkspace); initJcr(adminSession); } catch (RepositoryException e) { throw new CmsException("Cannot init JCR home", e); + } finally { + JcrUtils.logoutQuietly(adminSession); } return null; } @@ -70,6 +77,21 @@ 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); + } + } + + protected String getUserHomeWorkspace() { + // TODO base on JAAS Subject metadata + return defaultHomeWorkspace; + } + @Override protected void processNewSession(Session session, String workspaceName) { String username = session.getUserID(); @@ -78,11 +100,15 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { if (session.getUserID().equals(NodeConstants.ROLE_ANONYMOUS)) return; + String userHomeWorkspace = getUserHomeWorkspace(); + if (workspaceName != null && !workspaceName.equals(userHomeWorkspace)) + return; + if (checkedUsers.contains(username)) return; Session adminSession = KernelUtils.openAdminSession(getRepository(workspaceName), workspaceName); try { - syncJcr(adminSession, username, workspaceName); + syncJcr(adminSession, username); checkedUsers.add(username); } finally { JcrUtils.logoutQuietly(adminSession); @@ -95,12 +121,12 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { /** Session is logged out. */ private void initJcr(Session adminSession) { try { - JcrUtils.mkdirs(adminSession, homeBasePath); +// JcrUtils.mkdirs(adminSession, homeBasePath); JcrUtils.mkdirs(adminSession, groupsBasePath); adminSession.save(); - JcrUtils.addPrivilege(adminSession, homeBasePath, NodeConstants.ROLE_USER_ADMIN, Privilege.JCR_READ); - JcrUtils.addPrivilege(adminSession, groupsBasePath, NodeConstants.ROLE_USER_ADMIN, Privilege.JCR_READ); +// JcrUtils.addPrivilege(adminSession, homeBasePath, NodeConstants.ROLE_USER_ADMIN, Privilege.JCR_READ); +// JcrUtils.addPrivilege(adminSession, groupsBasePath, NodeConstants.ROLE_USER_ADMIN, Privilege.JCR_READ); adminSession.save(); } catch (RepositoryException e) { throw new CmsException("Cannot initialize home repository", e); @@ -109,10 +135,10 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { } } - protected synchronized void syncJcr(Session adminSession, String username, String workspaceName) { + protected synchronized void syncJcr(Session adminSession, String username) { // only in the default workspace - if (workspaceName != null) - return; +// if (workspaceName != null) +// return; // skip system users if (username.endsWith(NodeConstants.ROLES_BASEDN)) return; @@ -151,21 +177,13 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants { throw new CmsException("Invalid name " + username, e); } String userId = dn.getRdn(dn.size() - 1).getValue().toString(); - int atIndex = userId.indexOf('@'); - if (atIndex < 0) { - return homeBasePath + '/' + userId; - } else { - return usersBasePath + '/' + usersDatePath.format(new Date()) + '/' + userId; - } - // if (atIndex > 0) { - // String domain = userId.substring(0, atIndex); - // String name = userId.substring(atIndex + 1); - // return base + '/' + domain + '/' + name; - // } else if (atIndex == 0 || atIndex == (userId.length() - 1)) { - // throw new CmsException("Unsupported username " + userId); - // } else { - // return base + '/' + userId; - // } + return '/' + userId; +// int atIndex = userId.indexOf('@'); +// if (atIndex < 0) { +// return homeBasePath+'/' + userId; +// } else { +// return usersBasePath + '/' + usersDatePath.format(new Date()) + '/' + userId; +// } } public void createWorkgroup(LdapName dn) {