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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3f78f9fae RANGER-4478: Incorrect trie updates when processing deltas - 
Part 3
3f78f9fae is described below

commit 3f78f9fae635b4dc1febdd1aad99e485cde412d6
Author: Abhay Kulkarni <ab...@apache.org>
AuthorDate: Sat Nov 4 13:16:35 2023 -0700

    RANGER-4478: Incorrect trie updates when processing deltas - Part 3
---
 .../plugin/policyengine/RangerResourceTrie.java    | 41 +++++++++++++++++++---
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceTrie.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceTrie.java
index d95da7c50..773a02609 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceTrie.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceTrie.java
@@ -576,7 +576,7 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
 
     }
 
-    private String getNonWildcardPrefix(String str) {
+    private int getNonWildcardPrefixLength(String str) {
         int minIndex = str.length();
 
         for (int i = 0; i < wildcardChars.length(); i++) {
@@ -587,9 +587,17 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
             }
         }
 
-        return str.substring(0, minIndex);
+        return minIndex;
+    }
+
+    private String getNonWildcardPrefix(String str) {
+        int prefixLen = getNonWildcardPrefixLength(str);
+
+        return (prefixLen < str.length()) ? str.substring(0, prefixLen) : str;
     }
 
+
+
     private Set<T> getEvaluatorsForResource(String resource, 
ResourceElementMatchingScope scope) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> RangerResourceTrie.getEvaluatorsForResource(" + 
resource + ", " + scope + ")");
@@ -718,7 +726,7 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
         }
 
         TrieNode<T> curr = root;
-        final int   len  = resource.length();
+        final int   len  = getNonWildcardPrefixLength(resource);
         int         i    = 0;
 
         while (i < len) {
@@ -738,6 +746,8 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
             i    += childStr.length();
         }
 
+        curr = (i == len) ? curr : null;
+
         RangerPerfTracer.logAlways(perf);
 
         if(LOG.isDebugEnabled()) {
@@ -1128,11 +1138,21 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
         }
 
         void removeSelfFromTrie() {
-            if (evaluators == null && wildcardEvaluators == null && 
children.size() == 0) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("==> removeSelfFromTrie(" + this + ")");
+            }
+            if (evaluators == null && children.size() == 0) {
                 TrieNode<U> parent = getParent();
                 if (parent != null) {
                     parent.children.remove(str.charAt(0));
                 }
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("removeSelfFromTrie(" + this + ") could not 
remove self from Trie");
+                }
+            }
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("<== removeSelfFromTrie(" + this + ")");
             }
         }
 
@@ -1298,12 +1318,25 @@ public class RangerResourceTrie<T extends 
RangerResourceEvaluator> {
         }
 
         private void removeEvaluatorFromSubtree(U evaluator) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("==> removeEvaluatorFromSubtree(" + 
evaluator.getId() + ")");
+            }
             if (CollectionUtils.isNotEmpty(wildcardEvaluators) && 
wildcardEvaluators.contains(evaluator)) {
                 removeWildcardEvaluator(evaluator);
             } else {
                 removeEvaluator(evaluator);
             }
             removeSelfFromTrie();
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("<== removeEvaluatorFromSubtree(" + 
evaluator.getId() + ")");
+            }
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            toString(sb);
+            return sb.toString();
         }
 
         void toString(StringBuilder sb) {

Reply via email to