diff --git a/proxy/src/auth/backend/mod.rs b/proxy/src/auth/backend/mod.rs index 83feed5094..6e5c0a3954 100644 --- a/proxy/src/auth/backend/mod.rs +++ b/proxy/src/auth/backend/mod.rs @@ -80,10 +80,22 @@ impl std::fmt::Display for Backend<'_, ()> { .field(&endpoint.url()) .finish(), #[cfg(any(test, feature = "testing"))] - ControlPlaneClient::PostgresMock(endpoint) => fmt - .debug_tuple("ControlPlane::PostgresMock") - .field(&endpoint.url()) - .finish(), + ControlPlaneClient::PostgresMock(endpoint) => { + let url = endpoint.url(); + match url::Url::parse(url) { + Ok(mut url) => { + let _ = url.set_password(Some("_redacted_")); + let url = url.as_str(); + fmt.debug_tuple("ControlPlane::PostgresMock") + .field(&url) + .finish() + } + Err(_) => fmt + .debug_tuple("ControlPlane::PostgresMock") + .field(&url) + .finish(), + } + } #[cfg(test)] ControlPlaneClient::Test(_) => fmt.debug_tuple("ControlPlane::Test").finish(), }, diff --git a/proxy/src/binary/proxy.rs b/proxy/src/binary/proxy.rs index f40d5041c1..5f24940985 100644 --- a/proxy/src/binary/proxy.rs +++ b/proxy/src/binary/proxy.rs @@ -1,9 +1,13 @@ +#[cfg(any(test, feature = "testing"))] +use std::env; use std::net::SocketAddr; use std::path::PathBuf; use std::pin::pin; use std::sync::Arc; use std::time::Duration; +#[cfg(any(test, feature = "testing"))] +use anyhow::Context; use anyhow::{bail, ensure}; use arc_swap::ArcSwapOption; use futures::future::Either; @@ -35,6 +39,8 @@ use crate::scram::threadpool::ThreadPool; use crate::serverless::GlobalConnPoolOptions; use crate::serverless::cancel_set::CancelSet; use crate::tls::client_config::compute_client_config_with_root_certs; +#[cfg(any(test, feature = "testing"))] +use crate::url::ApiUrl; use crate::{auth, control_plane, http, serverless, usage_metrics}; project_git_version!(GIT_VERSION); @@ -777,7 +783,13 @@ fn build_auth_backend( #[cfg(any(test, feature = "testing"))] AuthBackendType::Postgres => { - let url = args.auth_endpoint.parse()?; + let mut url: ApiUrl = args.auth_endpoint.parse()?; + if url.password().is_none() { + let password = env::var("PGPASSWORD") + .with_context(|| "auth-endpoint does not contain a password and environment variable `PGPASSWORD` is not set")?; + url.set_password(Some(&password)) + .expect("Failed to set password"); + } let api = control_plane::client::mock::MockControlPlane::new( url, !args.is_private_access_proxy, diff --git a/proxy/src/url.rs b/proxy/src/url.rs index 270cd7c24d..7dce36be2f 100644 --- a/proxy/src/url.rs +++ b/proxy/src/url.rs @@ -43,6 +43,12 @@ impl std::ops::Deref for ApiUrl { } } +impl std::ops::DerefMut for ApiUrl { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + impl std::fmt::Display for ApiUrl { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.0.fmt(f)