From 9288f1ed3a88217cb01c117f5ffd4f253de9196c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=AD=A3=E8=B6=85?= Date: Sat, 9 May 2026 09:58:23 +0800 Subject: [PATCH] fix(targets): handle postgres dsn redaction scheme case (#2886) --- crates/targets/src/config/loader.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/targets/src/config/loader.rs b/crates/targets/src/config/loader.rs index e3568de7b..ae232f06f 100644 --- a/crates/targets/src/config/loader.rs +++ b/crates/targets/src/config/loader.rs @@ -45,12 +45,15 @@ fn redact_target_field_value(field_name: &str, value: &str) -> String { if value.is_empty() { return value.to_string(); } - // MySQL DSN fields need partial redaction instead of full masking so the - // remaining connection details (host, port, database) remain visible in - // debug logs while the password is hidden. + // Shared DSN fields need target-specific partial redaction so connection + // details stay visible in debug logs while passwords remain hidden. if field_name == rustfs_config::BASE_DSN_STRING { let trimmed = value.trim_start(); - if trimmed.starts_with("postgres://") || trimmed.starts_with("postgresql://") { + if ["postgres://", "postgresql://"].iter().any(|prefix| { + trimmed + .get(..prefix.len()) + .is_some_and(|candidate| candidate.eq_ignore_ascii_case(prefix)) + }) { return crate::target::postgres::redact_postgres_dsn(value); } return crate::target::mysql::redact_mysql_dsn(value); @@ -346,6 +349,14 @@ mod tests { assert_eq!(redact_target_field_value(rustfs_config::POSTGRES_DSN_STRING, ""), ""); } + #[test] + fn redact_postgres_dsn_string_handles_case_insensitive_scheme() { + let dsn = "POSTGRES://rustfs:secret123@pg.example.com:5432/rustfs_events?search_path=public"; + let redacted = redact_target_field_value(rustfs_config::POSTGRES_DSN_STRING, dsn); + + assert_eq!(redacted, "postgres://rustfs:***@pg.example.com:5432/rustfs_events?search_path=public"); + } + #[test] fn redacted_target_config_masks_sensitive_values_without_mutating_shape() { let mut config = KVS::new();