diff options
author | Asher Gomez <ashersaupingomez@gmail.com> | 2024-08-14 18:53:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-14 18:53:15 +0200 |
commit | f89b5311492377a3ac18d756dc8c8a309e2c9e8a (patch) | |
tree | 68fc92eb556eb72cf75d4f3dd8ff424e283853c2 /cli/npm | |
parent | 1f2d48cd975b719f0248e471f3b503cb01398dfb (diff) |
feat(node): support `username` and `_password` in `.npmrc` file (#24793)
Closes #23950
Diffstat (limited to 'cli/npm')
-rw-r--r-- | cli/npm/common.rs | 41 | ||||
-rw-r--r-- | cli/npm/managed/cache/registry_info.rs | 8 | ||||
-rw-r--r-- | cli/npm/managed/cache/tarball.rs | 2 |
3 files changed, 43 insertions, 8 deletions
diff --git a/cli/npm/common.rs b/cli/npm/common.rs index 34835216c..a3a828e74 100644 --- a/cli/npm/common.rs +++ b/cli/npm/common.rs @@ -1,25 +1,54 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +use base64::prelude::BASE64_STANDARD; +use base64::Engine; +use deno_core::anyhow::bail; +use deno_core::error::AnyError; use deno_npm::npm_rc::RegistryConfig; use http::header; // TODO(bartlomieju): support more auth methods besides token and basic auth pub fn maybe_auth_header_for_npm_registry( registry_config: &RegistryConfig, -) -> Option<(header::HeaderName, header::HeaderValue)> { +) -> Result<Option<(header::HeaderName, header::HeaderValue)>, AnyError> { if let Some(token) = registry_config.auth_token.as_ref() { - return Some(( + return Ok(Some(( header::AUTHORIZATION, header::HeaderValue::from_str(&format!("Bearer {}", token)).unwrap(), - )); + ))); } if let Some(auth) = registry_config.auth.as_ref() { - return Some(( + return Ok(Some(( header::AUTHORIZATION, header::HeaderValue::from_str(&format!("Basic {}", auth)).unwrap(), - )); + ))); } - None + let (username, password) = ( + registry_config.username.as_ref(), + registry_config.password.as_ref(), + ); + if (username.is_some() && password.is_none()) + || (username.is_none() && password.is_some()) + { + bail!("Both the username and password must be provided for basic auth") + } + + if username.is_some() && password.is_some() { + return Ok(Some(( + header::AUTHORIZATION, + header::HeaderValue::from_str(&format!( + "Basic {}", + BASE64_STANDARD.encode(&format!( + "{}:{}", + username.unwrap(), + password.unwrap() + )) + )) + .unwrap(), + ))); + } + + Ok(None) } diff --git a/cli/npm/managed/cache/registry_info.rs b/cli/npm/managed/cache/registry_info.rs index d7675a34f..28b19373e 100644 --- a/cli/npm/managed/cache/registry_info.rs +++ b/cli/npm/managed/cache/registry_info.rs @@ -192,7 +192,13 @@ impl RegistryInfoDownloader { let downloader = self.clone(); let package_url = self.get_package_url(name); let registry_config = self.npmrc.get_registry_config(name); - let maybe_auth_header = maybe_auth_header_for_npm_registry(registry_config); + let maybe_auth_header = + match maybe_auth_header_for_npm_registry(registry_config) { + Ok(maybe_auth_header) => maybe_auth_header, + Err(err) => { + return std::future::ready(Err(Arc::new(err))).boxed_local() + } + }; let guard = self.progress_bar.update(package_url.as_str()); let name = name.to_string(); async move { diff --git a/cli/npm/managed/cache/tarball.rs b/cli/npm/managed/cache/tarball.rs index eec890bed..4bcee38ea 100644 --- a/cli/npm/managed/cache/tarball.rs +++ b/cli/npm/managed/cache/tarball.rs @@ -167,7 +167,7 @@ impl TarballCache { let tarball_uri = Url::parse(&dist.tarball)?; let maybe_registry_config = tarball_cache.npmrc.tarball_config(&tarball_uri); - let maybe_auth_header = maybe_registry_config.and_then(|c| maybe_auth_header_for_npm_registry(c)); + let maybe_auth_header = maybe_registry_config.and_then(|c| maybe_auth_header_for_npm_registry(c).ok()?); let guard = tarball_cache.progress_bar.update(&dist.tarball); let result = tarball_cache.http_client_provider |