Skip to content

Commit b25c5f2

Browse files
committed
runtime-v2: allow specify sensitive data path
1 parent aadcda3 commit b25c5f2

File tree

5 files changed

+54
-9
lines changed

5 files changed

+54
-9
lines changed

runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/MainTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,7 @@ public void testSensitiveData() throws Exception {
13551355
assertLog(log, ".*" + Pattern.quote("map: {nonSecretButMasked=******, secret=******}") + ".*");
13561356
assertLog(log, ".*" + Pattern.quote("map: {nonSecret=non secret value, secret=******}") + ".*");
13571357
assertLog(log, ".*" + Pattern.quote("map.nested: {nonSecret=non secret value, secret={top-secret=******}}") + ".*");
1358+
assertLog(log, ".*" + Pattern.quote("map.path: {nonSecret=non secret value, key={top-secret=******, inner=non secret value}}") + ".*");
13581359

13591360
assertLog(log, ".*" + Pattern.quote("plain: plain") + ".*");
13601361

runtime/v2/runner-test/src/test/java/com/walmartlabs/concord/runtime/v2/runner/tasks/Tasks.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,18 @@ public Map<String, String> getSensitiveMapStrict(String str) {
305305
return result;
306306
}
307307

308+
@SensitiveData(paths = {"key.top-secret"})
309+
public Map<String, Object> getSensitiveMapWithPath(String str) {
310+
Map<String, Object> inner = new LinkedHashMap<>();
311+
inner.put("top-secret", str);
312+
inner.put("inner", "non secret value");
313+
314+
Map<String, Object> result = new LinkedHashMap<>();
315+
result.put("nonSecret", "non secret value");
316+
result.put("key", inner);
317+
return result;
318+
}
319+
308320
@SensitiveData(keys = {"secret"}, includeNestedValues = true)
309321
public Map<String, Object> getSensitiveMapWithNested(String str) {
310322
Map<String, Object> result = new LinkedHashMap<>();

runtime/v2/runner-test/src/test/resources/com/walmartlabs/concord/runtime/v2/runner/sensitiveData/concord.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ flows:
1212
- log: "map: ${sensitiveTask.getSensitiveMap('XXX-MAP')}"
1313
- log: "map: ${sensitiveTask.getSensitiveMapStrict('XXX-MAP')}"
1414
- log: "map.nested: ${sensitiveTask.getSensitiveMapWithNested('top-secret-nested-value')}"
15+
- log: "map.path: ${sensitiveTask.getSensitiveMapWithPath('mask-this-value')}"
1516

1617
- log: "plain: ${sensitiveTask.getPlain('plain')}"
1718

runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/el/resolvers/SensitiveDataProcessor.java

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*/
2222

2323
import com.google.inject.Inject;
24+
import com.walmartlabs.concord.common.ConfigurationUtils;
2425
import com.walmartlabs.concord.runtime.v2.sdk.SensitiveData;
2526
import com.walmartlabs.concord.runtime.v2.sdk.SensitiveDataHolder;
2627

@@ -39,6 +40,7 @@ public SensitiveDataProcessor(SensitiveDataHolder sensitiveDataHolder) {
3940
this.sensitiveDataHolder = sensitiveDataHolder;
4041
}
4142

43+
@SuppressWarnings("unchecked")
4244
public void process(Object value, Method method) {
4345
if (value == null || method == null) {
4446
return;
@@ -51,17 +53,44 @@ public void process(Object value, Method method) {
5153

5254
if (value instanceof String) {
5355
sensitiveDataHolder.add((String) value);
54-
} else if (value instanceof Map<?, ?> m) {
55-
var keys = a.keys() != null && a.keys().length > 0 ? new HashSet<Object>(Arrays.asList(a.keys())) : m.keySet();
56-
57-
for (var key : keys) {
58-
var v = m.get(key);
59-
if (v instanceof String) {
60-
sensitiveDataHolder.add((String) v);
61-
} else if (a.includeNestedValues() && v instanceof Map<?,?> nested) {
62-
processNestedValues(nested, 0);
56+
}
57+
58+
if (value instanceof Map<?, ?> m) {
59+
collectFromMap((Map<String, Object>) m, a);
60+
}
61+
}
62+
63+
private void collectFromMap(Map<String, Object> m, SensitiveData a) {
64+
// paths
65+
if (a.paths() != null && a.paths().length > 0) {
66+
for (var p : a.paths()) {
67+
var path = p.split("\\.");
68+
if (ConfigurationUtils.has(m, path)) {
69+
var v = ConfigurationUtils.get(m, path);
70+
collectValue(v, a);
6371
}
6472
}
73+
return;
74+
}
75+
76+
// all keys or specific keys
77+
var keys = (a.keys() != null && a.keys().length > 0)
78+
? new HashSet<>(Arrays.asList(a.keys()))
79+
: m.keySet();
80+
81+
for (var key : keys) {
82+
collectValue(m.get(key), a);
83+
}
84+
}
85+
86+
private void collectValue(Object v, SensitiveData a) {
87+
if (v instanceof String s) {
88+
sensitiveDataHolder.add(s);
89+
return;
90+
}
91+
92+
if (a.includeNestedValues() && v instanceof Map<?, ?> nested) {
93+
processNestedValues(nested, 0);
6594
}
6695
}
6796

runtime/v2/sdk/src/main/java/com/walmartlabs/concord/runtime/v2/sdk/SensitiveData.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,7 @@
5151

5252
String[] keys() default {};
5353

54+
String[] paths() default {};
55+
5456
boolean includeNestedValues() default false;
5557
}

0 commit comments

Comments
 (0)