diff --git a/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/MainTest.java b/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/MainTest.java index 2f473b6233..4834fd369d 100644 --- a/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/MainTest.java +++ b/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/MainTest.java @@ -1355,6 +1355,7 @@ public void testSensitiveData() throws Exception { assertLog(log, ".*" + Pattern.quote("map: {nonSecretButMasked=******, secret=******}") + ".*"); assertLog(log, ".*" + Pattern.quote("map: {nonSecret=non secret value, secret=******}") + ".*"); assertLog(log, ".*" + Pattern.quote("map.nested: {nonSecret=non secret value, secret={top-secret=******}}") + ".*"); + assertLog(log, ".*" + Pattern.quote("map.path: {nonSecret=non secret value, key={top-secret=******, inner=non secret value}}") + ".*"); assertLog(log, ".*" + Pattern.quote("plain: plain") + ".*"); diff --git a/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/tasks/Tasks.java b/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/tasks/Tasks.java index b1e9fa9ce1..630bcb7feb 100644 --- a/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/tasks/Tasks.java +++ b/runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/tasks/Tasks.java @@ -305,6 +305,18 @@ public Map getSensitiveMapStrict(String str) { return result; } + @SensitiveData(keys = {"key.top-secret"}) + public Map getSensitiveMapWithPath(String str) { + Map inner = new LinkedHashMap<>(); + inner.put("top-secret", str); + inner.put("inner", "non secret value"); + + Map result = new LinkedHashMap<>(); + result.put("nonSecret", "non secret value"); + result.put("key", inner); + return result; + } + @SensitiveData(keys = {"secret"}, includeNestedValues = true) public Map getSensitiveMapWithNested(String str) { Map result = new LinkedHashMap<>(); diff --git a/runtime/v2/runner-test/src/test/resources/com/walmartlabs/concord/runtime/v2/runner/sensitiveData/concord.yaml b/runtime/v2/runner-test/src/test/resources/com/walmartlabs/concord/runtime/v2/runner/sensitiveData/concord.yaml index b714d0c05f..21e46a8e85 100644 --- a/runtime/v2/runner-test/src/test/resources/com/walmartlabs/concord/runtime/v2/runner/sensitiveData/concord.yaml +++ b/runtime/v2/runner-test/src/test/resources/com/walmartlabs/concord/runtime/v2/runner/sensitiveData/concord.yaml @@ -12,6 +12,7 @@ flows: - log: "map: ${sensitiveTask.getSensitiveMap('XXX-MAP')}" - log: "map: ${sensitiveTask.getSensitiveMapStrict('XXX-MAP')}" - log: "map.nested: ${sensitiveTask.getSensitiveMapWithNested('top-secret-nested-value')}" + - log: "map.path: ${sensitiveTask.getSensitiveMapWithPath('mask-this-value')}" - log: "plain: ${sensitiveTask.getPlain('plain')}" diff --git a/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/el/resolvers/SensitiveDataProcessor.java b/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/el/resolvers/SensitiveDataProcessor.java index c3c2721799..7b4f0f6447 100644 --- a/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/el/resolvers/SensitiveDataProcessor.java +++ b/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/el/resolvers/SensitiveDataProcessor.java @@ -21,6 +21,7 @@ */ import com.google.inject.Inject; +import com.walmartlabs.concord.common.ConfigurationUtils; import com.walmartlabs.concord.runtime.v2.sdk.SensitiveData; import com.walmartlabs.concord.runtime.v2.sdk.SensitiveDataHolder; @@ -39,6 +40,7 @@ public SensitiveDataProcessor(SensitiveDataHolder sensitiveDataHolder) { this.sensitiveDataHolder = sensitiveDataHolder; } + @SuppressWarnings("unchecked") public void process(Object value, Method method) { if (value == null || method == null) { return; @@ -51,17 +53,37 @@ public void process(Object value, Method method) { if (value instanceof String) { sensitiveDataHolder.add((String) value); - } else if (value instanceof Map m) { - var keys = a.keys() != null && a.keys().length > 0 ? new HashSet(Arrays.asList(a.keys())) : m.keySet(); - - for (var key : keys) { - var v = m.get(key); - if (v instanceof String) { - sensitiveDataHolder.add((String) v); - } else if (a.includeNestedValues() && v instanceof Map nested) { - processNestedValues(nested, 0); + } + + if (value instanceof Map m) { + collectFromMap((Map) m, a); + } + } + + private void collectFromMap(Map m, SensitiveData a) { + if (a.keys() != null && a.keys().length > 0) { + for (var k : a.keys()) { + var path = k.split("\\."); + if (ConfigurationUtils.has(m, path)) { + var v = ConfigurationUtils.get(m, path); + collectValue(v, a); } } + } else { + for (var key : m.keySet()) { + collectValue(m.get(key), a); + } + } + } + + private void collectValue(Object v, SensitiveData a) { + if (v instanceof String s) { + sensitiveDataHolder.add(s); + return; + } + + if (a.includeNestedValues() && v instanceof Map nested) { + processNestedValues(nested, 0); } }