Skip to content

Commit 8d58e6b

Browse files
committed
fix: Preserve repeated form field shape when scrubbing
1 parent 9541dbe commit 8d58e6b

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

Sources/Swift/DataCollection/SentryDataCollection+KeyValueFilter.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ extension SentryDataCollection {
1111

1212
static func filterSensitiveValues(_ values: [String: Any]) -> [String: Any] {
1313
values.reduce(into: [:]) { result, pair in
14-
result[pair.key] = matches(key: pair.key, terms: sensitiveTerms)
15-
? filteredValue
16-
: pair.value
14+
guard matches(key: pair.key, terms: sensitiveTerms) else {
15+
result[pair.key] = pair.value
16+
return
17+
}
18+
result[pair.key] = (pair.value as? [Any])?.map { _ in filteredValue } ?? filteredValue
1719
}
1820
}
1921

Tests/SentryTests/Networking/SentryReplayNetworkDetailsBodyTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,23 @@ class SentryReplayNetworkDetailsBodyTests: XCTestCase {
291291
XCTAssertEqual(dict["color"] as? [String], ["red", "blue", "green"])
292292
}
293293

294+
func testInit_whenV10FormHasDuplicateSensitiveKeys_shouldFilterEveryValue() throws {
295+
#if !SDK_V10
296+
throw XCTSkip("Test skipped for SDK_V10")
297+
#else
298+
// -- Act --
299+
let body = try XCTUnwrap(Body(
300+
data: Data("token=first&token=second&name=Jane".utf8),
301+
contentType: "application/x-www-form-urlencoded"
302+
))
303+
304+
// -- Assert --
305+
let values = try XCTUnwrap(body.serialize()["body"] as? [String: Any])
306+
XCTAssertEqual(values["token"] as? [String], ["[Filtered]", "[Filtered]"])
307+
XCTAssertEqual(values["name"] as? String, "Jane")
308+
#endif
309+
}
310+
294311
func testInit_withFormURLEncoded_emptyValue_shouldParseAsEmptyString() throws {
295312
// -- Act --
296313
let body = try XCTUnwrap(Body(

0 commit comments

Comments
 (0)