From 54fb8849152a3d91f7ba52aeeffb236f5e70fbdf Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 13 Nov 2018 15:55:30 +0100 Subject: [PATCH] Introduce Eclipse 4 UI-level authorizations --- org.argeo.cms.e4/e4xmi/cms-devops.e4xmi | 5 ++ .../org/argeo/cms/e4/addons/AuthAddon.java | 77 +++++++++++++++++++ .../cms/e4/handlers/OpenPerspective.java | 5 +- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java diff --git a/org.argeo.cms.e4/e4xmi/cms-devops.e4xmi b/org.argeo.cms.e4/e4xmi/cms-devops.e4xmi index 8228d87b5..beff27d7c 100644 --- a/org.argeo.cms.e4/e4xmi/cms-devops.e4xmi +++ b/org.argeo.cms.e4/e4xmi/cms-devops.e4xmi @@ -3,6 +3,7 @@ shellMaximized + auth.cn=admin,ou=roles,ou=node @@ -30,6 +31,7 @@ + auth.cn=admin,ou=roles,ou=node @@ -83,6 +85,7 @@ + auth.cn=admin,ou=roles,ou=node @@ -120,5 +123,7 @@ + + diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java new file mode 100644 index 000000000..6f03139ca --- /dev/null +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java @@ -0,0 +1,77 @@ +package org.argeo.cms.e4.addons; + +import java.util.Iterator; + +import javax.annotation.PostConstruct; + +import org.argeo.cms.auth.CurrentUser; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.ui.MElementContainer; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar; +import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow; +import org.eclipse.e4.ui.model.application.ui.basic.MWindow; + +public class AuthAddon { + public final static String AUTH = "auth."; + + @PostConstruct + void init(MApplication application) { + Iterator windows = application.getChildren().iterator(); + windows: while (windows.hasNext()) { + MWindow window = windows.next(); + // main window + boolean windowVisible = process(window); + if (!windowVisible) { + windows.remove(); + continue windows; + } + // trim bars + if (window instanceof MTrimmedWindow) { + Iterator trimBars = ((MTrimmedWindow) window).getTrimBars().iterator(); + while (trimBars.hasNext()) { + MTrimBar trimBar = trimBars.next(); + if (!process(trimBar)) { + trimBars.remove(); + } + } + } + } + } + + protected boolean process(MUIElement element) { + for (String tag : element.getTags()) { + if (tag.startsWith(AUTH)) { + String role = tag.substring(AUTH.length(), tag.length()); + if (!CurrentUser.isInRole(role)) { + element.setVisible(false); + element.setToBeRendered(false); + return false; + } + } + } + + // children + if (element instanceof MElementContainer) { + @SuppressWarnings("unchecked") + MElementContainer container = (MElementContainer) element; + Iterator children = container.getChildren().iterator(); + while (children.hasNext()) { + MUIElement child = children.next(); + boolean visible = process(child); + if (!visible) + children.remove(); + } + + for (Object child : container.getChildren()) { + if (child instanceof MUIElement) { + boolean visible = process((MUIElement) child); + if (!visible) + container.getChildren().remove(child); + } + } + } + + return true; + } +} diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/OpenPerspective.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/OpenPerspective.java index 3ab77e8d0..ac544b107 100644 --- a/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/OpenPerspective.java +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/OpenPerspective.java @@ -23,6 +23,9 @@ public class OpenPerspective { public void execute(@Named("perspectiveId") String perspectiveId) { List perspectives = modelService.findElements(application, perspectiveId, MPerspective.class, null); - partService.switchPerspective(perspectives.get(0)); + if (perspectives.size() == 0) + return; + MPerspective perspective = perspectives.get(0); + partService.switchPerspective(perspective); } } -- 2.30.2