From 2752de24bba0ca4e503e92bb9a37d8233102ebc3 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 29 Apr 2026 13:43:17 -0500 Subject: [PATCH] Redact remote requirements URL in offline errors --- crates/uv-requirements-txt/src/lib.rs | 22 ++++++++++------------ crates/uv/tests/it/run.rs | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/crates/uv-requirements-txt/src/lib.rs b/crates/uv-requirements-txt/src/lib.rs index 19b5952d5e1..64956e76cab 100644 --- a/crates/uv-requirements-txt/src/lib.rs +++ b/crates/uv-requirements-txt/src/lib.rs @@ -275,6 +275,15 @@ impl RequirementsTxt { #[cfg(feature = "http")] { + let url = requirements_txt.display().to_string(); + let url = DisplaySafeUrl::parse(&url).map_err(|err| RequirementsTxtFileError { + file: requirements_txt.to_path_buf(), + error: RequirementsTxtParserError::InvalidUrl( + requirements_txt.display().to_string(), + err, + ), + })?; + // Avoid constructing a client if network is disabled already if client_builder.is_offline() { return Err(RequirementsTxtFileError { @@ -282,22 +291,11 @@ impl RequirementsTxt { error: RequirementsTxtParserError::Io(io::Error::new( io::ErrorKind::InvalidInput, format!( - "Network connectivity is disabled, but a remote requirements file was requested: {}", - requirements_txt.display() + "Network connectivity is disabled, but a remote requirements file was requested: {url}" ), )), }); } - - let url = DisplaySafeUrl::parse(&requirements_txt.display().to_string()).map_err( - |err| RequirementsTxtFileError { - file: requirements_txt.to_path_buf(), - error: RequirementsTxtParserError::InvalidUrl( - requirements_txt.display().to_string(), - err, - ), - }, - )?; let client = client_builder .build() .map_err(|err| RequirementsTxtFileError { diff --git a/crates/uv/tests/it/run.rs b/crates/uv/tests/it/run.rs index ab32aa02803..3f24de31d37 100644 --- a/crates/uv/tests/it/run.rs +++ b/crates/uv/tests/it/run.rs @@ -4799,6 +4799,29 @@ fn run_remote_pep723_script() { "); } +#[test] +fn run_remote_requirements_offline_redacts_credentials() -> Result<()> { + let context = uv_test::test_context!("3.12"); + + let script = context.temp_dir.child("main.py"); + script.write_str("print('hello')")?; + + uv_snapshot!(context.filters(), context.run() + .arg("--offline") + .arg("--with-requirements") + .arg("http://username:password@example.com/requirements.txt") + .arg(script.as_os_str()), @" + success: false + exit_code: 2 + ----- stdout ----- + + ----- stderr ----- + error: Network connectivity is disabled, but a remote requirements file was requested: http://username:****@example.com/requirements.txt + "); + + Ok(()) +} + #[cfg(unix)] // A URL could be a valid filepath on Unix but not on Windows #[test] fn run_url_like_with_local_file_priority() -> Result<()> {