Improve user administration. argeo-git/staging github/staging
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 1 Dec 2020 07:00:26 +0000 (08:00 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 1 Dec 2020 07:00:26 +0000 (08:00 +0100)
org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java

index b5acb2727857c4e0df8e2f659383ee7677ff57ca..e63b5152c0b00430aad95bd83d5b12e2d392b7b5 100644 (file)
@@ -8,6 +8,7 @@ import javax.jcr.security.Privilege;
 import javax.naming.ldap.LdapName;
 import javax.security.auth.x500.X500Principal;
 
+import org.argeo.api.NodeConstants;
 import org.argeo.cms.auth.CmsSession;
 import org.argeo.entity.EntityType;
 import org.argeo.jackrabbit.security.JackrabbitSecurityUtils;
@@ -39,6 +40,8 @@ public class SuiteUtils {
                                                Privilege.JCR_READ);
                                JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
                                                Privilege.JCR_READ);
+                               JcrUtils.addPrivilege(adminSession, userNode.getPath(), NodeConstants.ROLE_USER_ADMIN,
+                                               Privilege.JCR_ALL);
                        } else {
                                userNode = usersBase.getNode(uid);
                        }
index 4a641dcb807338cefb24cbe1e06d6bfded880966..60accfe2042e2481a2f7e6075785b7aee891205e 100644 (file)
@@ -10,7 +10,9 @@ import javax.jcr.RepositoryException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeConstants;
 import org.argeo.cms.Localized;
+import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
@@ -31,11 +33,12 @@ public class DefaultLeadPane implements CmsUiProvider {
        private final static Log log = LogFactory.getLog(DefaultLeadPane.class);
 
        public static enum Property {
-               defaultLayers;
+               defaultLayers, adminLayers;
        }
 
        private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
        private String[] defaultLayers;
+       private String[] adminLayers;
 
        @Override
        public Control createUi(Composite parent, Node node) throws RepositoryException {
@@ -69,6 +72,30 @@ public class DefaultLeadPane implements CmsUiProvider {
                        }
                }
 
+               // TODO factorise
+               boolean isAdmin = cmsView.doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN));
+               if (isAdmin)
+                       for (String layerId : adminLayers) {
+                               if (layers.containsKey(layerId)) {
+                                       RankedObject<SuiteLayer> layerObj = layers.get(layerId);
+
+                                       // TODO deal with i10n
+                                       String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name());
+                                       Localized title = null;
+                                       if (titleStr != null)
+                                               title = new Localized.Untranslated(titleStr);
+
+                                       String iconName = (String) layerObj.getProperties().get(SuiteLayer.Property.icon.name());
+                                       SuiteIcon icon = null;
+                                       if (iconName != null)
+                                               icon = SuiteIcon.valueOf(iconName);
+
+                                       Button b = createButton(parent, layerId, title, icon);
+                                       if (first == null)
+                                               first = b;
+                               }
+                       }
+
 //             Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard);
                if (!cmsView.isAnonymous()) {
 //                     createButton(parent, SuiteMsg.documents.name(), SuiteMsg.documents, SuiteIcon.documents);
@@ -102,6 +129,9 @@ public class DefaultLeadPane implements CmsUiProvider {
                        throw new IllegalArgumentException("Default layers must be set.");
                if (log.isDebugEnabled())
                        log.debug("Default layers: " + Arrays.asList(defaultLayers));
+               adminLayers = (String[]) properties.get(Property.adminLayers.toString());
+               if (log.isDebugEnabled() && adminLayers != null)
+                       log.debug("Admin layers: " + Arrays.asList(adminLayers));
        }
 
        public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
index d00efc9208469daa38f561163bdaee0c6a110a41..799fb9181d7d1248f4160c4acf3ab3e10c7c71cf 100644 (file)
@@ -172,6 +172,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        }
 
        private <T> T findByType(Map<String, RankedObject<T>> byType, Node context) {
+               if (context == null)
+                       throw new IllegalArgumentException("A node should be provided");
                try {
                        // mixins
                        Set<String> types = new TreeSet<>();
@@ -234,45 +236,6 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                        suiteUi.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
                        suiteUi.getCmsView().sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
                }
-
-//             CmsView cmsView = CmsView.getCmsView(parent);
-//             if (cmsView.isAnonymous())
-//                     return;
-//             Session session = null;
-//             try {
-//                     if (state != null && state.startsWith("/")) {
-//                             String path = state.substring(1);
-//                             String workspace;
-//                             if (path.equals("")) {
-//                                     workspace = null;
-//                                     path = "/";
-//                             } else {
-//                                     int index = path.indexOf('/');
-//                                     if (index == 0) {
-//                                             log.error("Cannot interpret " + state);
-//                                             cmsView.navigateTo("~");
-//                                             return;
-//                                     } else if (index > 0) {
-//                                             workspace = path.substring(0, index);
-//                                             path = path.substring(index);
-//                                     } else {// index<0, assuming root node
-//                                             workspace = path;
-//                                             path = "/";
-//                                     }
-//                             }
-//                             session = cmsView.doAs(() -> Jcr.login(getRepository(), workspace));
-//
-//                             Node node = session.getNode(path);
-//
-//                             cmsView.sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
-//                             cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
-//                     }
-//             } catch (RepositoryException e) {
-//                     log.error("Cannot load state " + state, e);
-//                     cmsView.navigateTo("~");
-//             } finally {
-//                     JcrUtils.logoutQuietly(session);
-//             }
        }
 
        private String nodeToState(Node node) {
@@ -304,8 +267,6 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                path = "/";
                        }
                }
-//             session = cmsView.doAs(() -> Jcr.login(getRepository(), workspace));
-
                Session session = suiteUi.getSession(workspace);
                if (session == null)
                        return null;
@@ -327,6 +288,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 //                     SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null;
                        if (isTopic(event, SuiteEvent.refreshPart)) {
                                Node node = getNode(ui, event);
+                               if (node == null)
+                                       return;
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
                                SuiteLayer layer = findByType(layersByType, node);
                                ui.switchToLayer(layer, node);
@@ -334,6 +297,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node));
                        } else if (isTopic(event, SuiteEvent.openNewPart)) {
                                Node node = getNode(ui, event);
+                               if (node == null)
+                                       return;
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
                                SuiteLayer layer = findByType(layersByType, node);
                                ui.switchToLayer(layer, node);