aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Cline <github@declined.dev>2024-05-20 22:25:17 -0400
committerGitHub <noreply@github.com>2024-05-21 09:25:17 +0700
commit32930846e6bd1a2111742f8e19067c9fe9b3b3c1 (patch)
tree8d3067643303aa0de28f6c20d565b623404d24c8
parentfix: save sync time in daemon (#2029) (diff)
downloadatuin-32930846e6bd1a2111742f8e19067c9fe9b3b3c1.zip
fix: redact password in database URI when logging (#2032)
Previously, in the event that there was a configuration issue and the atuin server failed to connect to PostgreSQL, it would log the password. For example, if the password authentication failed the following log message would be printed: Error: failed to connect to db: PostgresSettings { db_uri: "postgres://atuin:definitelymypassword@db.example.com/atuin" } This change sets the password to "****" when printing it via Debug: Error: failed to connect to db: PostgresSettings { db_uri: "postgres://atuin:****@db.example.com/atuin" } Hopefully few people use **** as the actual password.
-rw-r--r--Cargo.lock1
-rw-r--r--crates/atuin-server-postgres/Cargo.toml1
-rw-r--r--crates/atuin-server-postgres/src/lib.rs18
3 files changed, 19 insertions, 1 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 111052c6..a637e562 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -442,6 +442,7 @@ dependencies = [
"sqlx",
"time",
"tracing",
+ "url",
"uuid",
]
diff --git a/crates/atuin-server-postgres/Cargo.toml b/crates/atuin-server-postgres/Cargo.toml
index 647d934a..2345b39d 100644
--- a/crates/atuin-server-postgres/Cargo.toml
+++ b/crates/atuin-server-postgres/Cargo.toml
@@ -21,3 +21,4 @@ sqlx = { workspace = true }
async-trait = { workspace = true }
uuid = { workspace = true }
futures-util = "0.3"
+url = "2.5.0"
diff --git a/crates/atuin-server-postgres/src/lib.rs b/crates/atuin-server-postgres/src/lib.rs
index 6dc56fe4..8a010195 100644
--- a/crates/atuin-server-postgres/src/lib.rs
+++ b/crates/atuin-server-postgres/src/lib.rs
@@ -1,3 +1,4 @@
+use std::fmt::Debug;
use std::ops::Range;
use async_trait::async_trait;
@@ -23,11 +24,26 @@ pub struct Postgres {
pool: sqlx::Pool<sqlx::postgres::Postgres>,
}
-#[derive(Clone, Debug, Deserialize, Serialize)]
+#[derive(Clone, Deserialize, Serialize)]
pub struct PostgresSettings {
pub db_uri: String,
}
+// Do our best to redact passwords so they're not logged in the event of an error.
+impl Debug for PostgresSettings {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let redacted_uri = url::Url::parse(&self.db_uri)
+ .map(|mut url| {
+ let _ = url.set_password(Some("****"));
+ url.to_string()
+ })
+ .unwrap_or(self.db_uri.clone());
+ f.debug_struct("PostgresSettings")
+ .field("db_uri", &redacted_uri)
+ .finish()
+ }
+}
+
fn fix_error(error: sqlx::Error) -> DbError {
match error {
sqlx::Error::RowNotFound => DbError::NotFound,