summaryrefslogtreecommitdiff
path: root/cli/npm/common.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/common.rs')
-rw-r--r--cli/npm/common.rs41
1 files changed, 35 insertions, 6 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)
}