From 302839c70d637be5a555290bd4542b9b1c63c17d Mon Sep 17 00:00:00 2001 From: Mathieu Date: Mon, 14 Nov 2022 07:29:15 +0100 Subject: [PATCH] Reactivate JCR user node. --- .../src/org/argeo/app/core/SuiteUtils.java | 36 ++++++++++--------- swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml | 1 + .../src/org/argeo/app/ui/SuiteApp.java | 18 ++++++++-- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java index ad4e2ac..565c2d6 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java +++ b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java @@ -23,12 +23,16 @@ import org.argeo.jcr.JcrUtils; /** Utilities around the Argeo Suite APIs. */ public class SuiteUtils { + public final static String USER_STATE_NODE_NAME = "state"; + public final static String USER_DEVICES_NODE_NAME = "devices"; + public final static String USER_SESSIONS_NODE_NAME = "sessions"; + public static String getUserNodePath(String userDn) { String uid = RoleNameUtils.getLastRdnValue(userDn); return EntityType.user.basePath() + '/' + uid; } - private static Node getOrCreateUserNode(Session adminSession, String userDn) { + public static Node getOrCreateUserNode(Session adminSession, String userDn) { try { Node usersBase = adminSession.getNode(EntityType.user.basePath()); String uid = RoleNameUtils.getLastRdnValue(userDn); @@ -39,6 +43,11 @@ public class SuiteUtils { userNode.addMixin(NodeType.MIX_CREATED); userNode.setProperty(LdapAttr.distinguishedName.get(), userDn.toString()); userNode.setProperty(LdapAttr.uid.get(), uid); + + userNode.addNode(USER_SESSIONS_NODE_NAME, NodeType.NT_UNSTRUCTURED); + Node userStateNode = userNode.addNode(USER_STATE_NODE_NAME, NodeType.NT_UNSTRUCTURED); + Node userDevicesNode = userNode.addNode(USER_DEVICES_NODE_NAME, NodeType.NT_UNSTRUCTURED); + adminSession.save(); // JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(), // Privilege.JCR_READ); @@ -46,6 +55,10 @@ public class SuiteUtils { Privilege.JCR_READ); JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN, Privilege.JCR_ALL); + + JcrUtils.addPrivilege(adminSession, userStateNode.getPath(), userDn, Privilege.JCR_ALL); + JcrUtils.addPrivilege(adminSession, userDevicesNode.getPath(), userDn, Privilege.JCR_ALL); + } else { userNode = usersBase.getNode(uid); } @@ -57,7 +70,8 @@ public class SuiteUtils { public static Node getCmsSessionNode(Session session, CmsSession cmsSession) { try { - return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + cmsSession.getUuid().toString()); + return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + USER_SESSIONS_NODE_NAME + '/' + + cmsSession.getUuid().toString()); } catch (RepositoryException e) { throw new JcrException("Cannot get session dir for " + cmsSession, e); } @@ -66,28 +80,18 @@ public class SuiteUtils { public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) { try { String userDn = cmsSession.getUserDn(); -// String uid = userDn.get(userDn.size() - 1); Node userNode = getOrCreateUserNode(adminSession, userDn); -// if (!usersBase.hasNode(uid)) { -// userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED); -// userNode.addMixin(EntityType.user.get()); -// userNode.addMixin(NodeType.MIX_CREATED); -// usersBase.setProperty(LdapAttrs.uid.property(), uid); -// usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString()); -// adminSession.save(); -// } else { -// userNode = usersBase.getNode(uid); -// } + Node sessionsNode = userNode.getNode(USER_SESSIONS_NODE_NAME); String cmsSessionUuid = cmsSession.getUuid().toString(); Node cmsSessionNode; - if (!userNode.hasNode(cmsSessionUuid)) { - cmsSessionNode = userNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED); + if (!sessionsNode.hasNode(cmsSessionUuid)) { + cmsSessionNode = sessionsNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED); cmsSessionNode.addMixin(NodeType.MIX_CREATED); adminSession.save(); JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(), Privilege.JCR_ALL); } else { - cmsSessionNode = userNode.getNode(cmsSessionUuid); + cmsSessionNode = sessionsNode.getNode(cmsSessionUuid); } return cmsSessionNode; } catch (RepositoryException e) { diff --git a/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml b/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml index b96f81d..f9de1dd 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml +++ b/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml @@ -11,4 +11,5 @@ + diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java index 0d5696b..3dc5007 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java @@ -33,12 +33,14 @@ import org.argeo.app.api.EntityConstants; import org.argeo.app.api.EntityNames; import org.argeo.app.api.EntityType; import org.argeo.app.api.RankedObject; +import org.argeo.app.core.SuiteUtils; import org.argeo.cms.AbstractCmsApp; import org.argeo.cms.LocaleUtils; import org.argeo.cms.Localized; import org.argeo.cms.acr.ContentUtils; import org.argeo.cms.jcr.CmsJcrUtils; import org.argeo.cms.jcr.acr.JcrContent; +import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.acr.SwtUiProvider; import org.argeo.cms.swt.dialogs.CmsFeedback; @@ -93,7 +95,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { // ACR private ContentRepository contentRepository; -// private JcrContentProvider jcrContentProvider; + private JcrContentProvider jcrContentProvider; // JCR // private Repository repository; @@ -233,8 +235,15 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + publicBasePath); ui.setUserDir(userDir); } else { - Content userDir = contentSession.getSessionRunDir(); + Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> { + Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); + return node; + }); + Content userDir = contentSession + .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + userDirNode.getPath()); ui.setUserDir(userDir); +// Content userDir = contentSession.getSessionRunDir(); +// ui.setUserDir(userDir); } } initLocale(cmsSession); @@ -638,4 +647,9 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber { public void setContentRepository(ContentRepository contentRepository) { this.contentRepository = contentRepository; } + + public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { + this.jcrContentProvider = jcrContentProvider; + } + } -- 2.30.2