From 3b2923f0bc172a755c68d4a3700dcd73287fcd8c Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 7 Feb 2021 08:21:21 +0100 Subject: [PATCH] Layer visibility depending on roles. --- .../src/org/argeo/suite/SuiteUtils.java | 23 +++++++ .../org/argeo/suite/ui/DefaultLeadPane.java | 67 +++++++++++-------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java b/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java index e63b515..93f3b14 100644 --- a/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java +++ b/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java @@ -1,5 +1,8 @@ package org.argeo.suite; +import java.util.HashSet; +import java.util.Set; + import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -96,4 +99,24 @@ public class SuiteUtils { } + public static Set extractRoles(String[] semiColArr) { + Set res = new HashSet<>(); + // TODO factorize and make it more robust + final String rolesPrefix = "roles:=\""; + // first one is layer id + for (int i = 1; i < semiColArr.length; i++) { + if (semiColArr[i].startsWith(rolesPrefix)) { + String rolesStr = semiColArr[i].substring(rolesPrefix.length()); + // remove last " + rolesStr = rolesStr.substring(0, rolesStr.lastIndexOf('\"')); + // TODO support AND (&) as well + String[] roles = rolesStr.split("\\|");// OR (|) + for (String role : roles) { + res.add(role.trim()); + } + } + } + return res; + } + } diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java index a207e7a..b777deb 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java @@ -2,7 +2,9 @@ package org.argeo.suite.ui; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import javax.jcr.Node; @@ -10,12 +12,12 @@ 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.CmsUiProvider; import org.argeo.cms.ui.CmsView; import org.argeo.suite.RankedObject; +import org.argeo.suite.SuiteUtils; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; @@ -44,9 +46,23 @@ public class DefaultLeadPane implements CmsUiProvider { layout.marginRight = 10; parent.setLayout(layout); +// boolean isAdmin = cmsView.doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN)); + Set userRoles = cmsView.doAs(() -> CurrentUser.roles()); Button first = null; - for (String layerId : defaultLayers) { + layers: for (String layerDef : defaultLayers) { + layerDef = layerDef.trim(); + if ("".equals(layerDef)) + continue layers;// skip empty lines + String[] semiColArr = layerDef.split(";"); + String layerId = semiColArr[0]; + Set layerRoles = SuiteUtils.extractRoles(semiColArr); if (layers.containsKey(layerId)) { + if (!layerRoles.isEmpty()) { + Set intersection = new HashSet(layerRoles); + intersection.retainAll(userRoles); + if (intersection.isEmpty()) + continue layers;// skip unauthorized layer + } RankedObject layerObj = layers.get(layerId); // TODO deal with i10n @@ -66,29 +82,26 @@ public class DefaultLeadPane implements CmsUiProvider { } } - // TODO factorise - boolean isAdmin = cmsView.doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN)); - if (isAdmin && adminLayers != null) - 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 = SuiteUiUtils.createLayerButton(parent, layerId, title, icon); - if (first == null) - first = b; - } - } +// if (isAdmin && adminLayers != null) +// for (String layerId : adminLayers) { +// if (layers.containsKey(layerId)) { +// RankedObject layerObj = layers.get(layerId); +// +// 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 = SuiteUiUtils.createLayerButton(parent, layerId, title, icon); +// if (first == null) +// first = b; +// } +// } // Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard); if (!cmsView.isAnonymous()) { @@ -106,8 +119,8 @@ public class DefaultLeadPane implements CmsUiProvider { 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)); + if (adminLayers != null) + log.error("DEPRECATED - Admin layers: " + Arrays.asList(adminLayers)); } public void addLayer(SuiteLayer layer, Map properties) { -- 2.30.2