You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/01/13 16:18:24 UTC

[isis] branch master updated: ISIS-2703: secman: prevent tenancies from containing themselves

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 21d48cb  ISIS-2703: secman: prevent tenancies from containing themselves
21d48cb is described below

commit 21d48cb0d2b9b77dfb81c28d5997acb0f16b8eb4
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 13 17:18:02 2022 +0100

    ISIS-2703: secman: prevent tenancies from containing themselves
---
 .../dom/mixins/ApplicationTenancy_addChild.java      | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/mixins/ApplicationTenancy_addChild.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/mixins/ApplicationTenancy_addChild.java
index cbff35c..35a02d3 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/mixins/ApplicationTenancy_addChild.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/mixins/ApplicationTenancy_addChild.java
@@ -19,6 +19,7 @@
 package org.apache.isis.extensions.secman.applib.tenancy.dom.mixins;
 
 import java.util.Collection;
+import java.util.Objects;
 
 import javax.inject.Inject;
 
@@ -61,10 +62,27 @@ public class ApplicationTenancy_addChild {
 
     @MemberSupport public Collection<? extends ApplicationTenancy> choicesChild() {
         val choices =_Lists.newArrayList(applicationTenancyRepository.getRootTenancies());
-        choices.remove(target);
+        choices.removeIf(this::containsTarget); // ensure tree structure (nodes cannot contain themselves)
         return choices; }
 
     @MemberSupport public String disableAct() {
         return choicesChild().isEmpty()? "No root (non-paranted) tenancies available": null; }
 
+
+    // -- HELPER
+
+    /**
+     *  For given t traverses up the tree hierarchy in search of a match.
+     */
+    private boolean containsTarget(final ApplicationTenancy t) {
+        var node = t;
+        while(node!=null) {
+            if(Objects.equals(node, target)) {
+                return true;
+            }
+            node = node.getParent();
+        }
+        return false;
+    }
+
 }