Reactivate JCR user node.
authorMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 06:29:15 +0000 (07:29 +0100)
committerMathieu <mbaudier@argeo.org>
Mon, 14 Nov 2022 06:29:15 +0000 (07:29 +0100)
org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java
swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteApp.java

index ad4e2ac5e6caf3c7e9e5f90d8c5b2ef546e4b469..565c2d633febcea357ea099ef7de6c330d2de879 100644 (file)
@@ -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) {
index b96f81d6a86ccae86b755f5e866bca546568ba05..f9de1dd38585f1f7855c75bc4e376299256d0649 100644 (file)
@@ -11,4 +11,5 @@
    <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
    <reference bind="setCmsContext" cardinality="1..1" interface="org.argeo.api.cms.CmsContext" name="CmsContext" policy="static"/>
    <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
+   <reference bind="setJcrContentProvider" cardinality="1..1" interface="org.argeo.cms.jcr.acr.JcrContentProvider" name="JcrContentProvider" policy="static"/>
 </scr:component>
index 0d5696b7ed1583db7021538bf997b8d1071d874d..3dc5007fc0be274380ee18dd68436a30b62e9bc5 100644 (file)
@@ -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;
+       }
+
 }