Skip to content

Commit 2652698

Browse files
authored
fix: correctly redact sensitive data in lists/maps (#1122)
1 parent 34acdc7 commit 2652698

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "30110eeb-0708-45b6-973f-960dc6062ce6",
3+
"type": "bugfix",
4+
"description": "Correctly redact sensitive data in lists and maps"
5+
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/StructureGenerator.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ import software.amazon.smithy.kotlin.codegen.core.*
1010
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
1111
import software.amazon.smithy.kotlin.codegen.model.*
1212
import software.amazon.smithy.kotlin.codegen.rendering.serde.ClientErrorCorrection
13+
import software.amazon.smithy.model.Model
1314
import software.amazon.smithy.model.shapes.*
1415
import software.amazon.smithy.model.traits.*
1516

17+
private const val REDACTED_VALUE = "*** Sensitive Data Redacted ***"
18+
1619
/**
1720
* Renders Smithy structure shapes
1821
*/
@@ -105,18 +108,15 @@ class StructureGenerator(
105108
write("append(\"#T(\")", symbol)
106109

107110
when {
108-
shape.hasTrait<SensitiveTrait>() -> write("append(#S)", "*** Sensitive Data Redacted ***")
111+
shape.isSensitive(model) -> write("append(#S)", REDACTED_VALUE)
109112
else -> {
110113
sortedMembers.forEachIndexed { index, memberShape ->
111114
val (memberName, _) = memberNameSymbolIndex[memberShape]!!
115+
val isSensitive = memberShape.isSensitive(model)
116+
val value = if (isSensitive) REDACTED_VALUE else "\$$memberName"
112117
val separator = if (index < sortedMembers.size - 1) "," else ""
113118

114-
val targetShape = model.expectShape(memberShape.target)
115-
if (targetShape.hasTrait<SensitiveTrait>()) {
116-
write("append(\"#1L=*** Sensitive Data Redacted ***$separator\")", memberName)
117-
} else {
118-
write("append(\"#1L=\$#2L$separator\")", memberShape.defaultName(), memberName)
119-
}
119+
write("append(\"#L=#L#L\")", memberShape.defaultName(), value, separator)
120120
}
121121
}
122122
}
@@ -385,3 +385,11 @@ class StructureGenerator(
385385
if (hasConflictWithBaseClass) throw CodegenException("`sdkErrorMetadata` conflicts with property of same name inherited from SdkBaseException. Apply a rename customization/projection to fix.")
386386
}
387387
}
388+
389+
private fun Shape.isSensitive(model: Model): Boolean = when {
390+
this is MemberShape -> model.expectShape(target).isSensitive(model)
391+
hasTrait<SensitiveTrait>() -> true
392+
this is ListShape -> member.isSensitive(model)
393+
this is MapShape -> key.isSensitive(model) || value.isSensitive(model)
394+
else -> false
395+
}

codegen/smithy-kotlin-codegen/src/test/kotlin/software/amazon/smithy/kotlin/codegen/rendering/StructureGeneratorTest.kt

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,38 @@ class StructureGeneratorTest {
285285
@sensitive
286286
string Baz
287287
288+
list BazList {
289+
member: Baz
290+
}
291+
292+
map BazToStringMap {
293+
key: Baz
294+
value: String
295+
}
296+
297+
map StringToBazMap {
298+
key: String
299+
value: Baz
300+
}
301+
302+
map StringToBazList {
303+
key: String
304+
value: BazList
305+
}
306+
307+
list StringToBazListList {
308+
member: StringToBazList
309+
}
310+
288311
structure Foo {
289312
bar: Baz,
290-
@documentation("Member documentation")
291313
baz: Baz,
292-
qux: String
314+
qux: String,
315+
quux: BazList,
316+
corge: BazToStringMap,
317+
grault: StringToBazMap,
318+
garply: StringToBazList,
319+
waldo: StringToBazListList,
293320
}
294321
295322
""".prependNamespaceAndService().toSmithyModel()
@@ -306,7 +333,12 @@ class StructureGeneratorTest {
306333
append("Foo(")
307334
append("bar=*** Sensitive Data Redacted ***,")
308335
append("baz=*** Sensitive Data Redacted ***,")
309-
append("qux=${'$'}qux")
336+
append("corge=*** Sensitive Data Redacted ***,")
337+
append("garply=*** Sensitive Data Redacted ***,")
338+
append("grault=*** Sensitive Data Redacted ***,")
339+
append("quux=*** Sensitive Data Redacted ***,")
340+
append("qux=${'$'}qux,")
341+
append("waldo=*** Sensitive Data Redacted ***")
310342
append(")")
311343
}
312344
""".formatForTest()

0 commit comments

Comments
 (0)