Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix @sensitive handling in Display implementations on error shapes #1802

Merged
merged 12 commits into from
Oct 7, 2022
8 changes: 7 additions & 1 deletion CHANGELOG.next.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ references = ["smithy-rs#1803"]
meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server"}
author = "LukeMathWalker"

[[smithy-rs]]
message = "Sensitive fields in errors now respect @sensitive trait and are properly redacted."
references = ["smithy-rs#1802"]
meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "all" }
author = "jjant"

[[smithy-rs]]
message = "Pokémon Service example code now runs clippy during build."
references = ["smithy-rs#1727"]
Expand Down Expand Up @@ -117,7 +123,7 @@ author = "jdisanti"
[[smithy-rs]]
message = "Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`."
references = ["aws-sdk-rust#620", "smithy-rs#1748"]
meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client"}
meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" }
author = "jdisanti"

[[aws-sdk-rust]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ open class StructureGenerator(
fun render(forWhom: CodegenTarget = CodegenTarget.CLIENT) {
renderStructure()
errorTrait?.also { errorTrait ->
ErrorGenerator(symbolProvider, writer, shape, errorTrait).render(forWhom)
ErrorGenerator(model, symbolProvider, writer, shape, errorTrait).render(forWhom)
}
}

Expand Down Expand Up @@ -109,6 +109,7 @@ open class StructureGenerator(
members.forEach { member ->
val memberName = symbolProvider.toMemberName(member)
val fieldValue = member.redactIfNecessary(model, "self.$memberName")

rust(
"formatter.field(${memberName.dq()}, &$fieldValue);",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package software.amazon.smithy.rust.codegen.core.smithy.generators.error

import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.StructureShape
import software.amazon.smithy.model.traits.ErrorTrait
import software.amazon.smithy.model.traits.RetryableTrait
Expand All @@ -19,10 +20,12 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.StdError
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.smithy.isOptional
import software.amazon.smithy.rust.codegen.core.util.REDACTION
import software.amazon.smithy.rust.codegen.core.util.dq
import software.amazon.smithy.rust.codegen.core.util.errorMessageMember
import software.amazon.smithy.rust.codegen.core.util.getTrait
import software.amazon.smithy.rust.codegen.core.util.letIf
import software.amazon.smithy.rust.codegen.core.util.shouldRedact

sealed class ErrorKind {
abstract fun writable(runtimeConfig: RuntimeConfig): Writable
Expand Down Expand Up @@ -60,6 +63,7 @@ fun StructureShape.modeledRetryKind(errorTrait: ErrorTrait): ErrorKind? {
}

class ErrorGenerator(
private val model: Model,
private val symbolProvider: RustSymbolProvider,
private val writer: RustWriter,
private val shape: StructureShape,
Expand Down Expand Up @@ -118,8 +122,12 @@ class ErrorGenerator(
}
write("write!(f, ${errorDesc.dq()})?;")
messageShape?.let {
ifSet(it, symbolProvider.toSymbol(it), "&self.message") { field ->
write("""write!(f, ": {}", $field)?;""")
if (it.shouldRedact(model)) {
write("""write!(f, ": {}", $REDACTION)?;""")
} else {
ifSet(it, symbolProvider.toSymbol(it), "&self.message") { field ->
write("""write!(f, ": {}", $field)?;""")
}
}
}
write("Ok(())")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,19 @@ fun ServiceShape.hasEventStreamOperations(model: Model): Boolean = operations.an
model.expectShape(id, OperationShape::class.java).isEventStream(model)
}

fun Shape.redactIfNecessary(model: Model, safeToPrint: String): String =
fun Shape.shouldRedact(model: Model): Boolean =
when (this) {
is MemberShape -> model.expectShape(this.target).redactIfNecessary(model, safeToPrint)
else -> if (this.hasTrait<SensitiveTrait>()) {
"*** Sensitive Data Redacted ***".dq()
} else {
safeToPrint
}
is MemberShape -> model.expectShape(this.target).shouldRedact(model)
else -> this.hasTrait<SensitiveTrait>()
}

const val REDACTION = "\"*** Sensitive Data Redacted ***\""

fun Shape.redactIfNecessary(model: Model, safeToPrint: String): String =
if (this.shouldRedact(model)) {
REDACTION
} else {
safeToPrint
}

/*
Expand Down