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]