Skip to content

Commit dd05eb9

Browse files
committed
runtime-v2: use SensitiveDataHolder for task parameter masking
1 parent 5ab8d98 commit dd05eb9

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/remote/TaskCallEventRecordingListener.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.walmartlabs.concord.runtime.v2.model.Location;
2929
import com.walmartlabs.concord.runtime.v2.model.Step;
3030
import com.walmartlabs.concord.runtime.v2.runner.EventReportingService;
31+
import com.walmartlabs.concord.runtime.v2.runner.SensitiveDataHolder;
3132
import com.walmartlabs.concord.runtime.v2.runner.tasks.TaskCallEvent;
3233
import com.walmartlabs.concord.runtime.v2.runner.tasks.TaskCallListener;
3334
import com.walmartlabs.concord.runtime.v2.sdk.*;
@@ -64,7 +65,9 @@ public void onEvent(TaskCallEvent event) {
6465

6566
List<Object> inVars = event.input();
6667
if (inVars != null && eventConfiguration.recordTaskInVars()) {
67-
Map<String, Object> vars = maskVars(convertInput(hideSensitiveData(inVars, event.inputAnnotations())), eventConfiguration.inVarsBlacklist());
68+
Map<String, Object> input = convertInput(processSensitiveDataAnnotations(inVars, event.inputAnnotations()));
69+
input = processSensitiveData(input);
70+
Map<String, Object> vars = processVarBlacklist(input, eventConfiguration.inVarsBlacklist());
6871
if (eventConfiguration.truncateInVars()) {
6972
vars = ObjectTruncater.truncateMap(vars, eventConfiguration.truncateMaxStringLength(), eventConfiguration.truncateMaxArrayLength(), eventConfiguration.truncateMaxDepth());
7073
}
@@ -75,7 +78,9 @@ public void onEvent(TaskCallEvent event) {
7578

7679
Object outVars = event.result();
7780
if (outVars != null && eventConfiguration.recordTaskOutVars()) {
78-
Map<String, Object> vars = maskVars(asMapOrNull(outVars), eventConfiguration.outVarsBlacklist());
81+
Map<String, Object> output = asMapOrNull(outVars);
82+
output = processSensitiveData(output);
83+
Map<String, Object> vars = processVarBlacklist(output, eventConfiguration.outVarsBlacklist());
7984
if (eventConfiguration.truncateOutVars()) {
8085
vars = ObjectTruncater.truncateMap(vars, eventConfiguration.truncateMaxStringLength(), eventConfiguration.truncateMaxArrayLength(), eventConfiguration.truncateMaxDepth());
8186
}
@@ -86,7 +91,9 @@ public void onEvent(TaskCallEvent event) {
8691

8792
Object metaVars = event.meta();
8893
if (metaVars != null && eventConfiguration.recordTaskMeta()) {
89-
Map<String, Object> meta = maskVars(asMapOrNull(metaVars), eventConfiguration.metaBlacklist());
94+
Map<String, Object> rawMeta = asMapOrNull(metaVars);
95+
Map<String, Object> meta = processSensitiveData(rawMeta);
96+
meta = processVarBlacklist(meta, eventConfiguration.metaBlacklist());
9097
if (eventConfiguration.truncateMeta()) {
9198
meta = ObjectTruncater.truncateMap(meta, eventConfiguration.truncateMaxStringLength(), eventConfiguration.truncateMaxArrayLength(), eventConfiguration.truncateMaxDepth());
9299
}
@@ -154,7 +161,7 @@ private Map<String, Object> asMapOrNull(Object v) {
154161
return null;
155162
}
156163

157-
static Map<String, Object> maskVars(Map<String, Object> vars, Collection<String> blackList) {
164+
static Map<String, Object> processVarBlacklist(Map<String, Object> vars, Collection<String> blackList) {
158165
if (blackList.isEmpty()) {
159166
return vars;
160167
}
@@ -170,6 +177,34 @@ static Map<String, Object> maskVars(Map<String, Object> vars, Collection<String>
170177
return result;
171178
}
172179

180+
@SuppressWarnings({"unchecked", "rawtypes"})
181+
static <T> T processSensitiveData(T v) {
182+
Set<String> sensitiveStrings = SensitiveDataHolder.getInstance().get();
183+
if (sensitiveStrings.isEmpty()) {
184+
return v;
185+
}
186+
187+
if (v instanceof String s) {
188+
for (String sensitiveString : sensitiveStrings) {
189+
s = s.replace(sensitiveString, MASK);
190+
}
191+
return (T) s;
192+
} else if (v instanceof List<?> l) {
193+
List<Object> result = new ArrayList<>(l.size());
194+
for (Object vv : l) {
195+
vv = processSensitiveData(vv);
196+
result.add(vv);
197+
}
198+
return (T) result;
199+
} else if (v instanceof Map m) {
200+
Map<String, Object> result = new HashMap<>(m);
201+
result.replaceAll((k, vv) -> processSensitiveData(vv));
202+
return (T) result;
203+
}
204+
205+
return v;
206+
}
207+
173208
@SuppressWarnings("unchecked")
174209
private static Map<String, Object> ensureModifiable(Map<String, Object> m, int depth, String[] path) {
175210
if (depth == 0) {
@@ -217,7 +252,7 @@ private static Map<String, Object> convertInput(List<Object> input) {
217252
return result;
218253
}
219254

220-
private static List<Object> hideSensitiveData(List<Object> input, List<List<Annotation>> annotations) {
255+
private static List<Object> processSensitiveDataAnnotations(List<Object> input, List<List<Annotation>> annotations) {
221256
if (annotations.isEmpty()) {
222257
return input;
223258
}

runtime/v2/runner/src/test/java/com/walmartlabs/concord/runtime/v2/runner/remote/TaskCallEventRecordingListenerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void testMaskVars() throws Exception {
5151
"}";
5252

5353
List<String> blackList = Arrays.asList("b", "c.c1", "c.c3.c31");
54-
Map<String, Object> result = TaskCallEventRecordingListener.maskVars(vars(in), blackList);
54+
Map<String, Object> result = TaskCallEventRecordingListener.processVarBlacklist(vars(in), blackList);
5555

5656
String expected = "{" +
5757
" \"a\":1," +
@@ -76,7 +76,7 @@ public void testMaskVarsUnmodifiable() {
7676
Collections.singletonMap("z", 123)));
7777

7878
List<String> blackList = Collections.singletonList("x.y.z");
79-
Map<String, Object> result = TaskCallEventRecordingListener.maskVars(vars, blackList);
79+
Map<String, Object> result = TaskCallEventRecordingListener.processVarBlacklist(vars, blackList);
8080
assertEquals("{x={y={z=***}}}", result.toString());
8181
}
8282

0 commit comments

Comments
 (0)