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

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


The following commit(s) were added to refs/heads/master by this push:
     new fa110b92d79 Handle object arrays in toJsonRecursive while obfuscation 
(#18147)
fa110b92d79 is described below

commit fa110b92d7986926fe7e1c09c8e069957541a41d
Author: Shounak kulkarni <[email protected]>
AuthorDate: Thu Apr 9 19:04:15 2026 +0530

    Handle object arrays in toJsonRecursive while obfuscation (#18147)
---
 .../org/apache/pinot/spi/utils/Obfuscator.java     |  8 +--
 .../org/apache/pinot/spi/utils/ObfuscatorTest.java | 81 ++++++++++++++++++++++
 2 files changed, 85 insertions(+), 4 deletions(-)

diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/Obfuscator.java 
b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/Obfuscator.java
index 985f55255df..059a5019ec5 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/Obfuscator.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/Obfuscator.java
@@ -129,12 +129,12 @@ public final class Obfuscator {
       node.fieldNames().forEachRemaining(field -> {
         if (_patterns.stream().anyMatch(pattern -> 
pattern.matcher(field).matches())) {
           ((ObjectNode) node).put(field, _maskedValue);
-        } else if (node.isArray()) {
-          IntStream.range(0, node.size()).forEach(i -> ((ArrayNode) 
node).set(i, toJsonRecursive(node.get(i))));
-        } else if (node.isObject()) {
-          ((ObjectNode) node).put(field, toJsonRecursive(node.get(field)));
+        } else {
+          ((ObjectNode) node).set(field, toJsonRecursive(node.get(field)));
         }
       });
+    } else if (node.isArray()) {
+      IntStream.range(0, node.size()).forEach(i -> ((ArrayNode) node).set(i, 
toJsonRecursive(node.get(i))));
     }
 
     return node;
diff --git 
a/pinot-spi/src/test/java/org/apache/pinot/spi/utils/ObfuscatorTest.java 
b/pinot-spi/src/test/java/org/apache/pinot/spi/utils/ObfuscatorTest.java
index 7b7f50828e9..fb1e45fe8ac 100644
--- a/pinot-spi/src/test/java/org/apache/pinot/spi/utils/ObfuscatorTest.java
+++ b/pinot-spi/src/test/java/org/apache/pinot/spi/utils/ObfuscatorTest.java
@@ -20,6 +20,7 @@ package org.apache.pinot.spi.utils;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -130,4 +131,84 @@ public class ObfuscatorTest {
     Assert.assertTrue(output.contains(VALUE));
     Assert.assertFalse(output.contains(SECRET));
   }
+
+  @Test
+  public void testArrayOfObjects() {
+    Map<String, Object> item1 = new HashMap<>();
+    item1.put("name", "item1");
+    item1.put("password", "SECRET");
+
+    Map<String, Object> item2 = new HashMap<>();
+    item2.put("name", "item2");
+    item2.put("secret", "SECRET");
+
+    Map<String, Object> root = new HashMap<>();
+    root.put("items", Arrays.asList(item1, item2));
+
+    String output = _obfuscator.toJsonString(root);
+    Assert.assertTrue(output.contains("item1"));
+    Assert.assertTrue(output.contains("item2"));
+    Assert.assertFalse(output.contains(SECRET));
+  }
+
+  @Test
+  public void testNestedArrayOfObjects() {
+    Map<String, Object> innerItem = new HashMap<>();
+    innerItem.put("token", "SECRET");
+    innerItem.put("host", "localhost");
+
+    Map<String, Object> outerItem = new HashMap<>();
+    outerItem.put("connections", Collections.singletonList(innerItem));
+    outerItem.put("label", "cluster-1");
+
+    Map<String, Object> root = new HashMap<>();
+    root.put("clusters", Collections.singletonList(outerItem));
+
+    String output = _obfuscator.toJsonString(root);
+    Assert.assertTrue(output.contains("localhost"));
+    Assert.assertTrue(output.contains("cluster-1"));
+    Assert.assertFalse(output.contains(SECRET));
+  }
+
+  @Test
+  public void testArrayOfObjectsViaJsonString() {
+    String json = "{\"items\":[{\"user\":\"admin\",\"password\":\"SECRET\"},"
+        + "{\"user\":\"reader\",\"token\":\"SECRET\"}]}";
+    String output = _obfuscator.toJsonString(json);
+    Assert.assertTrue(output.contains("admin"));
+    Assert.assertTrue(output.contains("reader"));
+    Assert.assertFalse(output.contains(SECRET));
+  }
+
+  @Test
+  public void testTopLevelArray()
+      throws IOException {
+    JsonNode node = 
JsonUtils.stringToJsonNode("[{\"password\":\"SECRET\",\"host\":\"db1\"},{\"token\":\"SECRET\","
+        + "\"host\":\"db2\"}]");
+    String output = _obfuscator.toJsonString(node);
+    Assert.assertTrue(output.contains("db1"));
+    Assert.assertTrue(output.contains("db2"));
+    Assert.assertFalse(output.contains(SECRET));
+  }
+
+  @Test
+  public void testArrayWithMixedContent() {
+    Map<String, Object> root = new HashMap<>();
+    root.put("tags", Arrays.asList("public", "production"));
+    root.put("credentials", Arrays.asList(
+        createEntry("apiKey", "SECRET"),
+        createEntry("apiKey", "SECRET")
+    ));
+
+    String output = _obfuscator.toJsonString(root);
+    Assert.assertTrue(output.contains("public"));
+    Assert.assertTrue(output.contains("production"));
+    Assert.assertFalse(output.contains(SECRET));
+  }
+
+  private static Map<String, Object> createEntry(String key, String value) {
+    Map<String, Object> map = new HashMap<>();
+    map.put(key, value);
+    return map;
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to