From 25acaf721ed29e8cbe1701578a5b225d77c928de Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 1 Dec 2020 08:00:26 +0100 Subject: [PATCH] Improve user administration. --- .../src/org/argeo/suite/SuiteUtils.java | 3 ++ .../org/argeo/suite/ui/DefaultLeadPane.java | 32 ++++++++++++- .../src/org/argeo/suite/ui/SuiteApp.java | 47 +++---------------- 3 files changed, 40 insertions(+), 42 deletions(-) diff --git a/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java b/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java index b5acb27..e63b515 100644 --- a/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java +++ b/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java @@ -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); } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java index 4a641dc..60accfe 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java @@ -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> 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 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 properties) { diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java index d00efc9..799fb91 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java @@ -172,6 +172,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } private T findByType(Map> byType, Node context) { + if (context == null) + throw new IllegalArgumentException("A node should be provided"); try { // mixins Set 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); -- 2.30.2